Numără articolele dintr-o taxonomie personalizată
Există vreo modalitate de a număra toate articolele publicate dintr-o taxonomie personalizată?
În timp ce căutam, am găsit acest fragment de cod dar nu am reușit să-l fac să funcționeze ...
global $wpdb;
$query = "
SELECT COUNT( DISTINCT cat_posts.ID ) AS post_count
FROM wp_term_taxonomy AS cat_term_taxonomy INNER JOIN wp_terms AS cat_terms ON
cat_term_taxonomy.term_id = cat_terms.term_id
INNER JOIN wp_term_relationships AS cat_term_relationships
ON cat_term_taxonomy.term_taxonomy_id = cat_term_relationships.term_taxonomy_id
INNER JOIN wp_posts AS cat_posts
ON cat_term_relationships.object_id = cat_posts.ID
WHERE cat_posts.post_status = 'publish'
AND cat_posts.post_type = 'post'
AND cat_term_taxonomy.taxonomy = 'TAXONOMIA-TA-PERSONALIZATA'
AND cat_terms.slug IN ('SLUG-TERMEN-1, SLUG-TERMEN-2')
";
return $wpdb->get_var($query);

Folosește o instanță a clasei WP_Query pentru a interoga baza de date. http://codex.wordpress.org/Class_Reference/WP_Query
Pentru a interoga baza de date pentru taxonomii personalizate, folosește:
$query = new WP_Query( array( 'people' => 'bob' ) );
Pentru mai multe detalii despre opțiunile disponibile, vezi: Parametrii Taxonomiei http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
Recuperează articolele publicate folosind:
'post_status' => 'publish'
Folosește found_posts
pentru a obține numărul de articole
$count = $query->found_posts;

@amarinediary în acest caz de fapt nu este necesar să resetezi datele postării. Ai nevoie să faci asta doar dacă parcurgi postările și folosești $query->the_post();
, ceea ce va suprascrie obiectul global $post
al buclei. Dacă doar obții numărătoare, resetarea datelor postării este doar un calcul suplimentar.

function wp_get_productcat_postcount($id) {
//returnează $count
$args = array(
'post_type' => 'product', //tipul postării, am folosit 'product'
'post_status' => 'publish', // încerc să găsesc toate postările publicate
'posts_per_page' => -1, //afișează toate
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat', //numele taxonomiei aici, am folosit 'product_cat'
'field' => 'id',
'terms' => array( $id )
)
)
);
$query = new WP_Query( $args);
/*
echo '<pre>';
print_r($query->post_count);
echo '</pre>';
*/
return (int)$query->post_count;
}

Îmi place foarte mult simplitatea răspunsului lui Varsha Dhadge, dar acesta se referă la termenii de taxonomie atașați unui anumit articol. Pentru întregul site, folosește get_terms
într-un mod similar:
$custom_cats = get_terms(
'custom_cat', // slug-ul taxonomiei personalizate
array(
// obține toți termenii, inclusiv pe cei goi, pentru a vedea care elemente au 0
'hide_empty' => false,
)
);
foreach ( $custom_cats as $term ) {
echo $term->slug . ' - ' . $term->count . '<br>';
}

acesta obține doar termenii atașați la $post->ID
. vezi soluția mea folosind get_terms
în loc.

Reține că $term->count
încă îți oferă numărul total de postări care folosesc acel termen pe întregul site - dar vei obține doar termenii atașați la postarea curentă. Poate că asta caută unii oameni aici, dar dacă vrei toți termenii de pe întregul site - care este întrebarea OP - ai nevoie de get_terms
.

WordPress adaugă un atribut numărat pentru fiecare taxonomie și îl actualizează ori de câte ori un nou articol este inserat sau actualizat. Acest lucru se întâmplă pentru a evita necesitatea de a accesa din nou baza de date și de a face calcule pentru a obține numărul de articole din taxonomie.
echo $custom_tax_obj->count;

Mă confrunt cu această situație în șabloanele de arhivă pentru taxonomii (de ex. taxonomy-taxname.php
) pentru un site cu un tip de postare personalizat și taxonomii asociate de categorii/tag-uri. Am dorit să afișez în header un număr care să indice câte elemente folosesc taxonomia respectivă.
În șabloanele mele de arhivă pentru taxonomii, a trebuit să găsesc termenul reprezentat de taxonomie, apoi să îl transmit unei funcții pentru a obține numărul de elemente din tipul de postare personalizat care folosesc acel termen, în acest caz din taxonomia de tag-uri
// termenul de care avem nevoie pentru această taxonomie
$term_obj = get_queried_object();
// obținem obiectul termen
$term = get_term( $term_obj->term_id, 'taxname' );
// obținem numărul de conținuturi cu acest termen
$tax_count = get_tax_count('taxname', $term->slug, 'custom-post-type-name');
// gramatica contează
$plural = ( $tax_count == 1) ? '' : 's';
echo $tax_count . ' Element' . $plural . ' Etichetat "' . $term->name . '"';
Funcția care face numărătoarea folosește WP_Query cu un tax_query:
function tax_count ( $taxonomy, $term, $post_type ) {
// găsește numărul de elemente din tipul de postare personalizat care folosesc termenul într-o taxonomie
$args = array(
'post_type' => $post_type,
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term,
),
),
);
$tax_query = new WP_Query( $args );
return ($tax_query->found_posts);
}

Am creat această funcție pentru cerința mea și se potrivește exact cu această întrebare.
Obține numărul de postări în sau în afara taxonomiei
/**
* Obține numărul de postări/tipuri de postări într-o taxonomie dată
*
* @param $post_type string orice tip de postare
* @param $taxonomy string orice taxonomie
* @param $is_exists string NOT EXISTS sau EXISTS
*
* @return String Numărul de postări
*/
function prefix_get_post_count_in_taxonomy($post_type, $taxonomy, $is_exists = 'NOT EXISTS')
{
global $wpdb;
$count = $wpdb->get_var(
"
select COUNT(*) as post_count
FROM $wpdb->posts as A
WHERE $is_exists (
SELECT 1
FROM
$wpdb->term_relationships as B
INNER JOIN $wpdb->term_taxonomy as C
ON C.term_taxonomy_id = B.term_taxonomy_id
WHERE C.taxonomy = '$taxonomy'
AND B.object_id = A.ID
)
AND A.post_type = '$post_type'
"
);
return $count;
}
/**
* Exemplu
*
* Tip postare: download
* Taxonomie: download_category
* Există: EXISTS
*/
echo prefix_get_post_count_in_taxonomy('download', 'download_category', 'EXISTS');
