Obtener entradas de categorías hijas con el ID de la categoría padre
Tengo un plugin que muestra entradas de una categoría seleccionada. Cuando se seleccionan categorías hijas funciona perfectamente. Sin embargo, cuando elijo una categoría padre, no muestra ninguna entrada de las categorías hijas.
Espero que este sea el fragmento que debe cambiarse, pero no estoy seguro.
Sería genial si alguien pudiera ayudarme.
<ul>
<?php
query_posts(array(
'post_type' => 'post',
'category__in' => $text, // ID de categoría
'orderby' => 'meta_value_num',
'meta_key' => 'rankk',
'order' => 'DESC',
'posts_per_page' => 100
));
?>

Como he mencionado en mis comentarios a tu pregunta
Los plugins mal escritos siempre conducen a algún desastre en algún momento. En mi opinión, elimina ese plugin y escribe tu propio código o encuentra un plugin bien escrito. No tiene sentido cambiar la llanta dañada cuando el coche entero es una pérdida total :-)
Para empezar, nunca uses query_posts
Nota: Esta función no está destinada a ser utilizada por plugins o temas. Como se explica más adelante, hay opciones mejores y más eficientes para alterar la consulta principal. query_posts() es una forma demasiado simplista y problemática de modificar la consulta principal de una página reemplazándola con una nueva instancia de la consulta. Es ineficiente (vuelve a ejecutar consultas SQL) y fallará por completo en algunas circunstancias (especialmente al tratar con la paginación de entradas).
Realmente estarías mejor escribiendo tu propio código y descartando el plugin. También puedes fusionar el plugin actual (solo el código "bueno") con el código que te daré en tu propio plugin si es necesario.
Nunca deberías hacer cambios en archivos de plugins/temas de los que no eres el autor. La razón principal es que, cuando llegue la actualización, perderás todas tus personalizaciones. Es mejor crear tu propio plugin o hacer los cambios en un tema hijo.
Lo que quieres lograr no es posible con los parámetros actuales de categoría. Tu mejor opción aquí será usar una tax_query
con WP_Query
. Con una tax_query
, por defecto, los términos hijos se incluyen en el término establecido, y eso es lo que buscas.
Puedes probar lo siguiente (NOTA IMPORTANTE: esto requiere PHP 5.4+)
$args = [
'post_type' => 'post',
'orderby' => 'meta_value_num',
'meta_key' => 'rankk',
'order' => 'DESC',
'posts_per_page' => 100,
'tax_query' => [
[
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 'TU ID DE CATEGORÍA PADRE',
],
],
];
$q = new WP_Query( $args );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}
Para versiones de PHP anteriores a 5.4 prueba esto
$args = array(
'post_type' => 'post',
'orderby' => 'meta_value_num',
'meta_key' => 'rankk',
'order' => 'DESC',
'posts_per_page' => 100,
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'term_id',
'terms' => 'TU ID DE CATEGORÍA PADRE',
),
),
);
$q = new WP_Query( $args );
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
the_title();
}
wp_reset_postdata();
}

Intenté usar tu sugerencia. Pero no tengo conocimientos de PHP :/. ¿Podría pagarte para que lo arregles? (ojalá hubiera una opción de mensaje privado)

Lo siento, hay un pequeño error de sintaxis en mi código. Mira mi actualización

Recibo un error fatal (tengo copias de seguridad por si acaso). ¿Debería reemplazar 'YOUR PARENT CATEGORY ID'
con $text
?

Bueno, si te quedas con el plugin y lo modificas (lo cual realmente no recomiendo), entonces sí

Gracias por la edición sugerida. Ahora veo dónde estaba tu problema y debería haber añadido una nota sobre eso, la sintaxis en mi código solo es compatible con la versión 5.4 de PHP y superiores. En versiones anteriores obtendrás un error fatal. En versiones anteriores deberías usar array()
mientras que en 5.4+ puedes simplemente usar []
:-)

puedes usar esta forma:
<?php
$category_id = get_cat_ID('Nombre de la Categoría');
<!-- Comienza el Loop. -->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<!-- Comprueba si el post actual pertenece a la categoría "Nombre de la Categoría". -->
<!-- Si es así, al div se le asigna la clase CSS "post-cat-special". -->
<!-- De lo contrario, al div se le asigna la clase CSS "post". -->
<?php if ( in_category($category_id) ) { ?>
<div class="post-cat-special">
<?php } else { ?>
<div class="post">
<?php } ?>
</div>
<!-- Detiene el Loop (pero nota el "else:" - ver siguiente línea). -->
<?php endwhile; else: ?>
<!-- El primer "if" comprobó si había Posts para -->
<!-- mostrar. Esta parte "else" indica qué hacer si no había ninguno. -->
<p>Lo sentimos, no hay publicaciones que coincidan con tus criterios.</p>
<!-- REALMENTE detiene el Loop. -->
<?php endif; ?>
usa este código mágico donde necesites mostrar...
