Obtener entradas de categorías hijas con el ID de la categoría padre

25 nov 2014, 14:26:07
Vistas: 20.9K
Votos: 3

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
   )); 
?>
5
Comentarios

Los plugins mal escritos siempre terminan en desastre tarde o temprano. En mi opinión, elimina ese plugin y escribe tu propio código o encuentra un plugin bien escrito. No tiene sentido cambiar la rueda dañada cuando todo el auto es una pérdida total :-)

Pieter Goosen Pieter Goosen
25 nov 2014 14:30:26

Ojalá pudiera hacer eso ;-)

nanonano nanonano
25 nov 2014 14:35:30

Bueno, para ser honesto, modificar código en un plugin es una mala práctica. Cuando hablas de selección de categoría padre, ¿necesitas posts de la categoría padre y posts de sus categorías hijas?

Pieter Goosen Pieter Goosen
25 nov 2014 14:45:13

¡exactamente! Los padres están vacíos de todos modos.

nanonano nanonano
25 nov 2014 15:00:45

Hasta donde sé, 'category__in' no muestra los hijos de las categorías padres. Pero tampoco sé qué más usar.

nanonano nanonano
25 nov 2014 16:15:33
Todas las respuestas a la pregunta 2
6
11

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();
} 
25 nov 2014 16:52:51
Comentarios

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)

nanonano nanonano
25 nov 2014 17:26:34

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

Pieter Goosen Pieter Goosen
25 nov 2014 17:32:26

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

nanonano nanonano
25 nov 2014 17:46:14

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

Pieter Goosen Pieter Goosen
25 nov 2014 17:52:13

¡Lo conseguí funcionar! Edité tu código.

nanonano nanonano
26 nov 2014 01:28:50

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 [] :-)

Pieter Goosen Pieter Goosen
26 nov 2014 05:55:02
Mostrar los 1 comentarios restantes
0
-3

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...

25 nov 2014 16:40:31