[wp-trac] [WordPress Trac] #39223: Add a filter to edit $meta array in wpmu_signup_user
WordPress Trac
noreply at wordpress.org
Thu Jan 12 04:33:27 UTC 2017
#39223: Add a filter to edit $meta array in wpmu_signup_user
-------------------------+------------------------
Reporter: Mista-Flo | Owner: Mista-Flo
Type: enhancement | Status: assigned
Priority: normal | Milestone: 4.8
Component: Users | Version: 3.0
Severity: normal | Resolution:
Keywords: has-patch | Focuses: multisite
-------------------------+------------------------
Description changed by SergeyBiryukov:
Old description:
> Hello,
>
> Here's the situation.
>
> In a multisite context, on a new user form in a site of the network, it
> creates a new signup entry in the signups database table with user
> informations, and a meta array containing by default {{{ 'add_to_blog' =>
> $wpdb->blogid, 'new_role' => $_REQUEST['role'] }}}, so when the user is
> finnaly activated (with email confirmation or not) the
> {{{wpmu_activate_user}}} function is called and use this $meta array.
>
> Imagine you want to extend this behavior and for example, add some user
> meta in signup to use it for activation. you have the good hook in
> wpmu_activate_user {{{wpmu_activate_user}}} where you can use the meta
> array to do what you want, but you can't filter the $meta array in
> {{{wpmu_signup_user}}} to add some usefull data.
>
> For example, for my plugin Multiple Roles : https://wordpress.org/plugins
> /multiple-roles/ which allow admins to add multiple roles for a given
> user. In order to handle the multisite behavior, I need to edit this
> $meta array to pass it my multiple roles array.
>
> So according to me, the best approach will be to add a filter for $meta
> array in {{{wpmu_signup_user}}} function just before the database insert
> like this :
>
> {{{#!php
> <?php
> $meta = apply_filters( 'signup_user_meta', $meta, $user, $user_email,
> $key );
> }}}
>
> With this given filter, In my plugin, I just have to add those lines, so
> here a real use of case :
> {{{#!php
> <?php
> add_filter( 'signup_user_meta', 'mu_add_roles_in_signup', 10, 4 ); //
> Handle Multisite
> add_action( 'wpmu_activate_user', 'mu_add_roles_after_activation', 10, 3
> ); // Handle Multisite
>
> /**
> * Add multiple roles in meta array on multisite signups database
> table
> *
> * @param $meta
> * @param $user
> * @param $user_email
> * @param $key
> *
> * @return mixed
> */
> function mu_add_roles_in_signup( $meta, $user, $user_email, $key
> ) {
>
> $new_roles = ( isset( $_POST['md_multiple_roles'] ) &&
> is_array( $_POST['md_multiple_roles'] ) ) ? $_POST['md_multiple_roles'] :
> array();
> if ( ! empty( $new_roles ) ) {
> $meta['md_roles'] = $new_roles;
> }
>
> return $meta;
> }
>
> /**
> * Add multiple roles after user activation
> *
> * @param $user_id
> * @param $password
> * @param $meta
> */
> function mu_add_roles_after_activation( $user_id, $password,
> $meta ) {
> if ( ! empty( $meta['md_roles'] ) ) {
> $this->model->update_roles( $user_id,
> $meta['md_roles'] );
> }
> }
>
> }}}
>
> By the way, if you're okay with my following patch, I would benefit from
> this other ticket : https://core.trac.wordpress.org/ticket/38781 which
> avoid $meta array to be serialized when passed to hooks, in fact, I'm
> using its patch to make mine.
New description:
Hello,
Here's the situation.
In a multisite context, on a new user form in a site of the network, it
creates a new signup entry in the signups database table with user
informations, and a meta array containing by default {{{ 'add_to_blog' =>
$wpdb->blogid, 'new_role' => $_REQUEST['role'] }}}, so when the user is
finnaly activated (with email confirmation or not) the
{{{wpmu_activate_user}}} function is called and use this $meta array.
Imagine you want to extend this behavior and for example, add some user
meta in signup to use it for activation. you have the good hook in
wpmu_activate_user {{{wpmu_activate_user}}} where you can use the meta
array to do what you want, but you can't filter the $meta array in
{{{wpmu_signup_user}}} to add some usefull data.
For example, for my plugin Multiple Roles : https://wordpress.org/plugins
/multiple-roles/ which allow admins to add multiple roles for a given
user. In order to handle the multisite behavior, I need to edit this $meta
array to pass it my multiple roles array.
So according to me, the best approach will be to add a filter for $meta
array in {{{wpmu_signup_user}}} function just before the database insert
like this :
{{{#!php
<?php
$meta = apply_filters( 'signup_user_meta', $meta, $user, $user_email, $key
);
}}}
With this given filter, In my plugin, I just have to add those lines, so
here a real use of case :
{{{#!php
<?php
add_filter( 'signup_user_meta', 'mu_add_roles_in_signup', 10, 4 ); //
Handle Multisite
add_action( 'wpmu_activate_user', 'mu_add_roles_after_activation', 10, 3
); // Handle Multisite
/**
* Add multiple roles in meta array on multisite signups database
table
*
* @param $meta
* @param $user
* @param $user_email
* @param $key
*
* @return mixed
*/
function mu_add_roles_in_signup( $meta, $user, $user_email, $key )
{
$new_roles = ( isset( $_POST['md_multiple_roles'] ) &&
is_array( $_POST['md_multiple_roles'] ) ) ? $_POST['md_multiple_roles'] :
array();
if ( ! empty( $new_roles ) ) {
$meta['md_roles'] = $new_roles;
}
return $meta;
}
/**
* Add multiple roles after user activation
*
* @param $user_id
* @param $password
* @param $meta
*/
function mu_add_roles_after_activation( $user_id, $password, $meta
) {
if ( ! empty( $meta['md_roles'] ) ) {
$this->model->update_roles( $user_id,
$meta['md_roles'] );
}
}
}}}
By the way, if you're okay with my following patch, I would benefit from
this other ticket : #38781 which avoid $meta array to be serialized when
passed to hooks, in fact, I'm using its patch to make mine.
--
--
Ticket URL: <https://core.trac.wordpress.org/ticket/39223#comment:7>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list