web-dev-qa-db-ja.com

WP_Query:category__inとtag__inを混在させる

wpbeginner.com からのチュートリアルに基づいて、私のテーマのための "Related posts"セクションを作成しています。投稿を選択する際に、category__inを使用して同じカテゴリに属する​​ものと、tag__inを使用して同じタグを持つものの2つの選択肢がありました。

もしそうなら、それらを一つの大きなミキシングポットに入れて、それらすべてから投稿を選択することは可能ですか?同じカテゴリと同じタグを持つものではなく、またはのどちらかを持つものを意味します。

1
Nate

はい、それは可能です。 Taxonomies はすべて、wp_term_taxonomyテーブルのdbに格納されています。以下はすべて分類法としてリストされています

  • カテゴリー

  • post_tag

  • link_category

  • post_formatと

  • カスタム分類法

これらの分類法に属するすべての用語はwp_termsテーブルに格納されています。タグはpost_tag分類法の用語であり、投稿メニュー画面の「カテゴリ」の下に作成したすべての「カテゴリ」は実際には分類法の用語ですcategory

これにより、さまざまな分類法や用語を1つのクエリにまとめることが簡単になります。これを実現するには、 WP_Query の分類パラメーターを使用して、カスタムのtax_queryを実行します。

それではまず、投稿に属するすべてのカテゴリとタグのリストを取得する必要があります。カテゴリには get_the_category を使い、タグには get_the_tags を使います。あなたはそれをあなたのカスタムクエリで使うつもりの配列として返すつもりです。

global $post;
//get the categories a post belongs to          
$cats = get_the_category($post->ID);

$cat_array = array();
    foreach($cats as $key1 => $cat) {
        $cat_array[$key1] = $cat->slug;
    }

//get the categories a post belongs to      
$tags = get_the_tags($post->ID);

$tag_array = array();
    foreach($tags as $key2 => $tag) {
        $tag_array[$key2] = $tag->slug;
    }

これがカスタムクエリーの引数です。私が提供したWP_queryへのリンクで分類パラメータを調べてみることができます。また、WP_queryに置き換えられたcaller_get_postsのように、このチュートリアルの一部のパラメーターは昔から非推奨になっているので、ignore_sticky_postsで使用できるすべてのパラメーターも調べてみてください

$args = array(
    'posts_per_page' => 5,
    'orderby' => 'Rand',
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => $cat_array,
            'include_children' => false 
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $tag_array,
        )
    )
);

$the_query = new WP_Query( $args );

あなたはコードをいじって行き、望むように修正することができます。

1
Pieter Goosen