在没有获得404的情况下故意超过主查询的max_num_ages吗?

时间:2016-11-14 作者:Samuel LOL Hackson

作者。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.php

    function 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 但这又让我回到了索引。

    1 个回复
    最合适的回答,由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 设置$boolfalse 在上述函数中。但我对它现在的工作方式非常满意。

    相关推荐

    Can't Add Pagination

    我无法添加分页来在页面之间划分帖子并在页面之间导航。目前所有20篇帖子我都有一次加载。我想在我的页面底部添加分页,并在5之前查看帖子。我有一个自定义的帖子类型,我将其定义为Project。我有两页。主页和日志。主页以我的项目帖子类型为特征,日志以我的常规博客帖子为特征。我希望这两页都有分页。我的当前索引。php是我的主页,如下所示:<?php get_header(); ?> <?php get_footer(); ?> <div class=\"p