在单个custom-post-type.php模板文件中设置
WP_Query
分页我已完成的操作
1)创建了一个称为“作者”的帖子类型。
2)标准编辑帖子屏幕页面包含一个下拉列表,其中列出了作者自定义帖子类型中的所有帖子(作者)。
3)创建了一个single-authors.php模板,该模板使用下拉菜单中的作者元数据查询所有帖子,因此结果是分配了相同作者(类似于存档)的帖子列表:
<?php
// set the "paged" parameter (use 'page' if the query is on a static front page)
global $paged;
/*We need this here to add and maintain Pagination if Template is assigned to Front Page*/
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var('paged');
} elseif ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
$args = array(
'posts_per_page' => 10,
'meta_key' => 'author_select',
'meta_value' => $author_id,
'paged' => $paged,
);
$temp = $wp_query;
$wp_query = NULL;
$wp_query = new WP_Query($args);
?>
<?php if( $wp_query->have_posts() ) : ?>
<?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
<?php // Successfully outputs the results of the above query, so I've omitted the code from this example. ?>
<?php endwhile; ?>
<div class="single_navigation">
<?php if( get_adjacent_post( false, '', true ) ) { ?>
<span class="prev"><?php previous_post_link( '< %link' ) ?></span>
<?php } ?>
<?php if( get_adjacent_post( false, '', false ) ) { ?>
<span class="next"><?php next_post_link( '%link >' ) ?></span>
<?php } ?>
</div><!--/single navigation-->
<?php endif; ?>
<?php
$wp_query = null;
$wp_query = $temp;
wp_reset_query();
?>
我被卡住的内容
分页链接没有出现。我进行了一些研究,发现它们使用了
$wp_query
变量,但是当我将查询变量更改为$wp_query
时,链接出现了,但是当单击时却什么也没做。我在哪里弄错了?
编辑:
要回答您的一些问题,我的查询成功输出了我正在查询的帖子,$ author_id已经具有我未包含在其中的值代码段。同样,我在while循环中省略了实际的内容输出,因为那不是问题。问题是我需要对单个帖子中已经存在的内容进行分页。
此功能的目的是允许帖子具有自定义作者(内置的Users系统之外),并且模板的目的是输出给定作者(已经在工作)的所有帖子。
#1 楼
您有2个问题。第一个问题
该行
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
将失败,因为在单个帖子视图中,当URL包含
'/page/XX/'
时,WordPress设置的变量为'page'
而不是'paged'
。您可能会考虑使用
'page'
代替'paged'
,但这也不起作用,因为一旦将'page'
变量用于用于多页单数帖子(使用<!--nextpage-->
进行页面分离),并且帖子不是多页面时,WordPress会将请求重定向到不带'/page/XX/'
的URL。这就是您命名时发生的情况您的查询变量
$wp_query
。解决方案是通过删除负责该功能的函数来防止该重定向,该函数已与
'redirect_canonical'
挂钩:因此,请在您的
'template_redirect'
中添加: add_action( 'template_redirect', function() {
if ( is_singular( 'authors' ) ) {
global $wp_query;
$page = ( int ) $wp_query->get( 'page' );
if ( $page > 1 ) {
// convert 'page' to 'paged'
$wp_query->set( 'page', 1 );
$wp_query->set( 'paged', $page );
}
// prevent redirect
remove_action( 'template_redirect', 'redirect_canonical' );
}
}, 0 ); // on priority 0 to remove 'redirect_canonical' added with priority 10
现在WordPress将不再重定向,并将正确设置
functions.php
查询变量。第二个问题
第4季312079q和
'paged'
都检查next_posts_link()
以显示分页。现在,
previous_posts_link()
是正确的,因为您处于“作者”类型的单个帖子中,因此这些功能无法按预期工作。您有3种可能:
使用
if ( ! is_single() )
覆盖主查询(不建议使用)使用自定义页面模板而不是自定义帖子类型,因为
is_single()
对于页面是假的,您的代码将在此处工作。编写您自己的分页功能并使用该功能
这是解决方案编号3的代码:
function my_pagination_link( $label = NULL, $dir = 'next', WP_Query $query = NULL ) {
if ( is_null( $query ) ) {
$query = $GLOBALS['wp_query'];
}
$max_page = ( int ) $query->max_num_pages;
// only one page for the query, do nothing
if ( $max_page <= 1 ) {
return;
}
$paged = ( int ) $query->get( 'paged' );
if ( empty( $paged ) ) {
$paged = 1;
}
$target_page = $dir === 'next' ? $paged + 1 : $paged - 1;
// if 1st page requiring previous or last page requiring next, do nothing
if ( $target_page < 1 || $target_page > $max_page ) {
return;
}
if ( null === $label ) {
$label = __( 'Next Page »' );
}
$label = preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&', $label );
printf( '<a href="%s">%s</a>', get_pagenum_link( $target_page ), esc_html( $label ) );
}
,然后在
query_posts
中使用它:my_pagination_link( 'Older Entries', 'next', $author_query );
my_pagination_link( 'Newer Entries', 'prev', $author_query );
评论
很详细的答案,谢谢!这适用于网站的英语一侧,但在法语一侧,分页链接没有任何作用,它们只会刷新页面。我正在使用WPML。
– Shane
2014年5月8日20:09
@Shane似乎WPML运行一些过滤器来阻止代码工作。但是它是一个很大的插件,因此我无法挖掘成千上万行代码来了解冲突所在。尝试询问WPML支持。
– gmazzap♦
2014年5月8日22:30
@Shane WPML支持论坛-如果以上适用(我假设),请将其标记为解决方案。无论如何,WPML冲突不在本站点的讨论范围之内。
– kaiser
2014年5月9日在1:03
很棒的答案,主要是因为它帮助我解决了分页问题。我一直在做类似的任务,并创建了第二个WP_Query进行循环。我给the_posts_pagination打了电话,但必须按照此问题中的概述制作一份原始wp_query的副本:wordpress.stackexchange.com/questions/216821/…
–亚历山大·霍尔斯格罗夫(Alexander Holsgrove)
17年1月30日在9:15
您是正确的@HongPong,固定,谢谢。
– gmazzap♦
19年9月9日在6:12
#2 楼
基于另一个类似的WPSE问题“分页无法使用wp_query自定义字段值”,我建议将global $paged;
添加到模板文件的开头:global $paged;
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
评论
感谢您的回复!不幸的是,它似乎没有任何区别。分页链接没有出现
– Shane
2014年5月8日18:32
斯蒂芬,为什么要帮忙?是的,这可以从全局角度将其引入,但是到目前为止您还没有做任何事情。如果要覆盖全局,请使用$ GLOBALS ['paged'] = get_query_var('paged');。否则,只使用globals内容。
– kaiser
2014年5月8日在18:34
@Shane Hmm,模板页面是否用作静态首页?
–斯蒂芬·S。
2014年5月8日在18:36
不,它仅用作自定义帖子类型的单个帖子模板。我确实尝试将查询从$ author_query更改为$ wp_query,这似乎使分页出现,但是当我单击它时,页面会刷新,即使有多个页面,也不会实际转到下一页。我已经更新了我的答案以反映这些更改。
– Shane
14年5月8日在18:38
php.net的解释还不错。我建议您只使用global和$ GLOBALS。一点var_dump(),一些功能,您就可以了。要通过一点尝试/错误来真正理解它,您将获得大约。需要半个小时。这将帮助您更好地了解函数与类以及整个OOP方法。显然它将使您更了解名称空间:)
– kaiser
2014年5月8日在18:45
#3 楼
gmazzap提供了详细的答案,但是我发现实现我的实现不需要几个部分,这与您的非常相似。重要的部分是重新排列模板并使用页面模板,而不是自定义帖子类型。在查询args中,我执行了以下操作:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$get_posts_args = array(
'numberposts' => -1,
'posts_per_page' => 5,
'paged' => $paged,
'page' => $paged,
'post_type' => array('dvposts','post'),
'post_status' => 'publish',);
将
$paged
传递给paged
和page
键允许两个链接都指向正确的url,结果实际上可以在页面中移动。然后在初始化查询后的任何地方,都使用带有至少这些参数的paginate_links:
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $qwer->max_num_pages,
) );
该示例实际上位于WP Codex页面的底部。
我希望显示页码,但如果不显示,则可以全部使用
previous_post_link
和nest_post_link
。我不能说我完全理解它,但是
'current' => max( 1, get_query_var('paged') )
似乎有问题。这可能与之前初始化的$paged
不同。我将其更改为'current' => max( 1, $paged ),
,并且按预期方式工作。
评论
格式正确的问题的支持者,尽管您没有描述为什么要这样做,但它是否与当前作者框相关联?我真的同意@TomJNowell。 +1
无关,但没有必要回显the_title()
是否从下拉列表中填写了'meta_value'=> $ author_id?通过下拉列表选择每个作者时,前十条帖子显示正确吗?
您确定$ author_query-> have_posts()返回true,并且$ author_query实际上包含任何帖子吗?