web-dev-qa-db-fra.com

Vérifiez si le type de message a terme

J'ai un type de message personnalisé, appelé articles. J'ai également créé une taxonomie appelée subject. Chaque article a un sujet, tout comme les articles ont des catégories.

Maintenant au problème. Lorsque je suis sur le page-articles.php (page-slug.php), il doit vérifier le sujet de l'article. Comment puis je faire ça?! Cela fait des jours que je surfe sur le Web sans trouver de solution.

Ce que je pense, c’est que d’une certaine manière, je dois vérifier le sujet de la taxonomie s’il correspond à un critère. Comme:

if (is_term('news', 'subject'){
// do this
}

Mais je ne peux vraiment pas comprendre comment ça marche! Le is_term ne fait pas cela, et je ne trouve aucune autre fonction non plus.

6
Andreas Olsson
if( has_term( 'jazz', 'genre' ) ) {
    // do something
}

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

10
Gavin

J'ai essayé le code ci-dessous et cela fonctionne - est-ce ce que vous cherchez?

<?php
    // grab your custom post type and output them all
    query_posts('post_type=articles&posts_per_page=-1');

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

        // you can output your title, permalink, etc. anywhere within the loop

        // get all items in your custom taxonomy
        $terms = get_the_terms($post->ID, 'Subject');

        // loop through each term and perform your check
        foreach ( $terms as $term ) {
            if($term->name == 'Term you are checking for') {
                // do stuff here
            }
        }
    endwhile; endif;
?>

Remplacez "Terme que vous recherchez" ci-dessus par le nom réel du sujet que vous vérifiez, pas le slug.

Edit: Je ne suis pas un expert en performances de base de données, donc je ne suis pas sûr que ce soit la meilleure façon de récupérer les informations que vous recherchez - je suis ouvert à la participation des autres.

3
Ryan

J'ai moi-même eu une lutte intéressante avec cela.

J'utilise http://codex.wordpress.org/Function_Reference/get_the_termshttp://codex.wordpress.org/Function_Reference/is_object_in_term

Je devais afficher les en-têtes de catégorie et autres métadonnées en fonction de la présence de balises taxonomiques.

J'ai eu des résultats imprévisibles avec is_object_in_term recherchant un tableau de balises spécifiques, mais peut-être que ce que j'ai fait est utile à quelqu'un d'autre. J'ai fini par le faire fonctionner en utilisant NULL, mais je devais simplement vérifier si une taxonomie existait et TOUS les termes sous-jacents s'appliquaient à la publication en cours d'affichage afin que je puisse retrouver certains éléments d'affichage.

Je suppose que si vous recherchez un seul terme, les exemples d'actions sur la page du codex devraient vous aider. Quelque chose comme...

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

Mon code pertinent ci-dessous:

 $heading_nicename = array('Category','Neighborhoods','Zip Codes','Member Agencies','Nearest Public Transportation');
 $tax_slug = array('category','neighborhoods','Zip_codes','member_agencies','nearest_public_transportation');
 $heading_key = 0;
 $termindex = 0;`

  foreach ( $tax_slug as $taxonomy ) {
  //used to spit out terms as links
  $object_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'all'));

  //used in a check to see if tax terms even apply to 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 'taxonomy: '.$taxonomy.'<br/>';
    //echo 'terms: '.$o_list.'<br/>';

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

 //Ends up being a check for ANY term under a taxonomy
    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( __( "View all posts in %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>';
  //clean up commas
  if ($termloop !== ($endindex - 1)){
    echo ', ';
    $termloop++;
  }
  $termindex++;
}
    echo '</p>';

  }`
1
Chrisdigital

Avez-vous essayé d'utiliser wp_get_object_terms?

Quelque chose dans le sens de

$article_subjects = wp_get_object_terms($post->ID, 'subject');
0
Wyck

si chaque article a un sujet, vous n'avez pas besoin de vérifier si il a un sujet, non? Ensuite, vous pouvez utiliser quelque chose comme ceci:

<?php echo get_the_term_list( $post->ID, 'subject', __('Subject: ', 'theme-name'), '  ', '' ); ?>
0
user2015