it-swarm.com.de

Beiträge nach Tag auf Seite anzeigen

Ich versuche, eine erweiterte WordPress-Seite zu erstellen, die den regulären Inhalt sowie einen zweiten Abschnitt auf derselben Seite enthält, in dem die neuesten Beiträge des X-Tags angezeigt werden. Beispielsweise wird eine Seite über "Katzen" erstellt, die Bilder, Inhalte usw. enthält. Nach dem Suchbegriff möchte ich die letzten X Beiträge anzeigen, die mit "Katzen" gekennzeichnet sind. Ist das möglich, ohne Plugins zu verwenden und ohne eine benutzerdefinierte Seitenvorlage für jede Seite zu erstellen?

Möglicherweise ist dies mit der Funktion für benutzerdefinierte Felder und mehreren Schleifen möglich. Z.B. Erhalte X Anzahl von Beiträgen aus einem benutzerdefinierten Feld mit dem Wert "cats". Ich habe schon eine Weile damit zu kämpfen und kann anscheinend keine Lösung finden, bei der nicht für jede einzelne Seite eine Vorlage erstellt wird.

Vielen Dank!

3
Bill

Dies sollte den Job machen. Es wird nach Beiträgen gesucht, die mit dem Titel der aktuellen Seite versehen sind. Es ist nicht erforderlich, if (have_posts()): für eine Seitenvorlage zu verwenden: Wenn die Vorlage aufgerufen wird, liegt dies daran, dass ein Beitrag vorhanden ist :)

<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>

Wenn Sie der Seite lieber ein benutzerdefiniertes Meta hinzufügen möchten (anstatt nur den Titel zu verwenden), können Sie der Seite auch ein benutzerdefiniertes Meta-Feld hinzufügen. Füge den folgenden Code zu deiner functions.php hinzu (nb: dies fügt die Meta Box allen Seiten hinzu)

/** 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');

Dann könnte Ihr page.php-Code so aussehen:

<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

Führe eine WP_Query im zweiten Teil deiner Seite durch:

<!-- 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>

Ich arbeite derzeit an einem Thema für WordPress und mache dieses Zeug tatsächlich, also funktioniert es!

2
Zaidar

Es gibt oben bereits Antworten zur Verwendung von Schleifen, sodass ich keine weiteren Informationen zu wp get recent posts oder Taxonomy Parameters hinzufüge.

Möglicherweise möchten Sie Ihren Code jedoch in ein Widget einbetten, was das Hinzufügen zu Ihren vorhandenen Vorlagen ein wenig erleichtert.

0
jgraup