web-dev-qa-db-fra.com

Afficher les messages par tag sur la page

J'essaie de créer une page WordPress avancée affichant le contenu normal, ainsi qu'une deuxième section sur la même page contenant les dernières publications de la balise X. Par exemple, une page est créée à propos de "chats", contient des images, du contenu, etc. Par la suite, j'aimerais afficher les X derniers posts marqués avec "chats". Est-ce possible sans utiliser de plug-ins et sans créer de modèle de page personnalisé pour chaque page?

C'est peut-être faisable avec la fonctionnalité de champs personnalisés et plusieurs boucles. Par exemple. obtenir un nombre X de messages d'un champ personnalisé avec la valeur "chats". Cela fait quelque temps que je lutte avec cela, je n'arrive pas à trouver une solution qui ne nécessite pas de créer un modèle pour chaque page.

Merci!

3
Bill

Cela devrait faire le travail. Il va vérifier les messages qui ont été marqués avec le titre de la page en cours. Il n'est pas nécessaire d'utiliser if (have_posts()): sur un modèle de page: si le modèle est appelé, il le sera car il y a un article :)

<div class="page-loop">

    <?php
      while (have_posts()) : the_post();
        $page_title = strtolower(get_the_title());
        the_title('<h1>','</h1>');
      ?>
        <p><?php the_content(); ?><p>
    <?php endwhile;?>

</div>

<!-- Get the most recent post that has been tagged with the page title -->
<div class="related-posts">

    <?php
      $args = array(
        'tag' => $page_title,
        'posts_per_page' => 1,
      );
      $query = new WP_Query($args);
      if ($query->have_posts()) :
        while ($query->have_posts()) : $query->the_post();
          the_title('<h1>','</h1>');
        ?>
        <p><?php the_content(); ?><p>
    <?php endwhile; else: ?>
      <p>Sorry, no posts with this tag!</p>
    <?php endif; wp_reset_query(); ?>

</div>

Si vous préférez utiliser des méta personnalisées pour ajouter le "tag" à la page (au lieu d'utiliser simplement le titre), vous pouvez ajouter une boîte à méta personnalisée à la page, comme ceci. Ajoutez le code suivant à votre functions.php (nb: cela ajoutera la boîte méta à toutes les pages)

/** register the meta box */
function my_theme_add_meta_boxes() {
    global $post;
    add_meta_box(
        'my-theme-meta',
        'Choose a tag',
        'my_theme_print_page_meta',
        'page',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'my_theme_add_meta_boxes');
/** Add extra meta to the page */
function my_theme_print_page_meta() {
    global $post;
    $page_tags = get_post_meta($post->ID, '_page-tags', true);
    ?>
    <label for="page-tags">Add a 'tag'</label>
    <input type="text" class="page-tags" name="page-tags" value="<?php echo esc_attr($page_tags); ?>" />
    <?php
}
/** Save post meta */
function my_theme_save_custom_meta() {
    global $post;

    // Stops WP from clearing post meta when autosaving
    if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
      return $post->ID;
    }
    if (isset($_POST['page-tags'])) {
        $clean = sanitize_text_field($_POST['page-tags']);
        update_post_meta($post->ID, '_page-tags', $clean);
    }

}
add_action('save_post', 'my_theme_save_custom_meta');

Ensuite, votre code page.php pourrait ressembler à ceci:

<div class="page-loop">

    <?php
      while (have_posts()) : the_post();
        $page_tags = get_post_meta($post->ID, '_page-tags', true);
        the_title('<h1>','</h1>');
      ?>
        <p><?php the_content(); ?><p>
    <?php endwhile;?>

</div>

<?php if ($page_tags): ?>

<!-- Get the most recent post that has been tagged with the page title -->
<div class="related-posts">

    <?php
      $args = array(
        'tag' => $page_tags,
        'posts_per_page' => 1,
      );
      $query = new WP_Query($args);
      if ($query->have_posts()) :
        while ($query->have_posts()) : $query->the_post();
          the_title('<h1>','</h1>');
        ?>
        <p><?php the_content(); ?><p>
    <?php endwhile; else: ?>
      <p>Sorry, no posts with this tag!</p>
    <?php endif; wp_reset_query(); ?>

</div>

<?php endif; // There are 'page tags' ?>
4
Richard Sweeney

Faites un WP_Query dans la deuxième partie de votre page:

<!-- First part of your page!-->
<div class="firstcontent">

    <?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
        <p><?php the_title(); ?><p>
        <p><?php the_content(); ?><p>
    <?php endwhile; endif;?>

</div>

<!-- And now you call the WP_Query() !-->
<div class="secondcontent">

    <!-- get the main query !-->
    <?php $wp_query = new WP_Query(array(
        'post_type' => 'post'
    ));?>

    <!-- and you can use it as above !-->
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
        <p><?php the_title(); ?><p>
        <p><?php the_content(); ?><p>
    <?php endwhile; endif;?>

</div>

Je travaille actuellement avec un thème sur WordPress, et je suis en train de le faire, alors ça marche!

2
Zaidar

Il y a déjà des réponses ci-dessus sur la façon d'utiliser les boucles, donc je n'en ajouterai pas plus sur wp obtenir les publications récentes ou Paramètres de taxonomie .

Mais vous voudrez peut-être envisager d’envelopper votre code dans un Widget , ce qui facilitera l’ajout de modèles à vos modèles existants.

0
jgraup