问题描述
实际上我正在尝试添加一些操作 add_action
和 add_filter
。但我不知道为什么 add_filter
在 add_action
之前运行。因为我设置了相同的优先级,并且我在 wordpress 文档中读到,如果操作具有相同的优先级,那么首先编写的操作总是先运行。
但我不知道 add_filter
在 add_action
之前运行。
这是我的代码:
add_action('leaky_paywall_form_processing','zeen101_custom_registration_fields_save',10,5);
function zeen101_custom_registration_fields_save($post_data,$user_id,$price,$mode,$site)
{
if ($post_data['company']) {
update_user_Meta($user_id,'company',sanitize_text_field($post_data['company']));
}
if ($post_data['city']) {
update_user_Meta($user_id,'city',sanitize_text_field($post_data['city']));
}
}
add_filter('leaky_paywall_mailchimp_merge_fields','zeen101_custom_mailchimp_merge_fields',2);
function zeen101_custom_mailchimp_merge_fields($merge_fields,$email)
{
$mode = leaky_paywall_get_current_mode();
$user = get_user_by('email',$email);
if (!$user) {
return $merge_fields;
}
$level_id = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_level_id',true);
$levels = leaky_paywall_get_levels();
$level_name = $levels[$level_id]['label'];
$created = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_created',true);
$expires = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_expires',true);
$firstname = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_first_name',true);
$lastname = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_last_name',true);
$email = get_user_Meta($user->ID,'_issuem_leaky_paywall_' . $mode . '_email',true);
$company = get_user_Meta($user->ID,true);
$city = get_user_Meta($user->ID,true);
$merge_fields['LP_LEVEL'] = $level_name;
$merge_fields['LP_SUBDATE'] = $created;
$merge_fields['LP_EXPIRES'] = $expires;
$merge_fields['FNAME'] = $firstname;
$merge_fields['LNAME'] = $lastname;
$merge_fields['EMAIL'] = $email;
$merge_fields['COMPANY'] = $company;
$merge_fields['CITY'] = $city;
return $merge_fields;
}
我想先运行 add_action
,然后运行 add_filter
。我该怎么做?
谢谢。
解决方法
操作和过滤器是 fundamentally the same thing,只是一种模式,有时使用操作,有时使用过滤器。基本上,动作允许您“做某事”,过滤器允许您“改变某事”。你可能已经知道了,但我只是想说清楚。通常,它们被称为钩子,我将在这里引用它们。
在您的代码示例中,您有两个钩子,一个名为 leaky_paywall_form_processing
,另一个名为 leaky_paywall_mailchimp_merge_fields
。因为这是两个不同的钩子,它们之间的优先级无关紧要。
为了更好地说明我将reference the exact plugin与您合作。从该文件的第 160 行开始,您会看到:
if (leaky_paywall_is_free_registration($subscriber_data)) {
do_action('leaky_paywall_after_free_user_created',$user_id,$_POST);
}
do_action('leaky_paywall_form_processing',$_POST,$subscriber_data['price'],$mode,$site,$subscriber_data['level_id']);
该代码块首先调用钩子 leaky_paywall_after_free_user_created
,然后始终按照该顺序调用 leaky_paywall_form_processing
。不管你写什么代码,它总是按照那个顺序(当然,除非他们改变他们的代码)。
如果您想为相同钩子调用两个不同的函数,这就是优先级的来源。
不幸的是,该插件的 MailChimp 扩展似乎是付费的,所以我看不到来源,但最终归结为插件本身来确定调用钩子的顺序。