web-dev-qa-db-fra.com

Comment utiliser filter hook posts_join pour interroger des termes de taxonomie dans posts_where?

Au cours des dernières heures, j'ai essayé d'utiliser les crochets de filtre posts_where et posts_join pour rechercher des publications basées sur des termes de taxonomie. Dans ce cas, la taxonomie est 'catégorie' et le terme est 'politique'

C'est ce que j'ai essayé et j'ai abouti à une requête vide:

Cette ligne est à l'intérieur du crochet posts_where

$where .= " OR ($wpdb->term_taxonomy.taxonomy IN ('category') AND $wpdb->terms.name = 'politics')";

Et voici ce que j’avais l'habitude de joindre aux différentes tables:

$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
$join .= " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) ";
$join .= " LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
$join .= " LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) ";

J'ai proposé une alternative qui fonctionne mais je veux savoir ce qui ne va pas avec le code précédent et comment le faire fonctionner.

L'alternative de travail est la suivante (ceci sans utiliser le posts_join hook):

$search .= " OR ($wpdb->posts.ID IN( 
    SELECT $wpdb->term_relationships.object_id as post_id 
    FROM $wpdb->term_taxonomy,  $wpdb->terms, $wpdb->term_relationships 
    WHERE $wpdb->term_taxonomy.term_id =  $wpdb->terms.term_id
    AND $wpdb->term_relationships.term_taxonomy_id =  $wpdb->term_taxonomy.term_taxonomy_id
    AND $wpdb->term_taxonomy.taxonomy in ('category')
    AND ($wpdb->terms.name LIKE 'politics')  
    )
)";

Alors, comment puis-je utiliser les hooks posts_where et posts_join pour interroger les termes de taxonomie?

1
Gixty

Après avoir essayé différentes choses, j’ai proposé ce qui suit.

Lorsque nous utilisons posts_join, il n'est pas nécessaire d'ajouter le préfixe $wpdb-> ainsi que la table interrogée. Nous avons juste besoin du nom de la colonne. Dans ce cas, nous avons juste besoin de name et taxonomy, comme ceci:

AVANT

$where .= " OR ($wpdb->term_taxonomy.taxonomy IN ('category') AND $wpdb->terms.name LIKE 'politics')";

APRÈS

$where .= " OR ( taxonomy IN ('category') AND name LIKE 'politics')";

Il est bon de souligner que, à mesure que les requêtes deviennent plus complexes, des alias doivent être utilisés.

Utiliser des alias ressemble à ceci:

Pour posts_where hook:

$where .= " OR (wtt.taxonomy IN ('category') AND wt.name LIKE 'politics' )";

Pour posts_join hook:

$join .= " LEFT JOIN $wpdb->term_relationships as wtr ON ($wpdb->posts.ID = wtr.object_id) ";
$join .= " LEFT JOIN $wpdb->term_taxonomy as wtt ON (wtr.term_taxonomy_id = wtt.term_taxonomy_id) ";
$join .= " LEFT JOIN $wpdb->terms as wt ON(wtt.term_id = wt.term_id) ";
4
Gixty