Comprobar si un tipo de entrada tiene un término

30 mar 2011, 07:26:47
Vistas: 30.1K
Votos: 6

Tengo un tipo de entrada personalizada llamada articles. También he creado una taxonomía llamada subject. Cada artículo tiene un tema, al igual que las entradas tienen categorías.

Ahora el problema. Cuando estoy en page-articles.php (page-slug.php), necesito comprobar qué tema tiene el artículo. ¿Cómo puedo hacer eso? He estado navegando por la web durante días sin encontrar ninguna solución.

Lo que estoy pensando es que de alguna manera tengo que comprobar si la taxonomía subject coincide con un criterio. Algo como:

if (is_term('news', 'subject'){
    // hacer esto
}

¡Pero realmente no puedo entender cómo funciona! La función is_term no hace eso, y no puedo encontrar ninguna otra función tampoco.

2
Comentarios

¿Usar has_term?

t31os t31os
30 mar 2011 13:08:28

Para aclarar, ¿estás preguntando cómo verificar si un tema específico está asociado con un artículo dado, o un método para listar los tema(s) de un artículo? He visto respuestas para ambos casos en las respuestas, y no está claro cuáles abordan mejor tu situación sin saber más detalles.

Justin Bell Justin Bell
30 sept 2014 01:37:45
Todas las respuestas a la pregunta 5
1
10
if( has_term( 'jazz', 'genre' ) ) {
    // hacer algo
}

http://codex.wordpress.org/Function_Reference/has_term

13 dic 2012 01:45:52
Comentarios

@user4310, El primer parámetro es el término que estás buscando y el segundo parámetro es la taxonomía a la que pertenece ese término.

s_ha_dum s_ha_dum
13 dic 2012 02:25:56
0

Probé el código a continuación y funciona -- ¿es esto lo que estás buscando?

<?php
    // obtén tu tipo de publicación personalizada y muestra todas
    query_posts('post_type=articles&posts_per_page=-1');

    if ( have_posts() ) : while ( have_posts() ) : the_post();

        // puedes mostrar tu título, enlace permanente, etc. en cualquier parte del bucle

        // obtén todos los elementos en tu taxonomía personalizada
        $terms = get_the_terms($post->ID, 'Subject');

        // recorre cada término y realiza tu verificación
        foreach ( $terms as $term ) {
            if($term->name == 'Término que estás verificando') {
                // haz lo que necesites aquí
            }
        }
    endwhile; endif;
?>

Reemplaza 'Término que estás verificando' arriba con el nombre real del tema contra el que estás verificando, no el slug.

Edición: No soy un experto en rendimiento de bases de datos, así que no estoy seguro si esta es la forma óptima de recuperar la información que buscas -- estoy abierto a sugerencias de otros.

30 mar 2011 08:02:07
1

Yo mismo he tenido una lucha interesante con esto.

Estoy usando http://codex.wordpress.org/Function_Reference/get_the_terms http://codex.wordpress.org/Function_Reference/is_object_in_term

Necesitaba mostrar encabezados de categorías y otros metadatos dependiendo de la presencia de etiquetas de taxonomía.

Obtuve resultados impredecibles con is_object_in_term al verificar un ARRAY de etiquetas específicas, pero quizás lo que hice le sirva a alguien más. Terminé haciéndolo funcionar usando NULL, pero solo necesitaba verificar si existía una taxonomía y CUALQUIER término bajo ella aplicaba a la entrada que se estaba viendo para poder mostrar ciertos elementos.

Supongo que si solo estás buscando UN término, los ejemplos estándar en la página del codex deberían ayudar. Algo como...

if ( is_object_in_term( $post->ID, 'news', 'subject' ) ) :
echo 'SÍ';
else :
echo 'NO';
endif;

Mi código relevante a continuación:

 $heading_nicename = array('Categoría','Barrios','Códigos Postales','Agencias Miembro','Transporte Público Más Cercano');
 $tax_slug = array('category','neighborhoods','zip_codes','member_agencies','nearest_public_transportation');
 $heading_key = 0;
 $termindex = 0;`

  foreach ( $tax_slug as $taxonomy ) {
  //usado para mostrar términos como enlaces
  $object_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'all'));

  //usado en una verificación para ver si los términos de taxonomía aplican a la entrada
  $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 'taxonomía: '.$taxonomy.'<br/>';
    //echo 'términos: '.$o_list.'<br/>';

 //resultados impredecibles
 //if ( is_object_in_term( $post->ID, $taxonomy, array($o_list ) ){
    //echo '<h4>'.$heading_nicename[$heading_key].'</h4>';
    //}

 //Termina siendo una verificación para CUALQUIER término bajo una taxonomía
    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( __( "Ver todas las entradas en %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>';
  //limpiar comas
  if ($termloop !== ($endindex - 1)){
    echo ', ';
    $termloop++;
  }
  $termindex++;
}
    echo '</p>';

  }`
2 jun 2013 05:54:49
Comentarios

la primera porción de código funcionó para mi caso.

breezy breezy
19 abr 2017 23:26:37
0

¿Has probado a usar wp_get_object_terms?

Algo como:

$article_subjects = wp_get_object_terms($post->ID, 'subject');
30 mar 2011 07:57:55
0

si cada artículo tiene un tema, no necesitas comprobar si tiene un tema, ¿verdad? Entonces puedes usar algo como esto:

<?php echo get_the_term_list( $post->ID, 'subject', __('Tema: ', 'theme-name'), '  ', '' ); ?>
30 mar 2011 14:02:52