Eigene Felder bei der Benutzerregistrierung

Es kann durchaus mal vorkommen das bei der Registrierung von Benutzern Felder benötigt werden die nicht vorhanden sind. Normalerweise benutzt man die Seite auf der man Benutzer bearbeitet (user edit screen) um zusätzliche Benutzerdaten abzulegen. Das ist aber manchmal etwas umständlich, da man erst den Benutzer anlegen und ihn in einen zweiten Schritt bearbeiten muss. Deutlich einfacher wäre es, könnte man Registrierung und zusätzliche Benutzerdaten in einen Durchgang erledigen. Diese Fragestellung tauchte auf WordPress StackExchange auf und ich machte mir ein paar Gedanken darüber.

Mein erster Gedanke war, nein geht nicht. Denn das Registrierungsformular bietet weder Hooks noch Filter an die man nutzen könnte um eigene Felder einzufügen. Nun ist das Einfügen einer Tabellenzeile und eines Input-Feldes mit jQuery keine Raketenwissenschaft, beides ist mit ein paar Zeilen Code schnell erledigt.

<?php
/**
* Plugin Name: Custom user registration fields
* Plugin URI: http://yoda.neun12.de
* Description: Add custom fields to the user registration
* Version: 0.1
* Author: Ralf Albert
* Author URI: http://yoda.neun12.de
* Text Domain:
* Domain Path:
* Network:
* License: GPLv3
*/

add_action( 'plugins_loaded', 'wp_custom_user_registration_fields', 10, 0 );


function wp_custom_user_registration_fields(){

add_action(
'admin_print_scripts-user-new.php',
function (){

wp_enqueue_script(
'add_custom_user_registration_field',
plugins_url( 'wp_curf.js', __FILE__ ),
array( 'jquery' ),
false,
true
);

wp_enqueue_script( 'wp_curf_l10n' );

wp_localize_script(
'wp_curf_l10n',
'wp_curf_l10n',
array(
'label' => _( 'Biographical Info' ),
'description' => _( 'Share a little biographical information to fill out your profile. This may be shown publicly.' )
)
);

}
);

}

view raw index.php This Gist is brought to you using Simple Gist Embed.
/**
* jQuery part of Costum User Registration Field
*
* @author Ralf Albert
* @version 0.1
*/

jQuery( document ).ready(

    function($){

        var insertElements =
            '<tr class="form-field">' +
            ' <th scope="row"><label for="description">' + wp_curf_l10n.label + '</label></th>' +
            ' <td><textarea name="description" id="description" rows="5" cols="30"></textarea><br /><span class="description">' + wp_curf_l10n.description + '</span></td>' +
            '</tr>';

        $( '#createuser .form-table tbody' ).append( insertElements );

    }

);
view raw wp_curf.js This Gist is brought to you using Simple Gist Embed.

Das der Code so schlank und kompakt aussieht, liegt daran das ich die “Biographischen Angaben” aus dem Benutzer-Profil, also ein Standardfeld von WordPress, verwendet habe. WordPress verwendet sowohl für das Anlegen als auch für das Bearbeiten eines Benutzers nahezu die gleiche Routine. Somit muss ich mich nicht um die Speicherung des Feldinhaltes kümmern.
Will ich nun ein komplett eigenes Feld erstellen, nennen wir es mal “Abteilung”, muss ich mich wieder um die Speicherung des Feldinhaltes und auch die Anzeige im Benutzerprofil, kümmern. Wie man eigene Felder dem Benutzerprofil hinzufügt und diese anzeigt, dazu gibt es im Netz zahlreiche Tutorials, zum Beispiel bei WP Engineer.
Da aber bereits bei der Registrierung eines Benutzers Daten gespeichert werden sollen, muss noch ein zusätzlichen Hook bemüht werden: user_register. Als Callback kann hier wieder die gleiche Funktion benutzt werden die auch beim Bearbeiten eines Benutzers verwendet wird, so sparen wir uns ein paar Zeilen Code.

Alles zusammen findet sich in diesen Gist und kann als Ausgangspunkt für ein eigenes Plugin verwendet werden.