Recupera solo i termini in uso

18 mar 2024, 18:39:15
Visualizzazioni: 59
Voti: 1

Sto attualmente usando term_exists( $term, $taxonomy ); in una condizione, ma il problema è che include termini che non sono in uso (sebbene esistano nella lista delle categorie).

Esiste qualcosa che posso usare oltre a term_exists che includerà le categorie solo se sono in uso? Oppure devo in qualche modo filtrare per ottenere i termini in uso?

Sto filtrando un archivio di proprietà immobiliari tramite un elemento select. Ogni settimana, quando vengono designate le case aperte, applico la categoria 'Open House' a queste proprietà, permettendo ai visitatori di filtrare per vedere tutte le case aperte. Dopo il weekend, rimuovo la categoria open house da ogni annuncio. Esempio: https://megangulick.com/agent-listings/ (attualmente sto modificando manualmente l'opzione, quindi 'Open House' non appare come opzione).

Quello che voglio fare è cambiare l'opzione iniziale del select in base alla presenza o meno di case aperte attualmente designate.

Ecco come appare il mio codice attuale:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<select name="listingcat" id="listingcat" onchange="submit()">
<?php //questa è la parte per cui ho bisogno di una soluzione
$cat = (term_exists('Open House', $categories));
if $cat {
    echo '<option value="">Seleziona quartiere o casa aperta</option>';
} else { 
    echo '<option value="">Seleziona quartiere</option>';
}
?>
<?php 
    foreach ($categories as $category) : 
    echo '<option value="'.$category->name.'"';
    if(isset($_GET['listingcat']) && ($_GET['listingcat'] == $category->name)) { 
        echo ' selected="selected"'; 
    } 
    echo '>'.$category->name.'</option>';
    endforeach; 
?>
</select>

Il compito qui è determinare se un termine specifico (es. Open House) è in uso, quindi utilizzare queste informazioni per un'istruzione condizionale if/else.

6
Commenti

Hai provato ad aggiungere &hide_empty=1 nella tua stringa di query?

birgire birgire
19 mar 2024 17:10:34

Intendi questo?
<?php $categories = get_categories('taxonomy=listing-category&post_type=listings&hide_empty=1'); ?> Non ha alcun effetto.

Ray Gulick Ray Gulick
19 mar 2024 17:24:09

Dovrebbe nascondere quelli vuoti di default comunque, credo di non aver capito bene la configurazione e la domanda.

birgire birgire
19 mar 2024 18:03:08

Il menu a discesa mostra i termini perfettamente, mostrando solo quelli che sono in uso. Quello che sto cercando di fare è mostrare una prima opzione diversa a seconda se 'Open House' è in uso. Sospetto che 'term exists' sia la funzione sbagliata da usare, poiché ottiene tutti i termini, in uso o meno. SE 'Open House' è tra i termini attivi ALLORA MOSTRA <option value="">Seleziona quartiere o open house</option> ALTRIMENTI MOSTRA <option value="">Seleziona quartiere</option>

Ray Gulick Ray Gulick
19 mar 2024 21:29:45

Se stai cercando di determinare se un dato post ha un dato termine, puoi usare has_term() -- qualcosa come has_term( 'Open House', 'listing-category', get_the_ID() ) potrebbe essere ciò di cui hai bisogno invece della tua chiamata term_exists().

Pat J Pat J
20 mar 2024 02:48:29

Non sto cercando di determinare se un dato post ha il termine, sto cercando di determinare se QUALSIASI post ha un dato termine. Ho provato has_term; non funziona. Sospetto di aver bisogno di un condizionale in_array.

Ray Gulick Ray Gulick
20 mar 2024 11:40:30
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 2
0

Ho iniziato a ricercare gli array di termini e ho trovato una soluzione funzionante per creare una condizione basata sul fatto che un termine sia o meno in uso da parte di qualsiasi articolo:

<?php $categories = get_categories('taxonomy=listing-neighborhood&post_type=listings'); ?>
<?php 
    $term_name = wp_list_pluck( $categories, 'name' );
    $this_name= 'Open House';
    if( in_array( $this_name, $term_name ) ){
        echo '<option value="">Seleziona stato o open house</option>';
    } else { 
        echo '<option value="">Seleziona stato (mostra tutto per default)</option>';
    }
?>

Apprezzo l'aiuto di tutti. Penso che la mia domanda iniziale fosse fuorviante, non era la domanda che dovevo porre per trovare la soluzione.

20 mar 2024 13:31:05
2
-1

Per recuperare solo i termini che sono associati a post in uso, puoi utilizzare la funzione get_terms() con il parametro pad_counts impostato su true. Questo assicurerà che la proprietà count di ogni oggetto termine rifletta il numero di post associati. Puoi poi filtrare i termini con un conteggio di 0

$taxonomy = 'your_taxonomy'; // Sostituisci 'your_taxonomy' con il nome della tua tassonomia
$terms = get_terms(array(
    'taxonomy' => $taxonomy,
    'pad_counts' => true, // Imposta su true per includere il conteggio dei post associati
));

// Filtra i termini per includere solo quelli con post associati
$used_terms = array_filter($terms, function($term) {
    return $term->count > 0;
});

// Controlla se sono stati recuperati termini
if (!empty($used_terms)) {
    foreach ($used_terms as $term) {
        // Stampa le informazioni del termine
        echo '<p>Nome Termine: ' . $term->name . '</p>';
        echo '<p>ID Termine: ' . $term->term_id . '</p>';
        echo '<p>Slug Termine: ' . $term->slug . '</p>';
        echo '<p>Descrizione Termine: ' . $term->description . '</p>';
        echo '<p>Conteggio Post: ' . $term->count . '</p>';
        // Puoi stampare ulteriori informazioni sul termine se necessario
    }
} else {
    echo 'Nessun termine trovato con post associati.';
}
19 mar 2024 05:18:26
Commenti

Richiederà una riscrittura più ampia di quanto sperassi, ma sembra promettente. Tornerò con i risultati più tardi questa mattina. Grazie.

Ray Gulick Ray Gulick
19 mar 2024 10:46:29

Questo non funziona davvero nella mia istanza (aggiungendo il mio codice esistente e ulteriori informazioni nella mia domanda originale).

Ray Gulick Ray Gulick
19 mar 2024 14:00:27