web-dev-qa-db-fra.com

Comment interroger la base de données pour les publications avec certains termes de taxonomie

Je souhaite rédiger une requête de sélection pour ne renvoyer des données que sur les publications associées au terme de taxonomie food-and-beverage

SELECT wp_postmeta . * , wp_posts.post_name
FROM wp_posts, wp_postmeta, wp_terms, wp_term_relationships
WHERE wp_posts.post_type =  'projects'
AND wp_posts.post_status =  'publish'
AND wp_posts.ID = wp_postmeta.post_id
AND wp_term_relationships.object_id = wp_posts.ID
AND wp_term_relationships.term_taxonomy_id = wp_terms.term_id
AND wp_terms.slug =  'food-and-beverage'
ORDER BY wp_posts.ID DESC 

Pour une raison inconnue de moi, cela renvoie des messages pour lesquels food-and-beverage n'a pas été sélectionné.

Comme le montre la réponse ci-dessous, ce n'est pas l'approche idéale, mais c'est une approche à laquelle je me suis engagée, car refactoriser le code (il génère du code SQL, et bien plus encore) me prendrait à jamais.

EDIT


Puisque tout le monde semble être d'accord (y compris moi-même) sur le fait que je ne le fais pas correctement, je vais essayer à contrecœur de refactoriser.

Cependant, je vais laisser la question ouverte pour le moment, au cas où quelqu'un pourrait me concocter une solution rapide (je vous laisserai volontiers des pointsbounty).

Pour les audacieux/fous, voici un Gist avec un gros morceau de la source: https://Gist.github.com/2950395

Je passe l'ajax un couple "filtres" comme POST variables.

1
Zach Lysobey

(Je me rends compte que vous vous en éloignez, mais peut-être que si vous pouvez le faire fonctionner, cela en vaut la peine. Avec les récentes améliorations de la performance dans la version 3.4 pour WP_Query, cela pourrait valoir la peine)

WP_Query est la bonne décision s'il s'agit d'une boucle secondaire. Sinon, vous pourriez regarder dans pre_get_posts .

Lorsque vous utilisez WP_Query, assurez-vous que:

  1. Vous n'utilisez pas de variable globale réservée pour enregistrer votre nouvelle requête. (Par exemple, de nombreuses personnes causent des problèmes en enregistrant leur nouvelle requête sous le nom $wp_query, puis en écrasant leur objet de requête existant.
  2. Vous utilisez le bon format de boucle, par exemple $my_custom_query->have_posts();
  3. Enfin, plutôt que d'utiliser tag ou la tax var (qui est obsolète), utilisez un tax_query.

En regardant votre exemple, voici une boucle suggérée:

$food_query_args = array(
    'post_type' => 'projects',
    'tax_query' => array(
        array(
            'taxonomy' => 'post_tag', // or the name of your custom taxonomy
            'field' => 'slug',
            'terms' => 'food-and-beverage' // FYI, it's more stable imho to use the ID if you can. If you do, that switch 'slug' in the preceding line to 'id'
        )
    )
);

$food_query = new WP_Query( $food_query_args );

if( $food_query->have_posts() ) : while( $food_query->have_posts() ) : $food_query->the_post();

    // STUFF

endwhile; endif; wp_reset_postdata();
3
mrwweb

Vous n'avez pas besoin d'écrire ces requêtes SQL. vous pouvez utiliser WP_Query api.

ce qui suit affichera les messages qui contiennent les termes "nourriture et boissons" dans les balises.

$query = new WP_Query( array( 'tag' => 'food-and-beverage' ) );

si vous utilisez une taxonomie différente, utilisez-la au lieu de tag.

comme vous devez filtrer les articles en utilisant d'autres options, vous pouvez consulter la documentation complète de l'api pour WP_Query ici: http://codex.wordpress.org/Class_Reference/WP_Query

Cela vous évitera d'écrire en SQL.

2
HungryCoder