作者。php I有两个循环:一个是默认的主循环,用于获取该作者的所有帖子,另一个是自定义的WP\\u查询$secondloop
. 两个查询都有posts_per_page
设置为3. 现在我想paginate both query results.
为此,我添加了一个参数$secondloop = new WP_Query($args)
:
"paged" => (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
(阅读:将此查询的页面设置为与主查询的页面相同的页面)。
问题:如果主回路给我5个帖子和$secondloop
给我2,然后打电话page 2 没问题。它显示了主循环中剩余的2个帖子,我的$secondloop
(因为它不进去while ($secondloop->have_posts())
).
BUT 如果主回路有2个接线柱和$secondloop
有5个,然后呼叫page 2 结果在404 :(我显然想要$secondloop
\'而是剩下的2个帖子。更改作者内部的任何内容。php模板没有任何帮助,因为一旦WordPress检测到,似乎不再执行其中的php代码max_num_pages
超出主回路的。
How can I "override" that behaviour?
<代码:author.php (只是有用的一点)<?php if (have_posts()) { ?>
<div class="row archive-grid">
<?php while (have_posts()) : the_post();
include(locate_template(\'parts/loop-archive-grid.php\'));
endwhile; ?>
</div>
<?php }
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$secondloop = new WP_Query(array(
"post_type" => "musikalbum",
"posts_per_page" => 3,
"author_name" => get_query_var(\'author_name\'),
"paged" => $paged
));
if ($secondloop->have_posts()) { ?>
<div class="row archive-grid">
<?php while ($secondloop->have_posts()) : $secondloop->the_post();
get_template_part( \'parts/loop\', \'album-grid\' );
endwhile; ?>
</div>
<?php author_page_navi( $loop );
} else {
joints_page_navi();
} ?>
设置posts_per_page
对于我的主查询functions.phpfunction my_post_queries( $query ) {
if (!is_admin() && $query->is_main_query()){
if (is_author()){
$query->set(\'posts_per_page\', 3);
} else {
$query->set(\'posts_per_page\', 9);
}
}
}
add_action( \'pre_get_posts\', \'my_post_queries\' );
编辑:尝试1米洛给我指出了一个建议将此添加到我的functions.php:function my_404_override() {
global $wp_query;
if (is_author()) {
status_header( 200 );
$wp_query->is_404 = false;
}
}
add_filter(\'template_redirect\', \'my_404_override\');
但它仍然显示了404错误。如果我删除If子句,那么它将引导我到索引。php,这并不是我真正想要的。所以我需要if子句。。。但WordPress似乎还不知道!将代码直接粘贴到模板也不起作用,即使之前只有这三行代码get_header();
:
global $wp_query;
status_header( 200 );
$wp_query->is_404 = false;
编辑:尝试2我放弃了template_redirect
用于钩住pre_get_posts
:function my_post_queries( $query ) {
if (!is_admin() && $query->is_main_query()){
if (is_author()){
$query->set(\'posts_per_page\', 3);
// NEW CODE:
$paged = (get_query_var(\'paged\')) ? intval(get_query_var(\'paged\')) : 1;
global $original_page_request; // saves the original value of $paged because I\'m about to alter it!
if ($paged > $query->max_num_pages) {
$query->set(\'paged\', $query->max_num_pages);
$original_page_request = $paged;
} else {
$query->set(\'posts_per_page\', 9);
}
}
}
add_action( \'pre_get_posts\', \'my_post_queries\' );
想法是手动重置paged
对于主查询,当超过max_num_pages
并将“实际页面”存储在global $original_page_request
对于我的$secondloop
设置其paged
参数到。Unfortunately though, it doesn\'t work. 我很高兴再也看不到404了,但现在它自动将主查询页面设置为0<为什么是0因为在pre_get_posts
, 代码在WordPress发布之前执行。可以访问$query
但这只是为了设置查询变量,没有检索到的帖子,因此没有max_num_pages
计算依据。
这意味着我不知道什么时候会超过max\\u num\\u页面。
然后,我从my_post_queries( $query )
连接到另一个函数wp
. 那里max_num_pages
是有效数字,is\\u author()也正确。我一超过帖子数量,还是没有运气。我可以设置$wp_query->is_404 = false
但这又让我回到了索引。
最合适的回答,由SO网友:Samuel LOL Hackson 整理而成
每次加载页面时,WordPress都会按照各自的顺序执行这些功能:
init();
parse_request($query_args);
send_headers();
query_posts();
handle_404();
register_globals();
主查询在以下位置完成
query_posts()
. 请注意
in this point in time, WordPress knows the template AND all the query variables 喜欢
max_num_pages
.
在里面handle_404()
, 如果主查询有任何帖子,函数将返回,WordPress将继续加载模板。否则,它将发送404 HTTP状态并加载404模板。
自WordPress 4.5以来,有一个名为pre_handle_404
. 如果设置为true
, handle_404()
返回(无论主查询是否有帖子!)并继续加载模板。
所以在lot 这最终起作用了。将此添加到functions.php:
function ignore_404_past_max_page($bool = false, $query) {
$paged = (get_query_var(\'paged\')) ? intval(get_query_var(\'paged\')) : 1;
if (is_author() && ($paged > $query->max_num_pages))
$bool = true;
return $bool;
}
add_filter( \'pre_handle_404\', \'ignore_404_past_max_page\', 10, 2);
就是这样!无需编辑现有函数,清理并完全按照您的要求执行:防止WP 404ing。只要确保
update WordPress to version 4.5 (及以上)!
一个不必要的副作用可能是,现在您可以分页,直到PHP_INT_MAX
并获取空页(除非您添加一些get_the_author_meta()
和get_wp_user_avatar()
例如)。您可能会记住数据库中每个作者的最大页码,然后查询并将其与$paged
设置$bool
到false
在上述函数中。但我对它现在的工作方式非常满意。