web-dev-qa-db-fra.com

Obtenir les termes des messages avec la catégorie avec SQL

J'ai une taxonomie de type et une taxonomie de category.

Comment puis-je renvoyer une liste de chaque type durée de messages dans une seule category?

Je sais que je peux le faire:

// Final array of all types:
$allTypesFromThisCategory = [];


if (have_posts()) : while (have_posts()) : the_post();
    $types = wp_get_post_terms( $post->ID, 'type' );
    foreach($types as $type){
        // Pseudo code:
        if( ! in_array($type, $allTypesFromThisCategory) ){
            // Add the type to the array
            $allTypesFromThisCategory[] = $type;
        }
    }
endwhile; endif;

print_r($allTypesFromThisCategory);

Mais cela pose quelques problèmes.

  1. Il y a environ 1 000 postes, ce sera donc très lent.
  2. En supposant que posts_per_page ne soit pas -1, cette requête ne reflétera pas toujours la types de toutes les publications, mais uniquement celles de la page en cours.

J'aimerais écrire quelque chose comme

global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM ...", OBJECT );

Où le ... représente:

  1. Utiliser la taxonomie actuelle category
  2. Trouver tous les posts avec cet identifiant de taxonomie category
  3. Sélectionner toute la taxonomie types de ces posts

... mais le problème est que je ne peux/suis terrible à écrire des jointures et du SQL brut.

2
Djave

Voici la solution:

global $wpdb;
$wpdb->get_results( $wpdb->prepare(
    "SELECT tags.*, COUNT(tags_rel.object_id) as posts_count
    FROM
        {$wpdb->prefix}terms tags
        INNER JOIN {$wpdb->prefix}term_taxonomy tags_tax ON (tags_tax.term_id = tags.term_id)
        INNER JOIN {$wpdb->prefix}term_relationships tags_rel ON (tags_tax.term_taxonomy_id = tags_rel.term_taxonomy_id)
        INNER JOIN {$wpdb->prefix}posts posts ON (tags_rel.object_id = posts.ID)
        INNER JOIN {$wpdb->prefix}term_relationships cats_rel ON (posts.ID = cats_rel.object_id)
        INNER JOIN {$wpdb->prefix}term_taxonomy cats_tax ON (cats_rel.term_taxonomy_id = cats_tax.term_taxonomy_id)
        INNER JOIN {$wpdb->prefix}terms cats ON (cats.term_id = cats_tax.term_id)
    WHERE
        tags_tax.taxonomy = 'type'
        AND cats_tax.taxonomy = 'category'
        AND posts.post_type = 'post'
        AND posts.post_status = 'publish'
        AND cats.term_id = %d
    GROUP BY tags_tax.term_id",
    <CATEGORY_TERM_ID>  // <-- here goes the category id of current category
) );

PS N'oubliez pas que c'est une belle opportunité de faire de la mise en cache. Ces balises ne changeront pas elles-mêmes. Vous pouvez donc les calculer une fois et les utiliser avec ces valeurs mises en cache. De cette façon, ils ne seront calculés que lors de la sauvegarde des posts ...

1
Krzysiek Dróżdż