web-dev-qa-db-ja.com

現在のクエリですべての投稿に添付されているすべての用語のリストを取得する

現在のクエリ内のすべての投稿に添付されているすべての用語のリストを取得するには、wp_get_object_terms()を使用するにはどうすればよいですか。

たとえば、現在のクエリで、クエリされたすべての投稿に含まれている「アルファ」分類法からの用語の配列を取得します。

wp_get_object_terms($wp_query, 'alfa');

しかし、それは配列内の1つの項目を返すだけのようです...

私はナビゲーションメニューのためにある分類法を別の分類法とクロスチェックするための配列を構築するためにこれをしています、そして現在これを次のコードでしています、しかし私はもっと良い方法があるべきです。

助けてください!ありがとうございます。

$queried_terms = array();
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
    $postid = $post->ID; 

    if( has_term( '', 'alfa', $postid) ) {
        $terms = get_the_terms( $postid, 'alfa' );
        foreach($terms as $term) {
            $queried_terms[] = $term->slug;
        }
    }

endwhile; endif;
rewind_posts();
wp_reset_query();

$queried_terms = array_unique($queried_terms);
4
j-man86

wp_get_object_terms()は最初の引数にIDの配列を取ることができるので、あなたは正しい軌道に乗っていると思います。$ wp_queryがあなたが望む配列ではないということです。

私がこれがより効率的であることを保証することはできません(私の専門分野ではありません)が、この[部分的にテストされた]スニペットは少なくとも1つ少ないループとarray_unique()であなたが望むことをするでしょう

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// make array for the post IDs
$my_post_ids = array();
// loop through posts array for IDs
foreach( $my_posts as $my_post ) {
    $my_post_ids[] = $my_post->ID;
}
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

wp_get_object_terms()は3番目の$argsパラメータを取ります。あなたが望む出力を得るためにあなたが設定する必要があるかもしれません、しかし私はあなたに任せます。

更新:これはnew-to-me関数 wp_list_pluck() を使用してさらに短くすることができます。これもテストされていませんが、正しく見えます。

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// NEW: make array of the post IDs in one step
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

あなたは ソースで これが同じforeachループコードを走らせるのを見ることができます、しかし、それは少し良く見えます。

3
mrwweb

上記のこの一般化は私のために働きました:

$args = array( 'cat' = -1 ); // e.g. to get list of posts in any category
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // your taxonomy name
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // distinct term names

これは、 'mytax'カスタム分類法の用語の固有のリストを出力します。ありがとう@mrwweb :-)

2
Jon