web-dev-qa-db-fra.com

$ wpdb: Comptage des posts correspondant à 3 termes dans 3 taxonomies différentes

C'est plus facile si je fais un exemple:

J'ai un type de message personnalisé MYPOSTTYPE, avec 3 taxonomies TAX_1 , TAX_2 et TAX_3

Si j'ai 3 termes: 'TERM_TAX_1' dans TAX_1 , 'TERM_TAX_2' dans TAX_2 et 'TERM_TAX_3' dans TAX_3 , comment puis-je compter le nombre de MYPOSTTYPE ayant les 3 termes avec une requête SQL et $ wpdb?

J'ai essayé avec quelque chose comme ça, mais ça ne marche pas ... le compteur est toujours à 0

SELECT COUNT($wpdb->posts.ID) AS counter
FROM $wpdb->posts 
    LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    LEFT JOIN $wpdb->terms AS tax_one ON ($wpdb->term_taxonomy.term_id = tax_one.term_id)
    LEFT JOIN $wpdb->terms AS tax_two ON ($wpdb->term_taxonomy.term_id = tax_two.term_id)
    LEFT JOIN $wpdb->terms AS tax_three ON ($wpdb->term_taxonomy.term_id = tax_three.term_id)
WHERE 1=1
    AND $wpdb->posts.post_type = 'MYPOSTTYPE'
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->term_taxonomy.taxonomy  IN ('TAX_1', 'TAX_2', 'TAX_3')
    AND tax_one.slug = 'TERM_TAX_1' 
    AND tax_two.slug = 'TERM_TAX_1'
    AND tax_three.slug = 'TERM_TAX_1'

UPDATE: J'ai aussi essayé avec tax_query , mais j'ai eu ce problème Problème avec get_posts, tax_query et compter le nombre de messages

donc je voulais essayer de faire une requête directement à la base de données

1
Stefano

Effectuez une taxe-interrogation puis count le résultat. Pas besoin d'une requête personnalisée avec des dizaines de JOINS.

$posts = new WP_Query( array(
    'post_type' => 'MYPOSTTYPE', 
    'tax_query' => array(     
        array(         
            'taxonomy' => 'TAX_1',
            'field'    => 'slug',         
            'terms'    => array( 'TERM_TAX_1' ),
            'operator' => 'IN'
        ),
        array(
            // etc.
        )
    ),
    'post_status' => 'publish'
);
prinft(
     '<h3>COUNT: %s</h3>'
    ,count( $posts )
);
2
kaiser

Puisque MySQL permet d'imbriquer des requêtes dans une clause where, je pense qu'une requête comme celle-ci devrait fonctionner

SELECT COUNT($wpdb->posts.ID) AS counter
FROM $wpdb->posts 
    INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE
    $wpdb->term_taxonomy.taxonomy = 'TAX_1'
    AND $wpdb->terms.slug = 'TERM_TAX_1'
    AND $wpdb->posts.ID IN ( SELECT $wpdb->posts.ID
FROM $wpdb->posts
    INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE
    $wpdb->term_taxonomy.taxonomy = 'TAX_2'
    AND $wpdb->terms.slug = 'TERM_TAX_2'
    AND $wpdb->posts.ID IN ( SELECT $wpdb->posts.ID
FROM $wpdb->posts 
    INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE
    $wpdb->posts.post_type = 'MYPOSTTYPE'
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->term_taxonomy.taxonomy = 'TAX_3'
    AND $wpdb->terms.slug = 'TERM_TAX_3'
))
0
Mridul Aggarwal