web-dev-qa-db-fra.com

Interroger les publications par type de publication personnalisée et par taxonomie personnalisée

J'écris une requête en boucle personnalisée pour filtrer un type de publication personnalisé et une taxonomie personnalisée. J'ai remplacé toutes les variables par des valeurs statiques dans le but de vous montrer le résultat souhaité.

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

$loop = new WP_Query($args);

Lorsque je lance cette boucle, au lieu d'afficher uniquement les roues de cinquième roue, toutes les publications sous le type de fabricant 'Keystone' sont affichées. Pourquoi est-ce? Cette requête ne doit-elle pas afficher uniquement les publications avec la taxonomie personnalisée demandée, sous post-type = rv, avec la nouvelle catégorie, avec rvtype = fifth-wheel?

Toute idée serait grandement apprécié!

1
ToddSmithSalter

Bien sûr, vous ne pouvez pas associer plusieurs termes de taxonomie à une requête - Wordpress honorera uniquement le premier et ignorera le reste.

Apparemment, cela devrait être corrigé en 3.1.

En attendant, il existe un plugin qui vous corrigera: http://scribu.net/wordpress/query-multiple-taxonomies

EDIT: Si vous souhaitez une solution non-plugin, faites-le moi savoir. J'en ai un que j'utilise.

EDIT: Voici le moyen rapide et sale sans plugin. Déposez ce code dans votre fichier 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

Maintenant, lorsque vous exécutez une requête, ajoutez un nouvel argument appelé multiple_terms. Cela devrait contenir un tableau où la clé est le nom de taxonomie et la valeur est la valeur que vous souhaitez faire correspondre. Ainsi:

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

Travaille pour moi. Ceci est modifié à partir d'une idée que j'ai trouvée sur un autre forum ou blog, mais je ne la trouve pas pour la vie de moi.

7
MathSmath