我已经按照这里的建议创建了一个核心的最近帖子小部件的克隆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;
}
对我来说,这似乎不正确——必须有一种方法可以直接使用小部件代码,当然?
最合适的回答,由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;
}
另外设置
base
和
format
的参数
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
变量