web-dev-qa-db-ja.com

カスタム投稿タイプのページで分類法でフィルタするにはどうすればよいですか。

現在、以下に示すように、現在表示されている投稿タイプに関連カテゴリを出力しています。私はwp_list_categoriesを使ってカテゴリをリストアップしていますが、それはうまく機能します。唯一の問題は、これがarchive.phpに表示され、単一の投稿ではないということです。そのため、リストに表示されている分類法は、主要分類法アーカイブにリンクしています。

現在の投稿タイプの分類法アーカイブ($type)にリンクし、その特定の分類法を表示するためのクエリを含めます。 http://example.com?post_type=foo&custom_tax=barへのリンクと同様

<? $type = get_post_type(); ?>
                <?php 

                $customPostTaxonomies = get_object_taxonomies($type);

                if(count($customPostTaxonomies) > 0)
                {
                echo '<h3>Browse By:</h3>';
                     foreach($customPostTaxonomies as $tax)
                     {
                         $args = array(
                              'orderby' => 'name',
                              'show_count' => 0,
                              'pad_counts' => 0,
                              'hierarchical' => 1,
                              'taxonomy' => $tax,
                              'title_li' => ''
                            );
                         $woah = get_taxonomy($tax);
                        echo '<ul>';
                        //var_dump($tax);
                        //var_dump($woah);
                        //print_r($woah);
                        echo '<h4>'.$woah->labels->name.'</h4>';
                        echo wp_list_categories( $args );
                        echo '</ul>';
                     }
                }

                ?>`
1
neoian

wp_list_categoriesget_term_linkを使用して用語リンクを検索します。

この関数には、返されるものを変更するために使用できるフィルタがあります。問題は、現在の投稿タイプをフィルタにフックする関数に渡す必要があることですが、グローバル変数はスコープに対して機能するはずです。

もちろん、すべてのwp_list_categories呼び出しの後にfilterを削除する必要があります。これは、get_term_linkのnexクラスを妨害しないためです。

だから、あなたのfunctions.phpに置く:

function convert_term_link_to_post_type( $termlink, $term, $taxonomy ) {
  global $the_current_type;
  if ( empty($the_current_type) ) return $termlink;
  $link = get_post_type_archive_link( $the_current_type );
  if ( $taxonomy == 'category') $taxonomy = "category_name";
  if ( $link ) return add_query_arg( array($taxonomy => $term->slug), $link );
  return $termlink;
}

その後、あなたが投稿したコードを以下のように変更します。

$type = get_post_type();
$customPostTaxonomies = get_object_taxonomies($type);
if( count($customPostTaxonomies) > 0) {
  echo '<h3>Browse By:</h3>';
  // set the global variable
  global $the_current_type;
  $the_current_type = $type;
  // add the filter that convert the term link
  add_filter('term_link', 'convert_term_link_to_post_type', 20, 3);
  foreach($customPostTaxonomies as $tax) {
    $woah = get_taxonomy($tax);
    $args = array(
      'orderby' => 'name',
      'show_count' => 0,
      'pad_counts' => 0,
      'hierarchical' => 1,
      'taxonomy' => $tax,
      'title_li' => ''
    );
    echo '<ul>';
    echo '<h4>' . $woah->labels->name . '</h4>';
    echo wp_list_categories( $args );
    echo '</ul>';
  }
  // unset the global variable
  unset($the_current_type);
  // remove the filter to not alter any other 'get_term_link' calls
  remove_filter('term_link', 'convert_term_link_to_post_type', 20, 3);
}
2
gmazzap