Php 如何在BuddyPress/WordPress中有条件地发送激活电子邮件?

Php 如何在BuddyPress/WordPress中有条件地发送激活电子邮件?,php,wordpress,forms,buddypress,Php,Wordpress,Forms,Buddypress,一直在寻找解决方案,但似乎找不到。我的网站有两个注册表格(表格A和表格B),分别放在不同的页面上,效果很好。当用户注册到表单B时,一个名为subscriber\u type的隐藏字段被填充。否则,表A和表B是相同的。提交表单后,只有在填充此订户类型字段的情况下,用户才应自动激活并登录 到目前为止,填写表格B的用户已激活(且未收到激活电子邮件)并已登录。但填写表格A的用户也不会收到他们的激活电子邮件,即使他们应该收到。看起来没有用户收到任何激活电子邮件,不管他们填写的是什么表单 有没有办法让发送激

一直在寻找解决方案,但似乎找不到。我的网站有两个注册表格(表格A和表格B),分别放在不同的页面上,效果很好。当用户注册到表单B时,一个名为
subscriber\u type
的隐藏字段被填充。否则,表A和表B是相同的。提交表单后,只有在填充此
订户类型
字段的情况下,用户才应自动激活并登录

到目前为止,填写表格B的用户已激活(且未收到激活电子邮件)并已登录。但填写表格A的用户也不会收到他们的激活电子邮件,即使他们应该收到。看起来没有用户收到任何激活电子邮件,不管他们填写的是什么表单

有没有办法让发送激活邮件成为有条件的

到目前为止,我所尝试的:

// Auto-activate users from Form B (This works)
function auto_activate_user( $user_id ) {
    //Check if subscriber_type is in form POST (and is from Form B)
    $subscriber_type = $_POST['subscriber_type'];
    if ($subscriber_type){
        global $wpdb;

        //Hook if you want to do something before the activation
        do_action('bp_disable_activation_before_activation');

        $activation_key = get_user_meta($user_id, 'activation_key', true);
        $activate = apply_filters('bp_core_activate_account', bp_core_activate_signup($activation_key));
        BP_Signup::validate($activation_key);
        $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->users SET user_status = 0 WHERE ID = %d", $user_id ) );

        //Add note on Activity Stream
        if ( function_exists( 'bp_activity_add' ) ) {
            $userlink = bp_core_get_userlink( $user_id );

            bp_activity_add( array(
                'user_id' => $user_id,
                'action' => apply_filters( 'bp_core_activity_registered_member', sprintf( __( '%s became a registered member', 'buddypress' ), $userlink ), $user_id ),
                'component' => 'profile',
                'type' => 'new_member'
            ) );

        }
        //Send email to admin
        wp_new_user_notification( $user_id );

        // Remove the activation key meta
        delete_user_meta( $user_id, 'activation_key' );

        // Delete the total member cache
        wp_cache_delete( 'bp_total_member_count', 'bp' );

        //Hook if you want to do something before the login
        do_action('bp_disable_activation_before_login');

        //Automatically log the user in .
        $user_info = get_userdata($user_id);
        wp_set_auth_cookie($user_id);

        do_action('wp_signon', $user_info->user_login);

        //Hook if you want to do something after the login
        do_action('bp_disable_activation_after_login');

    }
}

// Fix validation on Form B (This doesn't work - doesn't disable emails)
function fix_signup_form_validation_text() {
    //Check if subscriber_type is in form POST (and is from Form B)
    $subscriber_type = $_POST['subscriber_type'];
    if ($subscriber_type){
        return false;
    }
}

// Disable activation email only for Form B (This doesn't work - disables emails for all users)
function disable_activation_email() {
    //Check if subscriber_type is in form POST (and is from Form B)
    $subscriber_type = $_POST['subscriber_type'];
    if ($subscriber_type){
        return false;
    }
}

add_action( 'bp_core_signup_user', 'auto_activate_user');
add_filter( 'bp_registration_needs_activation', 'fix_signup_form_validation_text');
add_filter( 'bp_core_signup_send_activation_key', 'disable_activation_email');
更新:在进一步挖掘之后,我确认了以下内容:

  • bp\u registration\u needs\u activation
    不是要使用的正确筛选器,因为在用户注册过程中没有调用它
  • 添加
    bp\u core\u signup\u send\u activation\u键
    filter将禁用所有激活电子邮件,而不管它作为第二个参数调用什么函数

我被
$subscriber_type | |$subscriber_type==='current_subscriber'
弄糊涂了。如果将
$subscriber\u type
设置为除空字符串以外的任何值(或者如果它是“current\u subscriber”,尽管第二部分是冗余的),则这将是
true
。这是故意的行为吗?@MattRaines对此表示抱歉。这是我忘记删除的较早的测试。我将其更新为只检查
$subscriber\u type
是否有任何值(此时我没有检查具体值)。我被
$subscriber\u type | |$subscriber\u type==='current\u subscriber'
弄糊涂了。如果将
$subscriber\u type
设置为除空字符串以外的任何值(或者如果它是“current\u subscriber”,尽管第二部分是冗余的),则这将是
true
。这是故意的行为吗?@MattRaines对此表示抱歉。这是我忘记删除的较早的测试。我已将其更新为只检查
$subscriber\u type
是否有任何值(此时我不检查具体值)。