Paginate recent posts widget

时间:2014-08-05 作者:Chris Edwards

我已经按照这里的建议创建了一个核心的最近帖子小部件的克隆Code for Recent Posts Widget, 但我该如何向该小部件添加分页呢?

我打算对无限滚动使用自动分页,但我不知道从哪里开始。。。

使用Wordpress 3.9.1,因此最流行的小部件分页插件不兼容。

我添加了以下内容:

function my_app_latest_add_query_var() {
  global $wp;
  $wp->add_query_var(\'latest_page\');
}
add_filter(\'init\', \'my_app_latest_add_query_var\');
然后,我得到的小部件会根据我的需要拉出帖子,但分页链接不会显示:

class MyApp_Widget_Recent_Posts extends WP_Widget {
public function __construct() {
    $widget_ops = array(\'classname\' => \'widget_recent_entries\', \'description\' => __( "Your site’s most recent Posts.") );
    parent::__construct(\'recent-posts\', __(\'MyApp Recent Posts\'), $widget_ops);
    $this->alt_option_name = \'widget_recent_entries\';
    add_action( \'save_post\', array($this, \'flush_widget_cache\') );
    add_action( \'deleted_post\', array($this, \'flush_widget_cache\') );
    add_action( \'switch_theme\', array($this, \'flush_widget_cache\') );
}
public function widget($args, $instance) {
    $cache = array();
    if ( ! $this->is_preview() ) {
        $cache = wp_cache_get( \'widget_recent_posts\', \'widget\' );
    }
    if ( ! is_array( $cache ) ) {
        $cache = array();
    }
    if ( ! isset( $args[\'widget_id\'] ) ) {
        $args[\'widget_id\'] = $this->id;
    }
    if ( isset( $cache[ $args[\'widget_id\'] ] ) ) {
        echo $cache[ $args[\'widget_id\'] ];
        return;
    }
    ob_start();
    $title = ( ! empty( $instance[\'title\'] ) ) ? $instance[\'title\'] : __( \'MyApp Recent Posts\' );
    /** This filter is documented in wp-includes/default-widgets.php */
    $title = apply_filters( \'widget_title\', $title, $instance, $this->id_base );
    $number = ( ! empty( $instance[\'number\'] ) ) ? absint( $instance[\'number\'] ) : 5;
    if ( ! $number )
        $number = 5;
    $show_date = isset( $instance[\'show_date\'] ) ? $instance[\'show_date\'] : false;
    $latest_page = ( get_query_var( \'latest_page\' ) ) ? absint( get_query_var( \'latest_page\' ) ) : 1;
    $r = new WP_Query( apply_filters( \'widget_posts_args\', array(
      \'posts_per_page\'      => $number,
      \'paged\'               => $latest_page,
      \'no_found_rows\'       => true,
      \'post_status\'         => \'publish\',
      \'ignore_sticky_posts\' => true,
      \'suppress_filters\'    => true
    ) ) );
    if ($r->have_posts()) :
    ?>
    <?php echo $args[\'before_widget\']; ?>
    <?php if ( $title ) {
      echo $args[\'before_title\'] . $title . $args[\'after_title\'];
    } ?>
    <div class="latest-list">
      <?php while ( $r->have_posts() ) : $r->the_post(); ?>
        <?php get_template_part( \'content-block\', get_post_format() ); ?>
      <?php endwhile; ?>
    </div>
    <?php echo $args[\'after_widget\']; ?>
    <?php
      echo \'<div class="paginate-links">\';
      $args = array(
        \'base\' => \'/\' . \'%_%\',
        \'format\' => \'?latest_page=%#%\',
        \'current\' => $latest_page,
        \'total\' => $r->max_num_pages
      );
      echo paginate_links( $args );
      echo \'</div>\'; ?>
    <?php // This doesn\'t seem to work at all... ?>
    <?php // echo get_next_posts_link( \'Load more\', $r->max_num_pages ); ?>
    <?php
    // Reset the global $the_post as this query will have stomped on it
    wp_reset_postdata();
    endif;
    if ( ! $this->is_preview() ) {
      $cache[ $args[\'widget_id\'] ] = ob_get_flush();
      wp_cache_set( \'widget_recent_posts\', $cache, \'widget\' );
    } else {
      ob_end_flush();
   }
}
}
我还创建了一个函数,该函数可用于显示帖子和分页链接:

function my_app_recent_posts() {
  global $post;
  $latest_page = (get_query_var(\'latest_page\')) ? get_query_var(\'latest_page\') : 1;
  $args = array(
      \'posts_per_page\' => 1,
      \'order\' => \'DESC\',
      \'post_status\'         => \'publish\',
      \'ignore_sticky_posts\' => true,
      \'paged\' => $latest_page
  );
  $rposts = new WP_Query($args);
  if ( $rposts->have_posts() ) :
    while ( $rposts->have_posts() ) : $rposts->the_post();
      get_template_part( \'content-block\', get_post_format() );
    endwhile;
    echo \'<div class="pagination-links">\';
    $args = array(
        \'base\' => \'/\' . \'%_%\',
        \'format\' => \'?latest_page=%#%\',
        \'current\' => $latest_page,
        \'total\' => $rposts->max_num_pages
    );
    echo paginate_links( $args );
    // This doesn\'t work as it just used the \'paged\' query param
    // echo get_next_posts_link( \'Load more\', $rposts->max_num_pages );
    wp_reset_postdata();
    echo \'</div>\';
  endif;
}
对我来说,这似乎不正确——必须有一种方法可以直接使用小部件代码,当然?

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

删除:

\'no_found_rows\' => true,
从您的WP_Query 在小部件代码内部调用。

此外,我建议进行以下更改:

\'base\' => add_query_arg( \'latest_page\', \'%#%\' ),
在您的paginate_links 打电话,因为add_query_arg() 将处理以下情况?& 已使用。

这将使分页在小部件中正常工作。

注意:我几乎还没有测试过它,如果选择显示静态页面,这肯定不会出现在首页上

更新:

在我快速查看了我的一些代码之后,我确信如果选择静态页面显示在首页上,分页将无法工作。在这段代码中,我引入了一个额外的$_GET 变量,该变量不应注册为查询变量,以解决此问题。下面概述了如何使用该方法:

设置$latest_page 变量不同

if ( is_front_page() ) {
   $latest_page = ( isset( $_GET[ \'fplp\' ] ) ) 
     ? $_GET[ \'fplp\' ]
     : 1;
} else {
   $latest_page = ( get_query_var( \'latest_page\' ) ) 
     ? get_query_var( \'latest_page\' ) 
     : 1;
}
另外设置baseformat 的参数paginate_links 不同地

$base = ( is_front_page()
  ? add_query_arg( \'fplp\', \'%#%\' )
  : add_query_arg( \'latest_page\', \'%#%\' )
);
$format = ( is_front_page()
  ? \'?fplp=%#%\' 
  : \'?latest_page=%#%\' 
);
$args = array(
  \'base\' => $base,
  \'format\' => $format
   // some other parameter
);
paginate_links( $args );
使用此功能,您可以在上述条件下对小部件进行分页。

注意:当然,添加查询变量可能会被完全删除,并且可以单独使用$_GET 变量

结束

相关推荐

Pagination on Single Post

我想在我的单曲上设置分页。php文件,以便正确使用无限滚动函数。我知道分页可以放在一个帖子上,但我需要做一个。php页面可以在URL上附加一个变量。我的意思是,如果我有这个URL:http://www.example.com/post_URL/ 我需要它像这样工作:http://www.example.com/post_URL/page/2/ 它需要像这样工作,因为我在主页/主博客页面上有一个无限滚动条,它选择的是get\\u query\\u var(\'page\')变量,它似乎不