What I tested
Wordpress Version: 4.9.5
PHP Version: 7.1.7/7.1.4/7.2.0/7.0.3/5.6.20/5.5.38/5.4.45
Web Server: Nginx 1.10.1/Apache 2.4.10
Environment/Host: 飞轮本地https://local.getflywheel.com/
PCRE Library Version: 8.38 2015-11-23
我一直在努力register_rest_route 但遇到了regex问题。似乎在执行regex之前对其进行了一些过滤。
我试图创建的功能是通过permalink获取帖子。基本上,我有一个客户端,它的url结构类似于wordpress,因此它希望将永久链接传递给wordpress,以便我可以获取帖子数据
register_rest_route( $this->namespace, \'/post_by_permalink/(?P<path>[\\w-]+)\', array(
\'methods\' => WP_REST_Server::READABLE,
\'callback\' => array( $this, \'postByPermalink\' ),
\'permission_callback\' => array( $this, \'permissions\' ),
\'show_in_rest\' => true
));
这是我正在使用的函数,它在某些情况下有效。然而,这仅仅是因为工作的角色不会产生任何特殊的角色。
目前,我的计划是在客户端将永久链接转换为base64,以便更容易通过url,但如果它们有效,我愿意接受建议(我只想到base64,因为urlencode更像是一场噩梦)。
基本上,wordpress中唯一有效的正则表达式似乎是(?P<path>[\\w-]+) 和(?P<path>[\\d]+). 其他任何东西都不起作用,即使它在以下方面测试成功http://www.phpliveregex.com
例如,根据测试仪(?P<path>[\\S]+) 应该有用,但我从wordpress得到的只是rest_no_route
有没有办法让wordpress正常处理regex?或者至少告诉它允许一个可以捕获base64的表达式?我在网上看到了一些选项,但没有任何效果,可能是由于wp rest随时间的变化(都说“只使用regex”,但它似乎过滤了更复杂的regex)
一https://local.getflywheel.com/一七是什么会起作用http://www.phpliveregex.com
搜索字符串为
/wp-json/app/v1/post_by_permalink/dGVzdC90ZXN0
同样的正则表达式仅在wordpress中不起作用
(?P<path>[\\w-]+) 将起作用,对于上面的示例,由于没有特殊字符,因此在这两种情况下都会起作用。
但是,对于此字符串,它不会
/wp-json/app/v1/post_by_permalink/dGVzdC90ZXN0LzM1NzM0Ly0=
因为它有
= 所以虽然在regex测试程序中
(?P<path>[\\S]+) 工作,但在wordpress中不工作。
Edit: further testing
我设法抬头看了看
rest_pre_dispatch 并让它在检查路由之前捕获请求。
add_filter(\'rest_pre_dispatch\', \'filter_request\');
function filter_request($result) {
global $wp;
//print_r($wp->request); die;
preg_match("/app\\/v1\\/post_by_permalink\\/(?P<path>[\\S]+)/", $wp->request, $output);
print_r($output); die;
return $result;
}
能够正确设置路径,因此它似乎不是preg\\u匹配问题。至少有了这个,我可以绕过wp rest,绕过这个问题,但我仍然没有找到导致我尝试的每个环境都失败的真正原因,而且没有其他人可以重新创建它。。。。。
经过更彻底的测试,我得到了下面的工作,我使用$wp->request 包括witchwp-json 这导致正则表达式失败
虽然当我使用preg_match( \'@^\' . $route . \'$@i\', $path, $matches ) 我无法让它工作(这就是wp rest的工作方式,$路由是通过的register_rest_route), 和使用preg_match regex tester不支持这种方式http://www.phpliveregex.com/ 任何一个它添加了更多的问题,然后是答案。