我想在两个add\\u操作之间共享一个变量。目前我正在尝试使用全局。然而,它不起作用。下面这个简单的例子说明了这个问题。在本例中,test_before_send_mail()
之前运行test_get_form_post_callback()
.
$test = \'123\';
add_action(\'wpcf7_before_send_mail\', \'test_before_send_mail\');
function test_before_send_mail() {
global $test;
$test = \'456\';
}
add_action(\'wp_ajax_test_get_form_post\', \'test_get_form_post_callback\',1);
add_action(\'wp_ajax_nopriv_test_get_form_post\', \'test_get_form_post_callback\',1);
function test_get_form_post_callback() {
global $test;
echo $test; ($test is equal to 123 still, when it should be equal to 456.)
}
我尝试过改变
add_action
优先级级别,并尝试通过函数直接传递变量。我想这可能与
wpcf7_before_send_mail
明确地有人知道如何让它工作吗?
编辑:要添加更多关于我正在尝试做的事情,请在提交联系人表格7时运行(wpcf7_before_send_mail
). 我正在使用一个add\\u操作来钩住它。此时设置了一些变量,我需要稍后使用。
提交联系人表单7后,我使用JavaScript强制表单重定向。在这个重定向过程中,我需要从以前访问这些变量,所以我使用了一个add\\u action Ajax挂钩。
我也不能使用cookie或会话。我尝试了这两种方法,但要么在某些浏览器中失败,要么在某些具有会话缓存的服务器上失败。
SO网友:cjbj
首先,使用的顺序add_action
不相关。它所做的唯一一件事就是在遇到钩子时记录要执行的操作。只有当同一挂钩上有多个函数时,添加的操作的优先级才变得相关(read more).
因此,如果全局变量没有更改,这意味着钩子会更改它(wpcf7_before_send_mail
) 在钩子后调用,在钩子后测试是否已更改(wp_ajax_test_get_form_post
). 或者根本不调用更改挂钩。你可以通过回应里面的东西来改变后者test_before_send_mail()
. 如果没有打印任何内容,则不会调用挂钩,如果有,则调用挂钩为时已晚。
根据您想要实现的目标,最简单的解决方案是连接test_get_form_post_callback
到wpcf7_before_send_mail
同时,使用优先级来确保正确的执行顺序。
如果两者都由你掌控test_before_send_mail()
和test_get_form_post_callback
最干净的解决方案是在其中一个函数中包含一个过滤器挂钩,从而消除了对全局变量的需要。像这样:
function wpse374144_main ($args) {
... do stuff
$var = something;
$var = apply_filters (\'wpse374144_main_filter\', $var);
}
add_filter (\'wpse374144_main_filter\',\'wpse374144_main_callback\',10,1);
function wpse374144_main_callback ($var) {
... do stuff
return $var;
}