Verifica se esistono post in una categoria del custom post type, fuori dal loop

14 feb 2013, 18:29:34
Visualizzazioni: 20.6K
Voti: 2

Sto creando un menu di navigazione, fuori dal loop principale, che include menu a discesa. Ho un custom post type chiamato 'Events', che ha le sue proprie categorie. Vorrei che ci fosse un menu a discesa se esistono post all'interno di quel custom post type e categoria, ma non sono sicuro quali funzioni dovrei usare per determinare questo...

Ho questo codice...

$hasposts = get_posts('post_type=Events&category=40');
if($hasposts) {
    ..// mostra il menu a discesa
} 

Dovrei usare get_posts()? Tutto quello che ottengo come risultato è un array vuoto, ma so che alcune di quelle categorie contengono dei post...

Grazie mille, WA.

0
Tutte le risposte alla domanda 4
7

Tutto si riduce a WP_Query alla fine, anche se usi get_posts, ecco la mia versione modificata:

$hasposts = get_posts('post_type=sc-events&category=40');
if( !empty ( $hasposts ) ) {
    ..// mostra il menu a discesa
}

oppure

$query = new WP_Query(array(
    'post_type' => 'sc-events',
    'category' => 40
));
if( $query->have_posts() ){
    echo 'abbiamo articoli';
} else {
    echo 'nessun articolo trovato';
}

Anche se questo funzionerà, c'è un'alternativa ispirata alla tua stessa risposta che utilizza lo slug della categoria anziché il suo ID:

$term = get_term_by('name', 'qualunque sia il nome della categoria 40', 'category');
if($term != false ){
    if($term->count > 0 ){
        // abbiamo articoli
    }
}
14 feb 2013 19:01:03
Commenti

il post type 'Events' ha la sua tassonomia personalizzata, quindi l'ID della categoria è specifico solo per il custom post type. Sono d'accordo sull'hardcoding, ma sto modificando il codice di qualcun altro. La prima soluzione che hai suggerito però continua a restituire un array vuoto, anche quando ci sono post all'interno di quella categoria. E il secondo suggerimento... è un po' più articolato di quello che cercavo perché in realtà non dovrò mostrare nulla da quella query. Ho solo bisogno di verificare se ci sono post nella categoria. Apprezzo molto il tuo input.

RCNeil RCNeil
14 feb 2013 19:07:38

la seconda soluzione è identica alla prima, è ciò che get_posts fa internamente, e significano esattamente la stessa cosa e funzionano allo stesso modo. Solo perché hai fatto una query, non significa che devi fare il loop

Tom J Nowell Tom J Nowell
14 feb 2013 19:09:31

Inoltre, se hai una tassonomia personalizzata, perché stai usando 'category=40' e non 'customtaxonomyname=40'?

Tom J Nowell Tom J Nowell
14 feb 2013 19:09:56

grazie per l'input. In realtà non ha una tassonomia, ora che sto esaminando il file functions.php. Sta utilizzando le Categorie dai Post Types. Quindi, anche considerando tutto questo, perché entrambe le soluzioni mi restituiscono un array vuoto, anche se eseguo una query solo per il numero di Categoria, senza collegarlo a tipi di post specifici. È rilevante?

RCNeil RCNeil
14 feb 2013 19:23:44

Questo suggerisce informazioni mancanti, puoi pubblicare il codice di registrazione per il tuo post type?

Tom J Nowell Tom J Nowell
14 feb 2013 19:34:42

Ancora una volta... non è il mio codice, ma lo sviluppatore ha utilizzato un plugin http://wordpress.org/extend/plugins/types/ per svilupparli.

RCNeil RCNeil
14 feb 2013 19:44:46

continuiamo questa discussione nella chat

RCNeil RCNeil
14 feb 2013 19:49:14
Mostra i restanti 2 commenti
0

Se desideri ottenere un array con tutti i termini della tua tassonomia personalizzata, con la condizione aggiuntiva che contengano almeno un articolo, questa è la funzione che stai cercando:

get_terms(
    'group',
    array(
        'hide_empty' => true
    )
);

Questa funzione recupererà le informazioni relative ai termini, non agli articoli stessi. L'unica cosa che saprai sugli articoli in questo scenario è che esistono all'interno di quei termini, nient'altro. Se i menu a discesa mostreranno qualche tipo di informazione riguardante gli articoli, forse avrai bisogno di qualcosa di diverso dalla funzione sopra. Altrimenti, get_terms è la funzione che stai cercando.

14 feb 2013 19:21:05
1

Sono riuscito a eseguire questo controllo condizionale attraverso il seguente codice -

if (get_category('40')->category_count > 0) {
    ..//mostra il menu a discesa
}
14 feb 2013 19:24:46
Commenti

Questo fallirà se il termine 40 viene eliminato o il suo ID cambia.

Tom J Nowell Tom J Nowell
14 feb 2013 19:34:05
0

Non c'è alcun motivo per restituire l'intero oggetto get_posts quando puoi ottimizzare meglio le cose utilizzando il parametro fields per restituire solo gli ID

$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 ) ) {
    ..// mostra il menu a discesa
}
4 ago 2015 23:54:10