web-dev-qa-db-ja.com

Single.phpで現在オンになっているカスタム投稿タイプimの用語名のリストを取得する方法

さて、私は "Products"というカスタム投稿タイプと "Types"というカスタム分類法を持っています。現在、タイプ分類では、カスタム投稿タイプに割り当てられた数十のカテゴリとサブカテゴリがあります。

カスタムポストタイプ商品:Blue Car

車に割り当てられているカテゴリ:ホンダ>アコード> LX

だから私が達成しようとしているのは私が "Blue Car"のような特定のカスタム投稿タイプsingle.phpに行くときです。私はそのようにリストされた "Blue Car"に割り当てられたすべてのカテゴリーを見たいです。

カテゴリ:ホンダ、アコード、LX

私はget_terms_byget_termswp_list_categoriesを使ってみましたが、うまくいっていないようで、あるいはそれらのいくつかを正しく使っていないようです。これよりも良い方法があるのか​​、それとも別の方法があるのか​​を私に知らせてください。

<ul>
<?php

//get the current term
$current_term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );

//set the args for wp_list_categories
 $args = array(
  'child_of' => $current_term->term_id,
  'taxonomy' => 'types',
  'hide_empty' => 1,
  'order'      => 'ASC',
  'show_count'     => 1,
  'hierarchical' => true,
  'depth'  => 1,
  'title_li' => ''
    );
 wp_list_categories( $args );
?>
</ul>
1
Lucas Santos

SIDENOTE:この関数は、投稿が1つの分類にのみ属する場合でも使用できます。同じ階層内の2つ以上の分類法に属する投稿を持っている必要はありません。この機能を非常に柔軟にしました

次の条件が発生した場合、投稿のカテゴリリストまたは用語リストを表示することは常に問題です

  • 2つの異なる分類法に属する用語を含む投稿を持つ

  • 1つのテンプレートを使用して投稿を表示すると、複数の分類法に属する用語を持つ投稿があります

分類ごとに1つの関数を複製する必要がある状況になります。たとえば、投稿はmytax1mytax2の2つの分類法の用語に属します。用語リストを表示するには、以下を行う必要があります

echo get_the_term_list( $post->ID, 'mytax1' );
echo get_the_term_list( $post->ID, 'mytax2' );

次の投稿がデフォルトの分類categoryに属する場合、これは混乱になります

投稿に属するすべての分類法のすべての用語を表示する1つの関数を1つにまとめた関数を作成しました。この関数を使用して、分類法のビルドの分類法を表示できます(post_formatを除く)

関数の仕組みは次のとおりです。

1.)この関数は get_the_term_list() を使用して用語リストを表示するため、この関数はget_the_term_list()と同じ機能を使用します

2.)ループ内で使用する必要があります。この関数はループ外では機能しません

3.)投稿IDと分類名はデフォルトでget_the_term_list()関数に渡されます

4.)ここに引数のリストがあります

before(string)(オプション)先行テキスト

デフォルト:空の文字列

sep(文字列)(オプション)タグを区切る文字列

デフォルト:空の文字列

after(string)(オプション)末尾のテキスト

デフォルト:空の文字列

display_tax_name(bool)(オプション)分類名をリストの前に表示する必要があります。

デフォルト:false

taxonomy_sep(string)(オプション)用語リストから分類名を分離するために使用されるテキスト

デフォルト:'&colon; &nbsp; &nbsp;'

multi_tax_sep(string)(オプション)投稿に複数の分類法に属する用語がある場合、2つ以上の用語リストを区切るために使用されるテキスト

デフォルト:</br>

hierarchical(bool)(オプション)リストに階層的な分類(カテゴリなど)または非階層的な分類(投稿タグなど)を表示する必要があります

デフォルト:true

5.)引数は、配列または文字列として関数に渡すことができます

6.)PHP 5.4+が必要

これは動作します(文字列)

'display_tax_name=' . true .'&hierarchical=' . false . '&taxonomy_sep=' . html_entity_decode( '&raquo;&nbsp;&nbsp;' )

そして、これは動作します

$args = [
    'display_tax_name' => true,
    'hierarchical' => false,
    'taxonomy_sep' => html_entity_decode( '&raquo;&nbsp;&nbsp;' ) 
] 

関数

function get_taxonomies_terms_links( $args = '' ){
    global $post;

    $defaults = [
        'before'            => '', 
        'sep'               => '', 
        'after'             => '',
        'display_tax_name'  => false,
        'taxonomy_sep'      => '&colon; &nbsp; &nbsp;',
        'multi_tax_sep'     => '</br>',
        'hierarchical'      => true
    ];
    $args = wp_parse_args( $args, $defaults );

    $post_type = $post->post_type;
    $taxonomies = get_object_taxonomies( $post_type, 'objects' );

    $returned_list = [];
    foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
        if( $args['hierarchical'] == $taxonomy->hierarchical && has_term( '', $taxonomy_slug ) && 'post_format' != $taxonomy_slug ) {
            $term_list = get_the_term_list( $post->ID, $taxonomy_slug, $args['before'], $args['sep'], $args['after'] );

            if( true == $args['display_tax_name'] ){
                $returned_list[] = strtoupper($taxonomy_slug) . $args['taxonomy_sep'] . $term_list;
            }else{
                $returned_list[] = $term_list;
            }
        }
    }

    if( $returned_list ) {  
        $count =  count($returned_list); 
        if( 1 === $count ) {
            return implode( '', $returned_list );
        }else{
            $multi_list = [];
            foreach ( $returned_list as $key=>$value ) {
                if (array_key_exists($key + 1, $returned_list)) {
                    $multi_list[] = $value . $args['multi_tax_sep'];
                }else{
                    $multi_list[] = $value;
                }
            }
            return implode( '', $multi_list );
        }
    }
}

用語リストを表示するためのテンプレートでの使用例。 html_entity_decode() および character chart と組み合わせて、通常の読み取り文字またはHTMLエンティティを使用できます。

文字列としての引数

<span class="cat-links">
    <?php echo get_taxonomies_terms_links('sep=, &display_tax_name=' . true .'&taxonomy_sep=' . html_entity_decode( '&raquo;&nbsp;&nbsp;' ) ); ?>
</span>

配列としての引数

<span class="cat-links">
    <?php 
        echo get_taxonomies_terms_links(
            [
            'sep'               => ', ',
            'display_tax_name'  => true,
            'taxonomy_sep'      => html_entity_decode( '&raquo;&nbsp;&nbsp;' ) 
            ],
        );
    ?>
</span>
3
Pieter Goosen

あなたが試した機能は、サイト内に存在する、用語それ自身に対するものです。

探しているのは get_the_terms() です。これは特定の分類に割り当てられた用語を特定の投稿に割り当てます。

0
Rarst