web-dev-qa-db-fra.com

Charger les posts personnalisés avec le même tag que la page

J'utilise ce plugin pour ajouter des balises à une page: http://wordpress.org/extend/plugins/post-tags-and-categories-for-pages/

Et j'ai ajouté la prise en charge des balises pour le message personnalisé:

function codex_custom_init() {
    $args = array(
      'public' => true,
      'has_archive' => true,
      'label'  => 'Doing',
      'taxonomies' => array('post_tag'),
      'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt')
    );
    register_post_type( 'doing', $args );
}
add_action( 'init', 'codex_custom_init' );

Est-ce possible de le faire dans chaque page avec une balise spécifique pour afficher les publications personnalisées associées ayant la même balise que la page? Comment puis-je charger sur la page les publications personnalisées liées aux balises?

J'ai essayé avec ce code mais ne montre aucun message lié:

  <?php
      $tags = wp_get_post_tags($post->ID);
      if ($tags) {
          echo 'Related Posts';
          $first_tag = $tags[0]->term_id;
          $args=array(
              'tag__in' => array($first_tag),
              'post__not_in' => array($post->ID),
              'posts_per_page'=>5,
              'caller_get_posts'=>1
          );
          $my_query = new WP_Query($args);
          if( $my_query->have_posts() ) {
              while ($my_query->have_posts()) : $my_query->the_post(); ?>
              <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a>

               <?php
               endwhile;
          }
          wp_reset_query();
      }
  ?>
4
wpuser

Vous devez spécifier un type de publication dans vos arguments WP_Query lorsque vous devez interroger tout autre type de publication, acceptez la construction dans le type de publication post.

Par défaut, post_type est défini sur post. Ainsi, si aucun type de publication spécifique n'est défini manuellement par l'utilisateur, WP_Query interroge les publications du type de publication post.

De plus, caller_get_posts est obsolète depuis très longtemps. Si le débogage était activé, vous auriez reçu un avis de dépréciation à ce sujet. Les arguments corrects à utiliser sont ignore_sticky_posts.

Je n’utiliserais pas non plus le $post global car il n’est pas fiable. Pour des raisons de fiabilité, utilisez plutôt $GLOBALS['wp_the_query']->get_queried_object(). Vous pouvez lire à ce sujet dans ma réponse ici

get_the_tags() est également plus rapide que wp_get_post_tags() car cette dernière nécessite un appel de base de données supplémentaire.

Une dernière note, wp_reset_query() est utilisée avec query_posts, la fonction correcte à utiliser avec WP_Query est wp_reset_postdata()

Essentiellement, vous pouvez essayer ce qui suit

$post_id = $GLOBALS['wp_the_query']->get_queried_object_id();
$tags = get_the_tags( $post_id );
if (    $tags
     && !is_wp_error( $tags ) 
) {
    $args = [
        'post__not_in' => [$post_id],
        'post_type'    => 'doing',
        'tag__in'      => [$tags[0]->term_id],
        // Rest of your args
    ];
    $my_query = new WP_Query( $args );

    // Your loop

    wp_reset_postdata();
}
5
Pieter Goosen

Mon premier point d’appel est d’appeler global $post; - car cela vous permet d’utiliser $post->ID ... si vous l’utilisez, la prochaine étape consiste à afficher chaque partie séparément, par exemple.

print_r($tags);

echo $first_tag;

voir ce qui est affiché dans chaque partie, cela aidera à diagnostiquer le problème, car sans voir votre code fonctionner, nous ne pouvons pas dire pourquoi il ne fonctionne pas.

2
Gareth Gillman