联系表格 7 (CF7) 单选按钮以更改 WordPress 上的用户角色

Posted

技术标签:

【中文标题】联系表格 7 (CF7) 单选按钮以更改 WordPress 上的用户角色【英文标题】:Contact Form 7 (CF7) radio button to change User Role on WordPress 【发布时间】:2020-03-30 03:03:57 【问题描述】:

我有一个表单设置供用户在我的 WordPress 网站上注册后填写。我使用 Contact Form 7 设置了表单,并有一个名为 radio-766 的单选按钮,它有两个选项:订阅者和客户。

我希望用户选择这两个选项之一,然后当他们提交表单时,它将更改他们的用户角色。

以下是我目前所拥有的...我从网上获取了 sn-ps 并尝试创建自己的,但它不起作用。关于如何让它发挥作用的任何想法?

function tm_cf7_roles_posted_data( $posted_data ) 

    // Stop if user is not logged in.
    if ( ! is_user_logged_in() )
        return;

    ob_start();

    $role = sanitize_key( $posted_data['radio-766'] );
    if ( ! in_array( $role, array( 'subscriber', 'customer' ) ) )
        return;

    $user = new WP_User( get_current_user_id() );
    $index = key( $user->roles );
    $user_role = $user->roles[ $index ];


    $output = ob_get_contents();
    ob_end_clean();
    return $output;
 
add_action( 'wpcf7_posted_data', 'tm_cf7_roles_posted_data' );

我应该在任何地方包含表单名称或 ID 吗?找不到这方面的信息

非常感谢任何帮助!

编辑

我觉得这个函数和名为“After LinkedIn”的CF7表单没有任何联系,所以我找到了这个sn-p的代码,只是不知道如何集成和工作

if (!isset($cfdata->posted_data) && class_exists('WPCF7_Submission')) 
        // Contact Form 7 version 3.9 removed $cfdata->posted_data and now
        // we have to retrieve it from an API
        $submission = WPCF7_Submission::get_instance();
        if ($submission) 
            $formdata = $submission->get_posted_data();
        
     elseif (isset($cfdata->posted_data)) 
        // For pre-3.9 versions of Contact Form 7
        $formdata = $cfdata->posted_data;
     else 
        // We can't retrieve the form data
        return $cfdata;
    
      // Check this is the user registration form
    if ( $cfdata->title() == 'After LinkedIn') 


【问题讨论】:

确保您的函数 tm_cf7_roles_posted_data 在表单提交后正在调用? 你能在这里打印$role吗 嘿@ajith 和 jinesh 感谢您的回复......我到底是怎么做这些事情的?我不确定要添加什么 @Kiki 你能看看这个帖子吗***.com/questions/40000543/… 感谢@ajith,我现在也尝试使用该帖子中的一些信息,但它也没有工作。如果有帮助的话,我刚刚用更多信息更新了我的问题 【参考方案1】:

根据 Contact form 7 插件作者is_user_logged_in() 将在以下表单提交案例中工作:

    subscribers_only: true 设置在表单的附加设置中。 使用add_filter( 'wpcf7_verify_nonce', '__return_true' );WPCF7_VERIFY_NONCE 设置为true

欲了解更多信息click here。

此外,要更改用户角色,您可以执行以下操作:

add_action( 'wpcf7_posted_data', 'tm_cf7_roles_posted_data' );
function tm_cf7_roles_posted_data( $posted_data ) 
    $submission = WPCF7_Submission::get_instance();
    $wpcf7      = WPCF7_ContactForm::get_current();

    $formID = $wpcf7->id();
    if ( $submission ) 
        if( $formID == "YOUR-FORM-ID" ) 
            if ( is_user_logged_in() ) 
                $role = sanitize_key( $posted_data['radio-766'][0] );
                if ( ! in_array( $role, array( 'subscriber', 'customer' ) ) )
                    return;

                // Getting the WP_User object
                $user = wp_get_current_user();
                // The user exists
                if( $user && $user->exists() ) 
                    // Check if user already has that role or not
                    if ( !in_array( $role, (array) $user->roles ) ) 
                        // Remove all the previous roles from the user and add this one
                        // This will also reset all the caps and set them for the new role
                        $user->set_role( $role );
                    
                
            
        
    

如果您只想为用户添加一个新角色并保留现有角色,那么请使用下面的 set_role 代替:

// Add a new role to the user while retaining the previous ones
$user->add_role( $role );

【讨论】:

【参考方案2】:

至于以编程方式设置用户角色,您只需获取用户对象并使用 set_role() 函数将其角色更改为您想要的任何角色,只要该角色已定义。试试这种方式

function tm_cf7_roles_posted_data( $posted_data ) 

    // Stop if user is not logged in.
    if ( ! is_user_logged_in() )
        return;

    ob_start();

    $role = sanitize_key( $_POST['radio-766'] );
    if ( ! in_array( $role, array( 'subscriber', 'customer' ) ) )
        return;

    $user = new WP_User( get_current_user_id() );
    $index = key( $user->roles );
    $user_role = $user->set_role($role);


    $output = ob_get_contents();
    ob_end_clean();
    return $output;
 
add_action( 'wpcf7_posted_data', 'tm_cf7_roles_posted_data' );

【讨论】:

非常感谢,但它也不起作用:( ....我认为在关联 CF7 表单中的单选选项时仍然缺少一些东西 你能打印 $role 让我知道你得到了正确的价值吗?请检查我的答案我已经更新了它 也许这会有所帮助...这是我从以下获得详细信息的原始帖子:wordpress.stackexchange.com/questions/240230/… 这可以正常工作并正确更改角色,现在当我尝试将选择更改为 CF7 时它不起作用。 可以分享你的网址吗? echo $role = sanitize_key( $_POST['radio-766'] ); 不幸的是,它不是本地托管的。当我在此代码中打印角色时,什么都没有显示。我将使用我发现的另一个直接连接到 CF7 表单的代码来更新我的问题

以上是关于联系表格 7 (CF7) 单选按钮以更改 WordPress 上的用户角色的主要内容,如果未能解决你的问题,请参考以下文章

联系表格 7 + Paypal 集成

php CF7 |示例单选按钮

php CF7 |示例单选按钮

联系表格 7 和 PayPal IPN 集成

联系表格 7 不在我的 WAMP 本地主机上工作

联系表格 7 插件提交按钮 [关闭]