【问题标题】:Change current user role with form selection on update (not entry creation)在更新时使用表单选择更改当前用户角色(不是创建条目)
【发布时间】:2013-10-22 09:47:16
【问题描述】:

我在 Wordpress 中使用了强大的表单,并且有一个注册用户的表单。我可以使用注册表单中的单选按钮来确定他们的角色。我有一个钩子。但是,我需要的是一个挂钩,它将根据表单条目 UPDATE 上的单选选择更改用户角色。我当前的代码仅适用于条目创建。这是在注册时分配角色的代码:

add_filter('frmreg_new_role', 'frmreg_new_role', 10, 2);

function frmreg_new_role($role, $atts){
  extract($atts);
  if($form->id == 8){
    if($_POST['item_meta'][280] == 'Job Applicant')
      $role = 'applicant';
  }
  return $role;
}

"8" 是表单本身的 id。 “280”是单选按钮字段的 ID,其中“求职者”是其中一个值。而“申请人”是我们网站的用户角色之一。

我需要对此进行调整,以便在条目创建后在更新时更改角色。我能找到的最接近的东西是在成功 PayPal 付款后更改用户角色的钩子。我试图将两者结合起来,但我无法让它发挥作用。这是 PayPal 生成的用户角色更改器:

add_action('frm_payment_paypal_ipn', 'change_paid_user_role');

function change_paid_user_role($args){
    $new_role = 'contributor'; //change this to the role paid users should have

    if(!$args['pay_vars']['completed'])
       return; //don't continue if the payment was not completed

    if(!$args['entry']->user_id or !is_numeric($args['entry']->user_id))
       return; //don't continue if not linked to a user

    $user = get_userdata($args['entry']->user_id);
    if(!$user)
        return; //don't continue if user doesn't exist

    $updated_user = (array)$user;

    // Get the highest/primary role for this user  
    $user_roles = $user->roles;
    $user_role = array_shift($user_roles);
    if ( $user_role == 'administrator' ) 
        return; //make sure we don't downgrade any admins

    $updated_user['role'] = $new_role;

    wp_update_user($updated_user);
}

更新:根据 Formidable 论坛,动作挂钩可能应该是:frm_after_create_entry。

【问题讨论】:

  • 是的,正如我所提到的,我使用的是“强大的表单”。对于那些不熟悉的人来说,应该澄清这是一个插件的名称。道歉。
  • 忘了提到强大的论坛说 frmreg_new_role 应该替换为 frm_after_create_entry ,因为我正在尝试做。但我无法让它与它一起工作。
  • 哦,他们更改了钩子名称,但没有向后兼容性......他们很好;)
  • 关于 my edit 砍掉礼貌,请参阅:Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?。 . .而且,在这里,您通过投票有用的答案来感谢人们:o)

标签: wordpress forms hook user-roles


【解决方案1】:

很多时候,研究核心文件比任何 Google 或手册都更有效率。在代码编辑器中删除整个插件目录并研究字符串 frm_after_create_entry 会将我们带到发生此钩子的 create() method

之后是update() 方法,它提供了动作钩子:frm_after_update_entry

这个钩子传递两个参数:$id$new_values['form_id']。我无法重现你的设置,所以测试钩子取决于你。

参考:Actions and filters are NOT the same thing…

在这个例子中:

add_action( 'frm_after_update_entry', 'change_role_to_staff', 10, 2); 

function change_role_to_staff( $form_id, $values ){ 
    var_dump($values);
    die();
}
  • 由于这是一个 action 挂钩,因此无需返回任何内容。
  • 没有$roles$atts,参数是表单ID和Values。
  • 您要查找的内容在 $values 内。
  • var_dump()die() 用于调试目的,必须在测试后立即删除。
  • 使用此值执行您的 wp_update_user 并调整您以前的代码。

【讨论】:

  • 感谢您指出这一点。我已经开始仔细研究它,但我不确定我是否有能力以这种方式弄清楚。我确实尝试了以下钩子,但它没有奏效。也许你看到我做错了一些明显的事情: add_action('frm_after_update_entry', 'change_role_to_staff', 10, 2);函数 change_role_to_staff($role, $atts){ extract($atts); if($form->id == 8){ if($_POST['item_meta'][280] == '现任员工') $role = '员工'; } 返回$角色; }
  • 我很感激。这很有帮助。我还没有运气。我已经尝试了以下有和没有 extract($values);其中:add_action('frm_after_update_entry', 'change_role_to_staff', 30, 2);函数 change_role_to_staff( $form_id, $values ){ extract ($values); if($form->id == 8){ if($_POST['item_meta'][280] == '现任员工') $role = '员工'; } $updated_user['role'] = $new_role; wp_update_user($updated_user); }
  • 我第一次用调试的东西做,条目没有正确更新;只显示 int(8) 而没有别的。
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2010-12-18
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多