Contar entradas en una taxonomía personalizada
¿Hay alguna manera de contar todas las entradas publicadas de una taxonomía personalizada?
Mientras investigaba encontré este fragmento pero no logré hacerlo funcionar...
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 = 'TU-TAXONOMIA-PERSONALIZADA'
AND cat_terms.slug IN ('SLUG-TERMINO-1, SLUG-TERMINO-2')
";
return $wpdb->get_var($query);

Utiliza una instancia de WP_Query para consultar la base de datos. http://codex.wordpress.org/Class_Reference/WP_Query
Para consultar la base de datos por taxonomías personalizadas, usa:
$query = new WP_Query( array( 'people' => 'bob' ) );
Para más detalles sobre las opciones disponibles, consulta: Parámetros de Taxonomía http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
Recupera publicaciones publicadas usando:
'post_status' => 'publish'
Usa found_posts
para obtener el número de publicaciones:
$count = $query->found_posts;

@amarinediary en este caso realmente no necesitas resetear los datos del post. Solo necesitas hacer esto si haces un bucle de los posts y usas $query->the_post();
lo cual sobrescribirá el objeto global $post
del bucle. Si solo estás obteniendo conteos, resetear los datos del post es solo computación adicional.

function wp_get_productcat_postcount($id) {
//retorna el conteo
$args = array(
'post_type' => 'product', //tipo de post, se usa 'product'
'post_status' => 'publish', // solo busca posts publicados
'posts_per_page' => -1, //mostrar todos
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat', //nombre de la taxonomía aquí, se usa '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;
}

Me gusta mucho la simplicidad de la respuesta de Varsha Dhadge, pero esa es para términos de taxonomía adjuntos a una publicación en particular. Para todo el sitio, usa get_terms
de manera similar:
$custom_cats = get_terms(
'custom_cat', // tu slug de taxonomía personalizada
array(
// obtén todos los términos, incluso los vacíos para ver qué elementos tienen 0
'hide_empty' => false,
)
);
foreach ( $custom_cats as $term ) {
echo $term->slug . ' - ' . $term->count . '<br>';
}

esto solo obtiene los términos que están asociados al $post->ID
. mira mi solución usando get_terms
en su lugar.

Ten en cuenta que $term->count
aún te da el conteo total de posts usando ese término en todo el sitio - pero solo obtendrás términos asociados al post actual. Quizás eso es lo que algunas personas buscan aquí, pero si quieres todos los términos de todo el sitio - que es la pregunta del OP - necesitas get_terms
.

WordPress añade un atributo de recuento a cada taxonomía y lo actualiza cada vez que se inserta o actualiza una nueva entrada. Esto evita tener que acceder a la base de datos nuevamente y realizar cálculos para obtener el número de entradas en la taxonomía.
echo $custom_tax_obj->count;

Me enfrenté a esta situación en las plantillas de archivo de taxonomía (por ejemplo, taxonomy-taxname.php
) para un sitio con un tipo de entrada personalizado y sus taxonomías de categoría/etiqueta asociadas. Quería mostrar en mi encabezado un conteo de cuántos elementos usaban la taxonomía.
En mis plantillas de archivo de taxonomía, necesitaba encontrar el término que representaba la taxonomía, luego pasarlo a una función para obtener el número de elementos del tipo de entrada personalizada que usaban ese término, esto desde la taxonomía de etiquetas:
// el término que necesitamos para esta taxonomía
$term_obj = get_queried_object();
// obtener el objeto del término
$term = get_term( $term_obj->term_id, 'taxname' );
// obtener el conteo de contenido con este término
$tax_count = get_tax_count('taxname', $term->slug, 'custom-post-type-name');
// la gramática cuenta
$plural = ( $tax_count == 1) ? '' : 's';
echo $tax_count . ' Elemento' . $plural . ' Etiquetado como "' . $term->name . '"';
La función para realizar el conteo utiliza WP_Query con un tax_query:
function tax_count ( $taxonomy, $term, $post_type ) {
// encontrar el número de elementos en el tipo de entrada personalizada que usan el término en una taxonomía
$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);
}

He creado esta función para mi requisito y coincide exactamente con esta pregunta.
Obtener el Recuento de Publicaciones Dentro o Fuera de una Taxonomía
/**
* Obtener el Recuento de Publicaciones/Tipo de Publicación en la Taxonomía dada
*
* @param $post_type string cualquier tipo de publicación
* @param $taxonomy string cualquier taxonomía
* @param $is_exists string NOT EXISTS o EXISTS
*
* @return String Número de recuento de publicaciones
*/
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;
}
/**
* Ejemplo
*
* Tipo de publicación: download
* Taxonomía: download_category
* Existe: EXISTS
*/
echo prefix_get_post_count_in_taxonomy('download', 'download_category', 'EXISTS');
