web-dev-qa-db-ja.com

Post_tag付きのWP_Tax_Queryが機能しない

Pre_get_postsフックを使用して、特定の(複数の)タグが適用された投稿に制限することでユーザーが検索を絞り込めるようにしています。

これは私のフックと機能です:

add_filter('pre_get_posts', array($this, 'pre_get_posts'), 0);

function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {
    $query->set( 'post_type', array( 'post', 'resource', 'initiative') );
    if (isset($_GET['tags'])) {
        $tax_query = array(
            array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $_GET['tags'],
            'operator' => 'AND',
            )
        );
        $tax_query = new WP_Tax_Query($tax_query);
        $query->set('tax_query', $tax_query);
    }
}
return $query;

}

お分かりのように、私は2つのカスタム投稿タイプを含むように検索を拡張しています。検索の結果では、カスタム投稿タイプが正しく追加され、生成されたクエリでそれらを見ることができるので、フックと関数が正しく呼び出されていることがわかります。ただし、クエリのpost_tag部分は追加されていません。

WP_Queryオブジェクトのquery_vars要素には正しく(tax_query)が含まれていますが、WP_Queryオブジェクトには空の独自のtax_queryが含まれており、request内のSQLにも含まれていません。これはWP_Queryオブジェクトの(やや削除された)var_dumpです。

WP_Query Object (
[query_vars] => Array
    (
        [s] => ecosystem

        [post_type] => Array
            (
                [0] => post
                [1] => resource
                [2] => initiative
            )

        [tax_query] => WP_Tax_Query Object
            (
                [queries] => Array
                    (
                        [0] => Array
                            (
                                [taxonomy] => post_tag
                                [terms] => Array
                                    (
                                        [0] => culture-change
                                        [1] => peace
                                    )

                                [include_children] => 1
                                [field] => slug
                                [operator] => AND
                            )

                    )

                [relation] => AND
            )
        [search_terms_count] => 1
        [search_terms] => Array
            (
                [0] => ecosystem
            )

        [search_orderby_title] => Array
            (
                [0] => jcgy_posts.post_title LIKE '%ecosystem%'
            )

        [order] => DESC
    )

[tax_query] => WP_Tax_Query Object
    (
        [queries] => Array
            (
            )

        [relation] => AND
    )

[query] => Array
    (
        [s] => ecosystem
    )

[request] => SELECT SQL_CALC_FOUND_ROWS DISTINCT jcgy_posts.* FROM jcgy_posts  LEFT JOIN jcgy_postmeta as jcgy_postmeta on jcgy_posts.ID = jcgy_postmeta.post_id AND jcgy_postmeta.meta_key = '_EventStartDate' WHERE 1=1  AND (((jcgy_posts.post_title LIKE '%ecosystem%') OR (jcgy_posts.post_content LIKE '%ecosystem%')))  AND jcgy_posts.post_type IN ('post', 'resource', 'initiative') AND (jcgy_posts.post_status = 'publish' OR jcgy_posts.post_author = 1 AND jcgy_posts.post_status = 'private')  ORDER BY jcgy_posts.post_title LIKE '%ecosystem%' DESC, post_date DESC LIMIT 0, 10

私が行ったすべての調査から、クエリへの追加を正しく構成したことがわかりましたが、明らかに何かが機能していないことがわかりました。髪を引き裂いています。何か案は?

2
springthistle

私は物事を動かしました、私は完全にどうやってかわからないけれども。

2つの変更を加えました。「配列をTax_Queryオブジェクトに変換する」ステップを削除しました(これまでは配列を使用していなかったためだけに追加しました)。 () 方法)。

私の最後の(働く)機能は次のとおりです。

function pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search ) {

    if (isset($_GET['post_types'])) {
        $query->set( 'post_type', $_GET['post_types']);
    } else {
        $query->set( 'post_type', array( 'post', 'resource', 'initiative') );
    }
    if (isset($_GET['tags'])) {
        $tax_query = array(
            array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => $_GET['tags'],
            'operator' => 'AND',
            )
        );
        $query->set('tax_query', $tax_query); // do I need both of these lines?
        $query->tax_query = $tax_query;       // let's leave them both in for safety
    }
}
return $query;

}

2
springthistle