作为项目的一部分,我需要制作一个wordpress插件,该插件与Google集成以进行身份验证(有充分的理由开发一个新插件,而不是使用现有的插件)。如果用户决定在授权过程中取消登录,则google将重定向回我的网站,并将设置一个名为“error”的GET变量。
所以我注意到$_GET[\'error\']
从来没有,经过一点研究,我发现get_query_var()
和相关函数-所以我尝试了这个,但仍然无法访问“error”变量。之后,我输出$wp_query->query_vars
并注意到“error”变量存在,并且是空的,无论该变量是否在URL中设置。
因此,我的问题是,如何检查“error”变量的存在(最好不必解析url,但我会将其作为备份计划)。我可能应该提到,我通常不是wordpress插件开发人员,所以,如果我是个白痴,错过了一些简单的东西,请让我知道!
/****编辑**/
这里有一点测试代码,它模拟了我正在尝试的操作。您将看到,我已将处理程序附加到“send\\u headers”操作—这是我真正需要获取变量的地方。“The\\u content”用于比较。
代码:https://gist.github.com/ryanlund/e644b10a9e50ae7b03e6 (这是要点,因为它很长)
日志:https://gist.github.com/ryanlund/e0d685545a09eff93a83
我已将日志的showAll部分裁剪为我们感兴趣的部分。我在url中使用以下查询字符串运行代码:?test=A%20Test&error=An%20error
/****************************最终解决方案*******************************/
大家好,这是基于Tom给我的想法的最终解决方案(见公认答案)
基本上,与其继续尝试使用保留的变量(不是很酷的wordpress!),我只是将其重命名为:
add_action(\'init\',function() {
if(preg_match(\'/^\\/test-page\\//\',$_SERVER[\'REQUEST_URI\'])){
if(isset($_GET[\'error\'])){
/*call it something unlikely to be used elsewhere*/
$_GET[\'error_mpp\']=$_GET[\'error\'];
}
global $wp;
$wp->add_query_var(\'test\');
$wp->add_query_var(\'error_mpp\');
}
});
最合适的回答,由SO网友:Tom J Nowell 整理而成
你的问题是你正在使用Reserved Terms. error
是保留术语,您不能使用它。
为了避开这个问题,you could intercept the request early, 并执行重定向,在此过程中更改查询参数。例如,处理link
获取参数:
add_action( \'wp\' , \'reserved_term_intercept\' );
function reserved_term_intercept(){
global $wp_query;
if( $wp_query->queried_object_id == 72 && isset( $_GET["link"] ) ){
wp_redirect( get_permalink( 72 ) . "?newlink=" . urlencode( $_GET["link"] ) . "&nonce=" . wp_create_nonce( \'nonce-name\' ) );
exit;
}
}
然后处理新变量:
add_action( \'wp_head\' , \'reserved_term_handling\' );
function reserved_term_handling(){
if( wp_verify_nonce( $_GET["nonce"], \'nonce-name\' ) == TRUE && isset( $_GET["newlink" ) ){
printf( \'<a href="%s">Hello World!</a>\', esc_url( urldecode( $_GET["newlink"] ) ) );
}
}
wp_head
可能不是运行代码的最合适的钩子
init
相反