web-dev-qa-db-ja.com

カスタム投稿タイプとカスタム分類法による投稿のクエリ

カスタム投稿タイプとカスタム分類法をフィルタリングするカスタムループクエリを作成しています。欲しい結果を示すために、変数を静的な値に置き換えました。

$args = array(
    'manufacturer' => 'Keystone',
    'post_type' => 'rv',
    'category_name' => 'new',
    'rvtype' => 'fifth-wheel'
);

$loop = new WP_Query($args);

このループを実行すると、5輪目ではなく、製造元タイプ「Keystone」の下にあるすべてのポストが表示されます。どうしてこれなの?このクエリでは、要求されたカスタム分類法、post-type = rv、新しいカテゴリ、rvtype = five-wheelの投稿のみを表示する必要がありますか

任意の洞察力は大歓迎です!

1
ToddSmithSalter

1つのクエリで複数の分類用語を一致させることはできません - Wordpressは最初のものだけを尊重し、それ以外は無視します。

どうやら、これは3.1で修正される予定です。

当面の間は、すぐに修正できるプラグインがあります。 http://scribu.net/wordpress/query-multiple-taxonomies

編集:あなたがプラグイン以外の解決策を望んでいるなら、私に知らせてください。私が使っているものがあります。

編集:これは素早い汚い非プラグインの方法です。このコードをfunctions.phpファイルに入れてください。

function wpse_5057_match_multiple_taxonomy_terms($where_clause, $wp_query) {

    // If the query obj exists
    if (isset($wp_query->query)) {

        $multi_query = $wp_query->query;

        if (is_array($multi_query) && isset($multi_query['multiple_terms'])) {

            global $wpdb;
            $arr_terms = $multi_query['multiple_terms'];

            foreach($arr_terms as $key => $value) {

                $sql = "AND $wpdb->posts.ID IN(
                    SELECT tr.object_id
                    FROM $wpdb->term_relationships AS tr
                    INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
                    INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id
                    WHERE tt.taxonomy='%s' AND t.slug='%s')";

                $where_clause .= $wpdb->prepare($sql, $key, $value); // add to the where

            }
        }

    }

    return $where_clause; // return the filtered where

}
add_action('posts_where','wpse_5057_match_multiple_taxonomy_terms',10,2); // Hook this to posts_where

それでは、クエリを実行するときに、multiple_termsという新しい引数を追加します。これは、キーが分類名で、値が一致したい値である配列を含むべきです。そのようです:

$args = array(
    'post_type' => 'rv',
    'multiple_terms' => array('manufacturer' => 'Keystone', 'rvtype' => 'fifth-wheel')
);

私のために働きます。これは私が他のフォーラムやブログで見つけたアイデアから修正されていますが、私の人生のために見つけることはできません。

7
MathSmath