it-swarm.com.de

Benutzerdefinierte Profilfelder werden gespeichert

Ich füge Benutzern einer bestimmten Rolle ein benutzerdefiniertes Profilfeld wie folgt hinzu:

function add_custom_profile_fields( $fields ) {

    // get current user ID
    $user = new WP_User( $_GET['user_id'] );

    // get current user role
    if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
        foreach ( $user->roles as $role ) {

            // filter roles
            if ($role == "paying_member"){
               $fields['Paypal_account'] = 'Paypal account';        
            }
         }
     }

    return $fields;
}
add_filter('user_contactmethods','add_custom_profile_fields',10,1);

Das Problem ist, dass der Feldwert nicht gespeichert wird. Wenn ich mich als Administrator anmelde, bearbeite ich das Profil eines Benutzers. Es hat irgendwie damit zu tun, dass ich nach Benutzerrolle filtere, denn wenn ich diesen Teil entferne, werden die Werte perfekt gespeichert.

EDIT: Ich denke, vielleicht ist die ganze Methode falsch, ich versuche es stattdessen .

1
mike23

Ok, ich habe es falsch gemacht, hier ist eine funktionierende Lösung, basierend auf Justin Tadlocks Tutorial .

<?php
/* Add custom profile fields (call in theme : echo $curauth->fieldname;) */ 

add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );

function my_show_extra_profile_fields( $user ) { ?>

    <?php if(user_can($user->ID, "paying_member")) : ?>

        <h3>Extra profile information</h3>

        <table class="form-table">

            <tr>
                <th><label for="Paypal_account">Paypal</label></th>

                <td>
                    <input type="text" name="Paypal_account" id="Paypal_account" value="<?php echo esc_attr( get_the_author_meta( 'Paypal_account', $user->ID ) ); ?>" class="regular-text" /><br />
                    <span class="description">Please enter your Paypal account.</span>
                </td>
            </tr>

        </table>

    <?php endif; ?>

<?php }

add_action( 'personal_options_update', 'my_save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_extra_profile_fields' );

function my_save_extra_profile_fields( $user_id ) {

    if ( !current_user_can( 'edit_user', $user_id ) )
        return false;

    /* Copy and paste this line for additional fields. Make sure to change 'Paypal_account' to the field ID. */
    update_usermeta( $user_id, 'Paypal_account', $_POST['Paypal_account'] );
}


?>

Die wichtigste Ergänzung zu seinem Code ist die folgende Codezeile:

<?php if(user_can($user->ID, "paying_member")) : ?>

Wodurch die benutzerdefinierten Felder nur für Benutzer mit der Rolle "paying_member" und Admins angezeigt werden.

4
mike23

Sie können die Schleife über Rollen überspringen und user_can verwenden.

Die Funktion übernimmt entweder eine Fähigkeit oder eine Rolle als Parameter.

if (user_can($user->ID, "paying_member")) { 
    $fields['Paypal_account'] = 'Paypal account';
}

Es könnte sich auch lohnen, in current_user_can nachzuschlagen, um die Benutzersuche zu überspringen.

2
Dave Konopka

Das Problem ist, dass $ _GET ['user_id'] nicht gefüllt ist. Sie möchten die aktuelle Benutzervariable einlesen. Probieren Sie dies aus:

function add_custom_profile_fields( $fields ) {
  global $current_user;
  if user_can($current_user, "paying_member") { 
    $fields['Paypal_account'] = 'Paypal account';
  }
  return $fields;
}
0
Dave Konopka