it-swarm.com.de

Wie speichere ich verschiedene Usermeta-Felder nach Benutzerrolle?

Ich habe einige benutzerdefinierte Rollen mithilfe eines Plugins erstellt und benutzerdefinierte Benutzer-Metafelder erstellt, die auf den Profilseiten der einzelnen Benutzer angezeigt werden (/wp-admin/profile.php).

Ich habe ein Problem beim Speichern der benutzerdefinierten Felder. Ich kann die Felder in Ordnung speichern, wenn ich die Benutzerrolle nicht ändere. Also, um ein Beispiel zu geben:

  • Benutzer 1 hat die Felder a, b und c und die Benutzerrolle Ausstehend.
  • Wenn ich ihre Benutzerrolle in Besitzer ändere, sind die Felder a und b
  • Wenn ich dann ihre Benutzerrolle in Ausstehend ändere, verschwinden die Details, die sich in Feld C befanden

Es scheint, dass WP es aus der Datenbank entfernt. Ich möchte in der Lage sein, die Rollen und Felder zu ändern, ohne die Daten zu verlieren, die in der usermeta-Datenbanktabelle gespeichert sind.

Ich denke, mein Problem ist mit der update_usermeta Funktion.

//saving the user fields
add_action( 'personal_options_update', 'save_user_fields' );
add_action( 'edit_user_profile_update', 'save_user_fields' );

function save_user_fields( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) )
    return false;
update_usermeta( $user_id, 'unit_type', $_POST['unit_type'] );
update_usermeta( $user_id, 'registered_as', $_POST['registered_as'] );
update_usermeta( $user_id, 'date_registered', $_POST['date_registered'] );
update_usermeta( $user_id, 'unit_number', $_POST['unit_number'] );
update_usermeta( $user_id, 'first_name', $_POST['first_name'] );
update_usermeta( $user_id, 'last_name', $_POST['last_name'] );
update_usermeta( $user_id, 'owner1_address', $_POST['owner1_address'] );
update_usermeta( $user_id, 'owner1_tel_day', $_POST['owner1_tel_day'] );
update_usermeta( $user_id, 'owner1_tel_night', $_POST['owner1_tel_night'] );
update_usermeta( $user_id, 'emergency_contact_name', $_POST['emergency_contact_name'] );
update_usermeta( $user_id, 'emergency_contact_tel_day',     $_POST['emergency_contact_tel_day'] );
update_usermeta( $user_id, 'emergency_contact_tel_night',     $_POST['emergency_contact_tel_night'] );
}
3
Fraggy

Beobachtung: Nach den Richtlinien in diesem Artikel vorgeschlagen versuche ich, die Qualität von Q und A zu verbessern. Es ist ein Lernprozess ...

In Ihrem Originalcode haben Sie je nach Benutzerrolle und anderen Bedingungen unterschiedliche Eingabefelder angezeigt.

add_action( 'show_user_profile', 'user_fields_for_admin', 10);
add_action( 'edit_user_profile', 'user_fields_for_admin', 10);
function user_fields_for_admin( $user ){ 
    switch ($user->roles[0]) {
        case 'pending':
            if ($selected_register == "Owner"){
                // Display some fields;
            } elseif ($selected_register == "Board") {
                // Display other fields
            }
            break;

        case 'owner':
            // Display yet another fields
            break;
    }
}

Beim Speichern der Felder mit update_usermeta (gemäß dem Code in Ihrer bearbeiteten Frage) wurden jedoch alle Felder gespeichert, unabhängig davon, ob sie angezeigt wurden oder nicht.

Sie müssen prüfen, ob der Feldwert übergeben wird, damit die Usermeta bei jeder Aktualisierung nicht mit nicht vorhandenen Werten überschrieben wird.

function save_user_fields($user_id) {
    if (!current_user_can('edit_user', $user_id))
        return false;
    if( isset($_POST['unit_type']) )     update_usermeta($user_id, 'unit_type', $_POST['unit_type']);
    if( isset($_POST['registered_as']) ) update_usermeta($user_id, 'registered_as', $_POST['registered_as']);
    // ETC
}

Vorschläge zum Debuggen und Drucken von HTML

Zu Ihrer Information können Sie den Inhalt eines PHP -Objekts mit folgendem Code überprüfen:

echo '<pre>'.print_r($user, true).'</pre>';

Und anstatt jeweils eine Zeile zu wiederholen, können Sie die Heredoc sintax zum einfachen Lesen/Drucken von HTML verwenden. PHP Variablen stehen in geschweiften Klammern. Beispiel:

echo <<<HTML
    <h3>Owner Details</h3>
    <table class="form-table"><tbody><tr>
    <tr><th>First Name</th>
    <td><input type="text" name="first_name" id="first_name1" value="{$first_name}" class="regular-text" /></td>
    </tr>
    <tr><th>Last Name</th>
    <td><input type="text" name="last_name" id="last_name1" value="{$last_name}" class="regular-text" /></td>
    </tr>
HTML;
3
brasofilo