如何在使用ADD_REWRITE_RULE()后停止WordPress在分页页面上返回404?

时间:2017-05-25 作者:henrywright

我正在使用add_rewrite_rule() 要创建自定义端点,请执行以下操作:

示例。com/author/username/my endpoint我需要在此页面上分页,因为我正在使用WP_User_Query. 当我访问这些URL时,我看到了我应该看到的用户,因此一切似乎都正常工作:

示例。com/author/username/my endpoint/示例。com/author/username/my endpoint/page/2示例。com/author/username/my endpoint/page/3/etc等The problem: 当我在查看分页页面(我的端点/页面/2/和我的端点/页面/3/等)时,访问Chrome开发工具中的网络选项卡,它告诉我WordPress正在返回404。

以下是我使用的完整代码:

// Add query var.
add_filter( \'query_vars\', function( $vars ) {
    $vars[] = \'my-endpoint\';
    return $vars;
} );
// Add rewrite rules.
add_rewrite_rule(
    \'^author/([^/]+)/my-endpoint/page/([0-9]+)/?$\',
    \'index.php?author_name=$matches[1]&my-endpoint=1&paged=$matches[2]\',
    \'top\'
);
add_rewrite_rule( 
    \'^author/([^/]+)/my-endpoint/?$\', 
    \'index.php?author_name=$matches[1]&my-endpoint=1\', 
    \'top\'
);
// Template display
add_filter( \'template_include\', function( $template ) {
    global $wp_query;

    if ( array_key_exists( \'my-endpoint\', $wp_query->query_vars ) ) {
        return trailingslashit( get_template_directory() ) . \'my-endpoint.php\';
    }
    return $template;
} );
// The user query in my my-endpoint.php template.
$page = max( 1, get_query_var( \'paged\' ) );
$args = array(
    \'count_total\' => true,
    \'include\'     => $ids,
    \'number\'      => get_option( \'posts_per_page\' ),
    \'offset\'      => ( $page - 1 ) * get_option( \'posts_per_page\' ),
    \'order\'       => \'DESC\',
    \'orderby\'     => \'include\',
    \'paged\'       => $page
);
$wp_user_query = new WP_User_Query( $args );
为什么WordPress在分页页面上返回404?

示例。com/author/username/my endpoint/page/2示例。com/author/username/my endpoint/page/3/etc等

Update

我尝试使用我自己的查询变量,如下面的答案所示,但我继续看到404:

// Add query var.
add_filter( \'query_vars\', function( $vars ) {
    $vars[] = \'my-endpoint\';
    $vars[] = \'userpaged\';
    return $vars;
} );
// Add rewrite rules.
add_rewrite_rule(
    \'^author/([^/]+)/my-endpoint/userpaged/([0-9]+)/?$\',
    \'index.php?author_name=$matches[1]&my-endpoint=1&userpaged=$matches[2]\',
    \'top\'
);

1 个回复
SO网友:Mark Kaplun

因为你使用了wordpress,所以你得到了404paged query var,因此wordpress会尝试在主查询中为该用户定位该页面,如果该用户不是作者,或者只是没有发布任何内容,则该页面将没有帖子,wordpress会将标题设置为404。

简单的解决方案是,为自己的分页创建额外的查询变量。

再深入一点思考。。。您可能需要使用status_header, 从调用https://developer.wordpress.org/reference/functions/status_header/ 在任何情况下,都可以修改正在发送的状态标头,因为在某些情况下,用户分页会给出空结果,而主循环会找到一些内容。

棘手的部分是在完成任何输出之前知道状态方式应该是什么,因此等待获取模板使用情况为时已晚,需要在“计算”主查询时完成,因此可能在pre_get_posts 过滤器,即使您不需要更改主查询中的任何内容。

结束

相关推荐

Pagination custom query

我正在尝试制作一个自定义页面模板,以显示浏览次数最多的帖子。我可以回复帖子,但我很难弄清楚如何分页。以下是我所拥有的:$args = array(\'orderby\' => \'meta_value_num\', \'meta_key\' => \'post_views_count\', \'posts_per_page\' => 36 ); $loop = new WP_Query( $args ); while ( $