无法识别值为%1的基于整数的重写

时间:2019-04-29 作者:Kermit

我有一个简单的重写来传递变量:

// Add custom URL parameters
function add_custom_query_var( $vars ){
  $vars[] = "item_id";
  return $vars;
}

add_filter( \'query_vars\', \'add_custom_query_var\' );

// Add rewrite for custom query vars
function custom_rewrite_basic() 
{
    add_rewrite_rule(\'^add-item/([0-9]+)/?\', \'add-item/?item_id=$1\', \'top\');
}

add_action( \'init\', \'custom_rewrite_basic\' );
add-item 第页,变量的提取方式如下:

$item_id = filter_input( INPUT_GET, "item_id", FILTER_SANITIZE_NUMBER_INT );

if(!empty($item_id)) {
    ...
使用调用页面时add-item/1, var_dump($item_id) 带着NULL. 任何其他号码(包括0) 工作正常。有什么想法吗?

1 个回复
最合适的回答,由SO网友:nmr 整理而成

WordPress中的重写规则应指向index.php, 并将匹配的值(地址中的数字)替换为URL参数(item_id) 您必须使用$matches[1] 而不是$1.

因此,您的规则应该如下所示:

add_rewrite_rule(\'^add-item/([0-9]+)/?\', \'index.php?item_id=$matches[1]\', \'top\');
通常需要使用有关显示内容的信息来完成规则。用于显示:

单个帖子/页面-添加到重写&p={post_id}&postname={post_slug}存档页-&post_type={post_type_slug}自定义类别&{taxonomy_slug}={term_slug}.此规则设置仅适用于item_id 查询var,因此如果您尚未将自己的函数添加到template_include 过滤挂钩,WP将显示主页。

编辑:

Rules with and without index.php
重写从开始的规则index.php 存储在DB中。解析请求时,WordPress从DB中获取它们,并尝试将请求URL与其中一个规则匹配。

不以开头的规则index.php, 不要转到数据库。当WordPress解析请求时,不会检查它们。它们可能会保存在.htaccess 文件but only 如果使用Apache和文件权限,则允许写入。

Why $item_id is NULL
example.com/add-item/1 地址被识别为帖子(帖子类型可以是pagepost) 具有多页(分页后)。你应该知道WordPressremoves page number 来自URLif it equal to "1".example.com/add-item/ 而且它与要求的不一样example.com/add-item/1, 因此将执行重定向。

我不知道这是什么类型的帖子add-item (自定义帖子类型或内置),但请尝试以下方法:

add_action( \'init\', \'se336565_custom_rewrite_basic\' );
add_filter( \'query_vars\', \'se336565_add_custom_query_var\' );

function se336565_add_custom_query_var( $vars ){
  $vars[] = "item_id";
  return $vars;
}
function se336565_custom_rewrite_basic() 
{
    add_rewrite_rule(\'^add-item(?:/([0-9]+))/?$\', 
        \'index.php?post_type={custom_post_type_slug}&pagename=add-item&name=add-item&item_id=$matches[1]\', \'top\');
}
更换{custom_post_type_slug} 并刷新重写规则。

最后,在实际页面上使用get_query_var( \'item_id\' ).

相关推荐