在wordpress中的同一页面上有两个自定义循环?

时间:2017-09-23 10:50:01

标签: wordpress loops foreach while-loop pagination

我在这里找不到任何东西,所以我把这个问题带给你。以下代码主要是我想要的,只有页面循环不起作用:当我想导航到较旧的帖子时,看到的页面再次显示相同的新帖子。我该怎么做呢?

所以index.php有两个循环:

<?php
  $args = array( 'numberposts' => 1, 
    'post_status'=>"publish",
    'post_type'=>"post",
    'orderby'=>"post_date");
  $postslist = get_posts( $args );
  foreach ($postslist as $post) :  setup_postdata($post); 
?>

  // regular post html with wp tags

<?php endforeach; ?>

<?php
  query_posts('posts_per_page=12&offset=1');
  if (have_posts()) : ?>

<h3>Headline</h3>

<?php while (have_posts()) : the_post(); ?>

  // regular html with wp tags for these posts (teasers, with the_excerpt)

  <?php endwhile; ?>

    <div class="navigation">
      <span class="nextlink"><?php next_posts_link( 'Older', 0 ); ?></span>
      <span class="previouslink"><?php previous_posts_link( 'Newer' ); ?></span>
    </div>

    <?php else : ?>

    <h3><?php _e('Nothing found'); ?></h3>

  <?php endif; ?>

以下是解释:一位访问博客:最新的博客帖子全长显示在一个区块中,显示12个较旧的帖子(不包括第一个帖子offset,所以2-13)在另一个具有内容预告片和底部的下一个前导航的块中,以显示后期预告14-25等等。 (问题是:它始终是2-13)

//编辑:响应最高答案的代码,现在是index.php的完整代码。请注意,HTML已经更改,因为我使用了规范化的HTML,因为它通常无关紧要。这次是实际代码。

<?php get_header(); ?>

<div class="box blog-block">
  <?php
    $args = array( 'numberposts' => 1, 'post_status'=>"publish",'post_type'=>"post",'orderby'=>"post_date");
    $postslist = get_posts( $args );
     foreach ($postslist as $post) :  setup_postdata($post); ?>
  <span class="head"><?php the_time('j. F Y') ?></span>
  <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
  <div class="entry">
    <?php global $more;
          $more = 1;
          the_content();
    ?>
    <p class="author"><?php the_author(); ?></p>
    <p><a class="more-link" href="<?php the_permalink(); ?>#respond" title="<?php the_title();?>">Kommentieren</a>
  </div>

    <?php endforeach;
    wp_reset_postdata(); /* 1. reset post data */
    ?>

</div>

<div class="box" id="recentposts">

  <?php

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

  $display_count = 12;
  $excluded_count = 1;        
  $offset = ( ($paged-1) * $display_count ) + $excluded_count;

  $args = array(
      'post_status'=>"publish",
      'post_type'=>"post",
      'orderby'=>"post_date",
      'posts_per_page' => $display_count,
      'offset' => $offset,
      'paged' => $paged
  );

  $the_query = new WP_Query( $args );
  if ( $the_query->have_posts() ) : ?>

  <h3>Bisherige Artikel</h3>

  <div class="recentpostsmasonry">

  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

    <div <?php post_class('halb'); ?> id="post-<?php the_ID(); ?>">
      <span class="head"><?php the_time('j. F Y') ?></span>
      <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
      <div class="entry">
        <?php the_excerpt(); ?>
        <p class="more-link"><a href="<?php the_permalink(); ?>">Weiterlesen ...</a></p>
        <p class="comments"><?php edit_post_link(__('Bearbeiten'), '', ' | '); ?> <?php comments_popup_link(__('Schreib den ersten Kommentar'), __('Ein Kommentar'), __('% Kommentare'), '', __('') ); ?></p>
      </div>
    </div>

    <?php endwhile; ?>

  </div>

  <div class="navigation">
    <span class="nextlink" title="Ältere Einträge"><?php next_posts_link( '«', 0 ); ?></span>
    <span class="previouslink" title="Jüngere Einträge"><?php previous_posts_link( '»' ); ?></span>
  </div>

  <?php else : ?>

  <h3><?php _e('Nichts gefunden :('); ?></h3>

  <?php endif; ?>

</div>

我正在尝试使用此代码(14.10.17),但它没有添加正常的页面导航...:

<?php get_header(); ?>

<div class="box blog-block">
  <?php
    $args = array( 'numberposts' => 1, 'post_status'=>"publish",'post_type'=>"post",'orderby'=>"post_date");
    $postslist = get_posts( $args );
     foreach ($postslist as $post) :  setup_postdata($post); ?>
  <span class="head"><?php the_time('j. F Y') ?></span>
  <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
  <div class="entry">
    <?php global $more;
          $more = 1;
          the_content();
    ?>
    <p class="author"><?php the_author(); ?></p>
    <p><a class="more-link" href="<?php the_permalink(); ?>#respond" title="<?php the_title();?>">Kommentieren</a>
  </div>

    <?php endforeach;
    wp_reset_postdata(); /* 1. reset post data */
    ?>

</div>

<div class="box" id="recentposts">

  <?php

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

  $display_count = 12;
  $excluded_count = 1;
  $offset = ( ($paged-1) * $display_count ) + $excluded_count;

  $args = array(
      'post_status'=>"publish",
      'post_type'=>"post",
      'orderby'=>"post_date",
      'posts_per_page' => $display_count,
      'offset' => $offset,
      'paged' => $paged
  );

  $the_query = new WP_Query( $args );
  if ( $the_query->have_posts() ) : ?>



  <h3>Bisherige Artikel</h3>

  <div class="recentpostsmasonry">

  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

    <div <?php post_class('halb'); ?> id="post-<?php the_ID(); ?>">
      <span class="head"><?php the_time('j. F Y') ?></span>
      <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
      <div class="entry">
        <?php the_excerpt(); ?>
        <p class="more-link"><a href="<?php the_permalink(); ?>">Weiterlesen ...</a></p>
        <p class="comments"><?php edit_post_link(__('Bearbeiten'), '', ' | '); ?> <?php comments_popup_link(__('Schreib den ersten Kommentar'), __('Ein Kommentar'), __('% Kommentare'), '', __('') ); ?></p>
      </div>
    </div>

    <?php endwhile; ?>

  </div>

  <div class="navigation">
    <span class="nextlink" title="Ältere Einträge"><?php next_posts_link( '«', 0 ); ?></span>
    <span class="previouslink" title="Jüngere Einträge"><?php previous_posts_link( '»' ); ?></span>
  </div>

  <?php else : ?>

  <h3><?php _e('Nichts gefunden :('); ?></h3>

  <?php endif; ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

新:

<?php get_header(); ?>

<div class="box blog-block">
  <?php
    $args = array( 'numberposts' => 1, 'post_status'=>"publish",'post_type'=>"post",'orderby'=>"post_date");
    $postslist = get_posts( $args );
     foreach ($postslist as $post) :  setup_postdata($post); ?>
  <span class="head"><?php the_time('j. F Y') ?></span>
  <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
  <div class="entry">
    <?php global $more;
          $more = 1;
          the_content();
    ?>
    <p class="author"><?php the_author(); ?></p>
    <p><a class="more-link" href="<?php the_permalink(); ?>#respond" title="<?php the_title();?>">Kommentieren</a>
  </div>

    <?php endforeach;
    wp_reset_postdata(); /* 1. reset post data */
    ?>

</div>

<div class="box" id="recentposts">

  <?php

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

  $display_count = 12;
  $excluded_count = 1;
  $offset = ( ($paged-1) * $display_count ) + $excluded_count;

  $args = array(
      'post_status'=>"publish",
      'post_type'=>"post",
      'orderby'=>"post_date",
      'posts_per_page' => $display_count,
      'offset' => $offset,
      'paged' => $paged
  );

  $the_query = new WP_Query( $args );
  if ( $the_query->have_posts() ) : ?>



  <h3>Bisherige Artikel</h3>

  <div class="recentpostsmasonry">

  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

    <div <?php post_class('halb'); ?> id="post-<?php the_ID(); ?>">
      <span class="head"><?php the_time('j. F Y') ?></span>
      <h3><a href="<?php the_permalink(); ?>" title="<?php the_title();?>"><?php the_title(); ?></a></h3>
      <div class="entry">
        <?php the_excerpt(); ?>
        <p class="more-link"><a href="<?php the_permalink(); ?>">Weiterlesen ...</a></p>
        <p class="comments"><?php edit_post_link(__('Bearbeiten'), '', ' | '); ?> <?php comments_popup_link(__('Schreib den ersten Kommentar'), __('Ein Kommentar'), __('% Kommentare'), '', __('') ); ?></p>
      </div>
    </div>

    <?php endwhile; ?>

  </div>

  <div class="navigation">
    <span class="nextlink" title="Ältere Einträge"><?php next_posts_link( '«', $the_query->max_num_pages ); ?></span>
    <span class="previouslink" title="Jüngere Einträge"><?php previous_posts_link( '»' ); ?></span>
  </div>

  <?php else : ?>

  <h3><?php _e('Nichts gefunden :('); ?></h3>

  <?php endif; ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

1 个答案:

答案 0 :(得分:1)

您尚未设置分页,因此您的查询始终在第1页上认为。

同样根据Code,您不应该使用query_posts - 使用WP_Querypre_get_posts代替,所以我在下面使用WP_Query进行第二次查询

请注意,我假设您在静态主页上使用此功能,但我在评论中添加了自定义页面所需的更改。

<?php
  $args = array( 'numberposts' => 1, 
    'post_status'=>"publish",
    'post_type'=>"post",
    'orderby'=>"post_date");
  $postslist = get_posts( $args );
  foreach ($postslist as $post) :  setup_postdata($post); 
?>

  // regular post html with wp tags

<?php endforeach; 
wp_reset_postdata(); /* 1. reset post data */
?>

<?php
/* Set up your pagination - $paged will contain the current page, telling WP_Query which post to start with (e.g. #13 on page 2) */
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

/*  NOTE: if this is NOT on a static page
get the 'paged' query var instead of 'page', i.e.:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
*/

$display_count = 12; /* variable for the number of posts per page */
$excluded_count = 1; /* the number of posts excluded from the start position */

/* Calculate the offset, i.e. the post number to start the page with
   Normally this is calculated by: ($paged-1) * $display_count 
   so we just need to add 1 for the one we excluded */
$offset = ( ($paged-1) * $display_count ) + $excluded_count;

/* set up your new query passing in the page so WP_Query knows what to return */
$args = array(
    'post_status'=>"publish",
    'post_type'=>"post",
    'orderby'=>"post_date",
    'posts_per_page' => $display_count,
    'offset' => $offset,
    'paged' => $paged
);

/* set up your new query */
$the_query = new WP_Query( $args );
<?php if ( $the_query->have_posts() ) : ?>

    <h3>Headline</h3>

    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>    

        // regular html with wp tags for these posts (teasers, with the_excerpt)

    <?php endwhile; ?>

    <div class="navigation">
      <span class="nextlink"><?php next_posts_link( 'Older', $the_query->max_num_pages ); ?></span>
      <span class="previouslink"><?php previous_posts_link( 'Newer' ); ?></span>
    </div>

    <?php else : ?>

    <h3><?php _e('Nothing found'); ?></h3>

<?php endif; ?>

上面的代码未经测试,但基本逻辑应该是正确的。

<强>更新

WP Developer Resourcesnext_posts_link默认使用全局变量$wp_query,因此要使用自定义查询,将$custom_query->max_num_pages传递到next_posts_link,例如:

<span class="nextlink"><?php next_posts_link( 'Older', $the_query->max_num_pages ); ?></span>
<span class="previouslink"><?php previous_posts_link( 'Newer' ); ?></span>