我正在开发一个使用AJAX的插件,但我在控制代码流方面遇到了困难。
我想在运行条件后挂接函数。我的钩子在控制结构内部添加时不会启动,但在外部会启动。
我还有一个触发AJAX请求的事件,这只能在用户点击触发事件后,在加载所有DOM之后发生。AJAX请求告诉PHP函数设置cookie。它设置了cookie,但在阅读关于cookie的PHP文档时,我发现它们只能在发送任何输出后设置,但我还是做到了这一点?
我读过WordPress初始化序列,但这并没有帮助我解决这个问题。
这是我的密码:
add_action(\'wp_head\', \'Init_\');
function Init_(){
if(isset($_COOKIE[\'user_opt\'])){
$user_opt = $_COOKIE[\'user_opt\'];
if($user_opt === \'out\'){
function user_checkout(){
$ch_script_url = plugins_url(\'/js/check_out.js\', __FILE__);
wp_enqueue_script(\'checkout\', $ch_script_url);
}
add_action(\'wp_enqueue_scripts\', \'user_checkout\'); // load this if the cookie is set
}
} else { // run this otherwise
function user_opt_handler(){
$opt_script_url = plugins_url(\'/js/opt_handler.js\', __FILE__);
wp_enqueue_script(\'opt_handler\', $opt_script_url, array(\'jquery\'), TRUE);
$nonce = wp_create_nonce(\'my_nonce\');
$ajax_url = admin_url(\'admin-ajax.php\');
wp_localize_script(
\'opt_handler\',
\'options\',
array(
\'check\' => $nonce,
\'ajax_url\' => $ajax_url
)
);
}
function opt_box_html(){ ?>
<div id="user-opt-box">
<button id="user-choice-yes">Yes</button> <!-- the AJAX in the "opt_handler" script will fire when an click event for this button happens -->
</div>
<?php }
function user_handler(){
if(is_admin() === TRUE){
check_ajax_referer(\'my_nonce\');
setcookie(\'user_opt\', \'out\');
wp_die();
}
}
add_action(\'wp_enqueue_scripts\', \'user_opt_handler\');
add_action(\'wp_footer\', \'opt_box_html\', 100);
add_action(\'wp_ajax_user_handler\',\'user_handler\');
add_action(\'wp_ajax_nopriv_user_handler\', \'user_handler\');
}
}
我还注意到,当使用普通(在所有函数之外)范围内的php变量时,挂钩函数无法访问它。
例如,尝试执行此操作时:
$a = "hello world";
function my_func(){
echo $a;
}
add_action(\'wp_footer\', \'my_func\');
这将输出
NULL
. 这是因为wordpress挂钩只能访问其中声明的变量吗?
SO网友:rozklad
在页面请求期间,Wordpress actions 是按顺序触发的,因此您必须及时注册它们。就你而言,wp_head
紧随其后wp_enqueue_scripts
, 因此,作为一种解决方案,我会将它们从wp\\U头部移除,并在任何其他操作之外的条件下注册它们:
if ( isset( $_COOKIE[\'user_opt\'] ) ) {
add_action(\'wp_enqueue_scripts\', \'user_checkout\');
// ...
// add relevant actions here if isset $_COOKIE[\'user_opt\']
} else {
add_action(\'wp_enqueue_scripts\', \'user_opt_handler\');
// ...
// add relevant actions here if not set
}
关于饼干。它们是HTTP头的一部分,因此必须在任何输出之前设置它们(而不是像上面所述的那样在输出之后)。
至于你的第二个问题。这不是Wordpress特有的,这是callable. 请注意,callable的指定可能有所不同:
// It might be anonymous function (closure)
add_action(\'wp_footer\', function() {});
// A function
add_action(\'wp_footer\', \'my_custom_function\');
// Method call
add_action(\'wp_footer\', [$obj, \'my_object_method\']);
// and more...
正如您在方法调用中所看到的,这将是一种让您的上下文与函数一起工作的方法(将您想要的任何值赋给$obj)。如中所示
$obj->a = \'hello world\';