Controllare se il tipo di post ha un termine
Ho un tipo di post personalizzato chiamato articles
. Ho anche creato una tassonomia chiamata subject
. Ogni articolo ha un soggetto, proprio come i post hanno le categorie.
Ora il problema. Quando mi trovo su page-articles.php
(page-slug.php
), devo controllare quale soggetto ha l'articolo. Come posso farlo?! Ho navigato sul web per giorni senza trovare alcuna soluzione.
Quello che penso è che in qualche modo devo controllare la tassonomia subject se corrisponde a determinati criteri. Tipo:
if (is_term('news', 'subject'){
// fai questo
}
Ma non riesco proprio a capire come funziona! La funzione is_term
non fa questo, e non riesco a trovare nessun'altra funzione!

if( has_term( 'jazz', 'genre' ) ) {
// fai qualcosa
}

Ho provato il codice qui sotto e funziona -- è questo che stavi cercando?
<?php
// recupera il tuo custom post type e li mostra tutti
query_posts('post_type=articles&posts_per_page=-1');
if ( have_posts() ) : while ( have_posts() ) : the_post();
// puoi mostrare titolo, permalink, ecc. in qualsiasi punto del loop
// ottieni tutti gli elementi della tua tassonomia personalizzata
$terms = get_the_terms($post->ID, 'Subject');
// scorri ogni termine e fai il tuo controllo
foreach ( $terms as $term ) {
if($term->name == 'Termine che stai cercando') {
// fai qualcosa qui
}
}
endwhile; endif;
?>
Sostituisci 'Termine che stai cercando' qui sopra con il nome effettivo del subject che vuoi verificare, non lo slug.
Modifica: Non sono un esperto di performance del database, quindi non sono sicuro che questo sia il modo ottimale per recuperare le informazioni che cerchi -- sono aperto a suggerimenti da altri.

Ho avuto anch'io una lotta interessante con questo problema.
Ho utilizzato http://codex.wordpress.org/Function_Reference/get_the_terms http://codex.wordpress.org/Function_Reference/is_object_in_term
Dovevo mostrare intestazioni di categorie e altri metadati in base alla presenza di tag di tassonomia.
Ho ottenuto risultati imprevedibili con is_object_in_term controllando un ARRAY di tag specifici, ma forse ciò che ho fatto può essere utile a qualcun altro. Alla fine ho risolto usando NULL, ma avevo solo bisogno di verificare se una tassonomia esistesse e QUALSIASI termine sotto di essa fosse applicato al post visualizzato, così da poter mostrare determinati elementi.
Presumo che se stai cercando solo UN termine, gli esempi standard nella pagina del codex dovrebbero aiutare. Qualcosa come...
if ( is_object_in_term( $post->ID, 'news', 'subject' ) ) :
echo 'SI';
else :
echo 'NO';
endif;
Il mio codice rilevante qui sotto:
$heading_nicename = array('Categoria','Quartieri','Codici Postali','Agenzie Membro','Trasporto Pubblico più Vicino');
$tax_slug = array('category','neighborhoods','zip_codes','member_agencies','nearest_public_transportation');
$heading_key = 0;
$termindex = 0;`
foreach ( $tax_slug as $taxonomy ) {
//usato per mostrare i termini come link
$object_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'all'));
//usato per verificare se i termini della tassonomia si applicano al post
$o_terms = get_the_terms( $post->ID, $taxonomy );
if ( $o_terms && ! is_wp_error( $o_terms ) ) {
$check_these_terms = array();
}
foreach ( $o_terms as $term ) {
$check_these_terms[] = $term->slug;
//echo $term->slug.'<br/>';
}
$o_list = join( ", ", $check_these_terms );
//echo 'tassonomia: '.$taxonomy.'<br/>';
//echo 'termini: '.$o_list.'<br/>';
//risultati imprevedibili
//if ( is_object_in_term( $post->ID, $taxonomy, array($o_list ) ){
//echo '<h4>'.$heading_nicename[$heading_key].'</h4>';
//}
//Alla fine è un controllo per QUALSIASI termine sotto una tassonomia
if ( is_object_in_term( $post->ID, $taxonomy, null ) ){
echo '<h4>'.$heading_nicename[$heading_key].'</h4>';
}
$heading_key++;
echo '<p>';
$endindex = count($object_terms);
$termloop = 0;
foreach ($object_terms as $term) {
echo '<a href="' . esc_attr(get_term_link($term, $taxonomy)) . '" title="' . sprintf( __( "Visualizza tutti i post in %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>';
//pulizia delle virgole
if ($termloop !== ($endindex - 1)){
echo ', ';
$termloop++;
}
$termindex++;
}
echo '</p>';
}`
