Cómo obtener una lista de categorías asignadas al post actual

19 ene 2011, 17:19:33
Vistas: 3.92K
Votos: 1

Las dos funciones siguientes están diseñadas para devolver una lista de posts que comparten la misma categoría que el post actual que se está viendo en single.php

Sin embargo, cuando hago var_dump en $cat (que debería ser una lista de las categorías asignadas al post actual), no obtengo lo que espero. ¿Necesito deserializar el array antes de pasarlo a la consulta get_posts?

function get_cats()
{
$post_cats= array();
$categories = get_the_category();
foreach($categories as $cat){
array_push($post_cats, $cat->cat_ID);
}
return $post_cats;
}

// Obtener posts relacionados por categoría
function ce4_get_related_by_category()
{
global $post;
$cat = implode(',',get_cats());
$catHidden=get_cat_ID('hidden');
$myqueryCurrent = new WP_Query();
$myqueryCurrent->query(array('cat' => "$cat,-$catHidden",'post__not_in' => get_option('sticky_posts')));
$totalpostcount = $myqueryCurrent->found_posts;
if($totalpostcount > 0)
    {
        echo "<ul>";
        $myposts = get_posts(array('cat' => "$cat,-$catHidden",'numberposts' => $cb2_current_count));
        foreach($myposts as $idx=>$post) 
        {
        ?>
            <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><?php the_excerpt(); ?></li>
        <?php 
        }
        echo "</ul>";
    }
} 
0
Todas las respuestas a la pregunta 2
4

Puedes usar get_the_category()

Devolverá un array de IDs de categorías pertenecientes al post actual.


$post_cats = array();
$categories = get_the_category();
foreach($categories as $cat) :
    array_push($post_cats, $cat->cat_id);
endforeach;

Luego el array $post_cats tendrá una lista con todos los IDs.

19 ene 2011 17:22:19
Comentarios

Cuando hago var_dump(get_the_category($post->ID)); parece que estoy obteniendo todos los objetos de categoría. ¿Puedo pasar un argumento para limitar la respuesta a una lista de cat_id's?

Scott B Scott B
19 ene 2011 17:40:15

No puedes limitar la respuesta solo a los IDs, pero podrías intentar algo como esto para obtener un array con solo los IDs. (revisa mi respuesta, editada)

Pippin Pippin
19 ene 2011 17:43:47

Gracias Pippin, he actualizado mi pregunta con tus sugerencias. Estoy obteniendo array(1) { [0]=> NULL } cuando hago var_dump($cat). Esperaba obtener '10,7'

Scott B Scott B
19 ene 2011 18:00:16

Debería ser $cat->cat_ID en el Loop.

Rarst Rarst
19 ene 2011 18:13:36
4

Puedes obtener solo un array de IDs así con wp_get_object_terms():

wp_get_object_terms($id, 'category', array('fields' => 'ids'))

Nota que get_the_category() almacena en caché los resultados y obtener los IDs desde su retorno podría ser más eficiente que obtener los IDs por separado con esto.

19 ene 2011 18:08:23
Comentarios

Gracias Rarst, ¿necesito deserializar el array antes de pasarlo a $myqueryCurrent y $myposts?

Scott B Scott B
19 ene 2011 18:24:46

@Scott B según tu código actual necesitarás recorrer el array para negar los valores y añadirlos a la cadena. Creo que sería más simple usar category__not_in en lugar de cat y simplemente pasar un array de IDs.

Rarst Rarst
19 ene 2011 18:27:24

He editado el código. Solo necesitaba ejecutar el método implode en la variable. Parece que funciona. Solo necesito eliminar el post actual del bucle de salida.

Scott B Scott B
19 ene 2011 18:36:02

@Scott B ah, entendí mal un poco, pensé que querías excluirlos en lugar de incluirlos. Sí, en ese caso implode funcionará perfectamente.

Rarst Rarst
19 ene 2011 18:38:46