<?php query_posts("cat")?>,php – WordPress – pre_get_posts代替页面上的query_posts

如何使用pre_get_posts钩子通过自定义页面模板显示页面上的帖子列表?

我一直在玩pre_get_posts钩子,这里有一个想法

步骤1:

停止一个页面,例如用s子显示:

example.com/show

第2步:

创建一个自定义页面模板:

tpl_show.PHP

位于当前的主题目录.

步骤3:

我们构建以下pre_get_posts动作回调:

function b2e_pre_get_posts( $query )

{

$target_page = 'show'; // EDIT to your needs

if ( ! is_admin() // front-end only

&& $query->is_main_query() // main query only

&& $target_page === $query->get( 'pagename' ) // matching pagename only

) {

// modify query_vars:

$query->set( 'post_type','post' ); // override 'post_type'

$query->set( 'pagename',null ); // override 'pagename'

$query->set( 'posts_per_page',10 );

$query->set( 'Meta_key','wpb_post_views_count' );

$query->set( 'orderby','Meta_value_num' );

$query->set( 'order','DESC' );

// Support for paging

$query->is_singular = 0;

// custom page template

add_filter( 'template_include','b2e_template_include',99 );

}

}

add_action( 'pre_get_posts','b2e_pre_get_posts' );

哪里

function b2e_template_include( $template )

{

$target_tpl = 'tpl_show.PHP'; // EDIT to your needs

remove_filter( 'template_include',99 );

$new_template = locate_template( array( $target_tpl ) );

if ( ! empty( $new_template ) )

$template = $new_template; ;

return $template;

}

这也应该给我们分页:

example.com/show/page/2

example.com/show/page/3

等等

笔记

我更新了答案,并根据@PieterGoosen的建议删除了查询对象部分修改,因为它可以例如打破他的设置中的面包屑.

还删除了pre_get_posts钩子中的is_page()检查,因为在某些情况下它可能仍然会出现不规则.原因是查询对象并不总是可用.正在进行中. #27015.如果要使用is_page()或is_front_page(),则有workarounds possible.

我构建了下表,只是为了更好地概述主WP_Query对象的一些属性和查询变量,对于给定的块:

这是interesting to note,WP_Query中的分页依赖于nopaging未设置,当前页面不是单数(从4.4 source):

// Paging

if ( empty($q['nopaging']) && !$this->is_singular ) {

$page = absint($q['paged']);

if ( !$page )

$page = 1;

// If 'offset' is provided,it takes precedence over 'paged'.

if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) {

$q['offset'] = absint( $q['offset'] );

$pgstrt = $q['offset'] . ',';

} else {

$pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ',';

}

$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];

}

我们可以看到生成的SQL查询的LIMIT部分在条件检查中.这就解释了为什么我们修改上面的is_singular属性.

我们可以使用其他过滤器/钩子,但是在这里我们使用了OP提到的pre_get_posts.

希望这个帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值