Come ottenere un elenco di categorie assegnate al post corrente?

19 gen 2011, 17:19:33
Visualizzazioni: 3.92K
Voti: 1

Le due funzioni seguenti sono progettate per restituire un elenco di post che condividono la stessa categoria del post corrente visualizzato in single.php

Tuttavia, quando eseguo var_dump su $cat (che dovrebbe essere un elenco delle categorie assegnate al post corrente), non ottengo ciò che mi aspetto. Devo forse deserializzare l'array prima di passarlo alla query get_posts?

// Ottiene l'ID delle categorie del post corrente
function get_cats()
{
$post_cats= array();
$categories = get_the_category();
foreach($categories as $cat){
array_push($post_cats, $cat->cat_ID);
}
return $post_cats;
}

// Ottiene post correlati per categoria
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
Tutte le risposte alla domanda 2
4

Puoi utilizzare get_the_category()

Restituirà un array di ID di categoria appartenenti al post corrente.


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

L'array $post_cats conterrà quindi una lista di tutti gli ID.

19 gen 2011 17:22:19
Commenti

Quando eseguo var_dump(get_the_category($post->ID)); sembra che ottenga tutti gli oggetti delle categorie. Posso passare un argomento per limitare la risposta a una lista di cat_id?

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

Non puoi limitare la risposta ai soli ID, ma potresti provare qualcosa del genere per ottenere un array contenente solo gli ID. (controlla la mia risposta, modificata)

Pippin Pippin
19 gen 2011 17:43:47

Grazie Pippin, ho aggiornato la mia domanda con i tuoi suggerimenti. Ottengo array(1) { [0]=> NULL } quando faccio var_dump($cat). Mi aspetterei '10,7'

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

Dovrebbe essere $cat->cat_ID nel Loop.

Rarst Rarst
19 gen 2011 18:13:36
4

Puoi ottenere un array di soli ID in questo modo con wp_get_object_terms():

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

Nota che get_the_category() memorizza nella cache i risultati e ottenere gli ID dal suo ritorno potrebbe effettivamente essere più efficiente che recuperare gli ID separatamente con questo metodo.

19 gen 2011 18:08:23
Commenti

Grazie Rarst, devo deserializzare l'array prima di passarlo a $myqueryCurrent e $myposts?

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

@Scott B secondo il tuo codice attuale dovrai scorrere l'array per negare i valori e aggiungerli alla stringa. Penso sarebbe più semplice usare category__not_in invece di cat e passare direttamente l'array di ID.

Rarst Rarst
19 gen 2011 18:27:24

Ho modificato il codice. Mi bastava eseguire il metodo implode sulla variabile. Sembra funzionare. Devo solo rimuovere il post corrente dal loop di output.

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

@Scott B ah, ho frainteso leggermente, pensavo che volessi escluderli piuttosto che includerli. Sì, in tal caso implode andrà benissimo.

Rarst Rarst
19 gen 2011 18:38:46