web-dev-qa-db-ja.com

tax_queryを指定したpre_get_postsで空の結果が生じる

以下の方法で、すべてのアーカイブページのメインループを調整する必要があります。カスタム分類法 "myposttypes"を登録しました。すべての投稿は、厳密に1つの "myposttype"という用語に割り当てられています。

カテゴリまたはタグのアーカイブページの場合は、 "myposttypes-> term1"の投稿のみをクエリ結果に含める必要があります。

カスタム分類アーカイブページの場合は、 "myposttypes-> term2"の投稿のみをクエリ結果に含める必要があります。

対応するpre_get_postsフックを既に実装していますが、 アーカイブページすべてに対して結果がまったく得られません。 私は自分のブログインスタンスに対応する分類法を含む投稿をたくさん持っているので結果があるはずです。

これが私のアプローチです:

function wpmw_adjust_archive_queries( $query ) {
    if ( ! is_admin() && is_archive() && $query->is_main_query() ) {
        if ( is_category() || is_tag() ) $term_slug  = 'term1';
        if ( is_tax( 'beitragsarten', 'news' ) ) $term_slug = 'term2';

        $taxquery = array(
            'tax_query' => array(
                array(
                    'taxonomy' => 'myposttypes',
                    'field'    => 'slug',
                    'terms'    => $term_slug
                ),
            ),
        );

        $query->set( 'tax_query', $taxquery );
    }
}

add_action( 'pre_get_posts', 'wpmw_adjust_archive_queries' );

更新: これは私の調整された単純化されたアプローチですが、残念ながらまだうまくいきません。空の結果が出ます。 $ queryをvar_dumpし、tax_queryがquery_varsに正しく追加されたようです。

function wpmw_adjust_archive_queries( $query ) {
    if ( ! is_admin() && $query->is_archive() && $query->is_main_query() ) {

        $tax_query = $query->get( 'tax_query' ) ? : array();

        $tax_query[] = array(
            'taxonomy' => 'myposttypes',
            'field'    => 'slug',
            'terms'    => array( 'term1' ),
            'operator' => 'IN'
        );

        $query->set( 'tax_query', $tax_query );
    }
}

add_action( 'pre_get_posts', 'wpmw_adjust_archive_queries' );

これは$ queryの対応する部分です

[tax_query] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => myposttypes
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => term1
                                )

                            [operator] => IN
                        )

                )
4
EmWe

tax_queryを間違って使用しています。 Codex Page /をご覧ください。

tax_queryは、次のものを含むことができる配列です。

  • relation - 文字列であるべきです(AND/OR)
  • 分類学用語 - 定義済みの分類学、分野、用語などを含む配列。

あなたのコードであなたの設定tax_queryを:

$taxquery = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'myposttypes',
            'field'    => 'slug',
            'terms'    => $term_slug
        ),
     ),
);

そしてそれはなるはずです:

$taxquery = array(
    array(
        'taxonomy' => 'myposttypes',
        'field'    => 'slug',
        'terms'    => $term_slug
    ),
);

post_typeは別のパラメータなので、tax_query内に設定することはできません。

tax_queryを変更した場合でも、注意が必要です。すでに値が設定されている可能性があります。あなたがそれを尊重したいのであれば、あなたはこのようなものを使うべきです:

$tax_query = $query->get( 'tax_query' );
if ( ! is_array( $tax_query ) ) {
    $tax_query = array();
}
$taxquery[] = array(
    'taxonomy' => 'myposttypes',
    'field'    => 'slug',
    'terms'    => $term_slug
);
$query->set( 'tax_query', $taxquery );

このようにして、既存のクエリに税クエリを追加し、それらを上書きしません。

2