Php 当当前页面超过9时,Wordpress自定义重写规则返回404

Php 当当前页面超过9时,Wordpress自定义重写规则返回404,php,regex,wordpress,Php,Regex,Wordpress,我的网站上的“目录”页面有一个自定义重写规则,用于显示指定目录中的项目。除了分页之外,一切都很好,如果用户试图导航到大于第9页的页面,分页会神秘地返回404错误页面。下面是整个重写代码。网站上的其他档案对超过第9页的页面没有问题,所以我觉得这一定与我的重写规则中的正则表达式有关,但我不知道它可能是什么 function x_rewrite_rule_form_submissions() { add_rewrite_tag('%catalog%', '([^&]+)');

我的网站上的“目录”页面有一个自定义重写规则,用于显示指定目录中的项目。除了分页之外,一切都很好,如果用户试图导航到大于第9页的页面,分页会神秘地返回404错误页面。下面是整个重写代码。网站上的其他档案对超过第9页的页面没有问题,所以我觉得这一定与我的重写规则中的正则表达式有关,但我不知道它可能是什么

function x_rewrite_rule_form_submissions()
{
    add_rewrite_tag('%catalog%', '([^&]+)');
    add_rewrite_rule('catalog/([^/]+)/page/([0-9]+)/?', 'index.php?catalog=$matches[1]&paged=$matches[2]', 'top' );
    add_rewrite_rule('catalog/([^/]+)/?', 'index.php?catalog=$matches[1]', 'top');
}
add_action('init', 'x_rewrite_rule_form_submissions', 10, 0);
更新:使用调试此插件,我发现WP_Query正在尝试使用URL中的分页信息在post_type=“post”上运行主查询。我的理论是,正是这个查询导致Wordpress返回404错误消息。如何覆盖/禁用此主查询

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_date DESC LIMIT 100, 10

好的,我已经解决了这个问题,虽然我不确定这是最好的解决方案,所以任何反馈都非常感谢!我最后做的是使用pre_get_posts来更改post_类型,以便Wordpress的主要查询请求在所有目录页面上使用post_type=“items”而不是post_type=“post”。因为数据库中有多少“项”,所以分页的次数不会导致404。希望这能帮助人们

function alter_catalog_query( $query ) {
    $uri = explode("/", $_SERVER['REQUEST_URI']);
    if ( $query->is_main_query() && isset($uri[1]) ) {
        if ( $uri[1] == 'catalog')
            $query->set('post_type','items');
    }
}
add_action( 'pre_get_posts', 'alter_catalog_query' );

当您使用404时,实际请求的URL是什么?(重写后的一个)@Kaddath作为一个快速更新,我相信这个问题与Wordpress试图在帖子查询中使用页码有关,但帖子的页数不超过9页。因此,也许我需要找出如何阻止Wordpress在/catalog页面上运行其正常查询?这是原始URL,重写后的URL应该以
index.php?catalog=…
开始。您可以在控制台中读取请求的url,当您有404个查询时。对不起,这里是重写的url:index.php?catalog=example catalog entry name&paged=11ah,我不知道重写的url是用于自定义查询的。我猜你的解决方案是可行的,但也许它依赖于某一天可能会出错的东西(wp项目比目录项目多)。在代码重用方面,总有一天会导致问题。。可能类似于
$query->set('posts\u per\u page',0)如果有效,会更干净吗?