Verificar si existen entradas en una categoría de tipo de contenido personalizado, fuera del bucle
Estoy construyendo una navegación, fuera del bucle principal, que incluye menús desplegables. Tengo un tipo de contenido personalizado llamado 'Events', que tiene sus propias categorías. Me gustaría que hubiera un desplegable si hay entradas dentro de ese tipo de contenido personalizado y categoría, pero no estoy seguro de qué funciones debería usar para determinar esto...
Tengo...
$hasposts = get_posts('post_type=Events&category=40');
if($hasposts) {
..// mostrar el menú desplegable
}
¿Debería estar usando get_posts()
? Todo lo que estoy obteniendo devuelve un array vacío, pero sé que algunas de esas categorías incluyen entradas...
Muchas gracias, WA.

Todo se reduce a WP_Query al final, incluso si usas get_posts, aquí está mi versión modificada:
$hasposts = get_posts('post_type=sc-events&category=40');
if( !empty ( $hasposts ) ) {
..// mostrar el menú desplegable
}
o
$query = new WP_Query(array(
'post_type' => 'sc-events',
'category' => 40
));
if( $query->have_posts() ){
echo 'tenemos publicaciones';
} else {
echo 'no se encontraron publicaciones';
}
Aunque esto funcionará, hay una alternativa inspirada en tu propia respuesta que usa el slug de la categoría en lugar de su ID:
$term = get_term_by('name', 'como se llame la categoría 40', 'category');
if($term != false ){
if($term->count > 0 ){
// tenemos publicaciones
}
}

el tipo de publicación 'Events' tiene su propia taxonomía, por lo que el ID de la categoría es específico solo para este tipo de contenido personalizado. Estoy de acuerdo con la codificación directa, pero estoy modificando el código de otra persona. Sin embargo, la primera solución que sugeriste sigue devolviendo un array vacío, incluso cuando hay publicaciones en esa categoría. Y la segunda sugerencia... es más compleja de lo que buscaba porque en realidad no voy a mostrar nada de esa consulta. Solo necesito verificar si hay publicaciones en la categoría. Agradezco mucho la ayuda.

la segunda solución es idéntica a la primera, es lo que get_posts hace internamente, y significan exactamente lo mismo y funcionan exactamente igual. Solo porque hiciste una consulta, no significa que tengas que hacer el loop

Además, si tienes una taxonomía personalizada, ¿por qué estás usando 'category=40' y no 'customtaxonomyname=40'?

gracias por la información. En realidad no tiene una taxonomía, ahora que estoy revisando el archivo functions.php. Está utilizando Categorías de Tipos de Entradas. Entonces, incluso con todo eso dicho, ¿por qué alguna de las soluciones me devuelve un array vacío, incluso si solo consulto por el número de Categoría, y no lo relaciono con tipos de entradas particulares? ¿Es eso relevante?

Esto sugiere falta de información, ¿puedes publicar el código de registro para tu tipo de entrada?

De nuevo... no es mi código, pero el desarrollador utilizó un plugin http://wordpress.org/extend/plugins/types/ para desarrollar estos.

continuemos esta discusión en el chat

Si deseas obtener un array con todos los términos dentro de tu taxonomía personalizada, con la condición adicional de que contengan al menos una publicación, esta es la función que estás buscando:
get_terms(
'group',
array(
'hide_empty' => true
)
);
Esto recuperará información sobre los términos, no sobre las publicaciones en sí mismas. Lo único que sabes sobre las publicaciones en este escenario es que existen dentro de esos términos, nada más. Si los menús desplegables mostrarán algún tipo de información sobre las publicaciones, quizás necesitarás algo diferente a lo anterior. De lo contrario, get_terms es la función que estás buscando.

No hay necesidad de devolver el objeto completo de get_posts, puedes optimizar mejor el rendimiento utilizando el parámetro fields para devolver solo los IDs.
$posts = get_posts( array(
'post_type' => 'Events',
'posts_per_page' => 1,
'fields' => 'ids',
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => array( '40' )
),
),
) );
if ( ! empty ( $posts ) ) {
..// mostrar el menú desplegable
}
