J'essaie de définir un nouveau projet pour lequel je souhaite donner à mes utilisateurs la possibilité de personnaliser leurs pages de "profil" dans le thème de mon site Web. Des concepts comme ajouter dans leurs propres images d'arrière-plan, choisir des modèles, etc.
Il me semblait logique de stocker cette information dans la méta auteur, car cela semble être la seule table qui stocke des informations uniques pour chaque utilisateur. Une fois que j'ai configuré les zones de saisie, je peux facilement passer les appels dans mon thème.
Les utilisateurs ne semblent pas être des post-types, ni des taxonomies, mais je ne peux pas comprendre ce qu'ils sont vraiment. Quelqu'un pourrait-il prendre un moment pour décrire ce que les utilisateurs sont réellement aux yeux de WordPress?
Ce que j’espérais en fin de compte, c’est de trouver une classe où je peux facilement ajouter des métaboxes aux pages de profil de l’auteur.
Je sais comment étendre les champs de profil via des formulaires, mais je recherche quelque chose de beaucoup plus flexible.
* J'utilise la classe metabox farinspace pour mes post-types et j'aime absolument son fonctionnement, espérant pouvoir utiliser quelque chose de similaire pour les pages de l'auteur.
Est-ce que cela est possible ou y a-t-il un meilleur itinéraire que je devrais prendre?
Les auteurs sont des objets de contenu plutôt simples dans WordPress. Ils ont des rôles et des capacités , des métadonnées de base et leurs propres écrans d'édition. C’est à peu près tout. Si vous souhaitez ajouter une taxonomie personnalisée aux auteurs, vous devez mettre en miroir chaque utilisateur avec un type de publication personnalisé (masqué) car l'objet auteur ne prend pas en charge les taxonomies…
Quoi qu'il en soit… pour les méta-boîtes, j'ai écrit un cours simple. J'espère que cela aide à comprendre comment les choses fonctionnent et où se connecter.
<?php
/**
* Adds a form field to the edit profile page.
*
* @author Thomas Scholz http://toscho.de
* @version 1.2
* @license GPL
*
*/
class T5_User_Profile_Addon
{
public $settings = array (
/* The name attribute. */
'name' => ''
, 'label' => ''
, 'description' => ''
/* You may use the following placeholder:
* %name% - name attribute
* %label% - label text
* %description% - additional text
* To use more placeholders, extend markup_filter().
*/
, 'markup' => ''
/* If both are not FALSE, they will replace the 'markup', and a
* table will be created. Uses the same placeholders as 'markup'.
*/
, 'th' => FALSE
, 'td' => FALSE
/* Capabilities to show and edit the field.
* Useful, if want to add a field that only administrators or editors
* may edit or view.
*/
, 'cap_show' => 'read'
, 'cap_save' => 'edit_user'
);
/**
* Constructor
*
* @param array $args See settings. 'name' and 'markup' required.
*/
public function __construct( $args )
{
$this->settings = array_merge( $this->settings, $args );
// The id attribute should be different to name, otherwise it doesn’t
// work in Opera.
empty ( $this->settings['id'] )
and $this->settings['id'] = $this->settings['name'] . '_id';
FALSE !== $this->settings['th'] and FALSE !== $this->settings['td']
and $this->settings['markup'] = '<table class="form-table"><tr><th>'
. $this->settings['th'] . '</th><td>' . $this->settings['td']
. '</td></tr></table>';
add_action( 'show_user_profile', array ( $this, 'show' ) );
add_action( 'edit_user_profile', array ( $this, 'show' ) );
add_action( 'personal_options_update', array ( $this, 'save' ) );
add_action( 'edit_user_profile_update', array ( $this, 'save' ) );
}
/**
* Prints the form.
*
* @param object $user
* @return void
*/
public function show( $user )
{
if ( ! current_user_can( $this->settings['cap_show'], $user->ID ) )
{
return;
}
$label = "<label for='{$this->settings['id']}'>{$this->settings['label']}</label>";
$markup = strtr( $this->settings['markup'],
array (
'%name%' => $this->settings['name']
, '%id%' => $this->settings['id']
, '%label%' => $label
, '%description%' => $this->settings['description']
)
);
$old_val = trim( get_the_author_meta( $this->settings['name'], $user->ID ) );
$markup = $this->markup_filter( $markup, $old_val );
print $markup;
}
/**
* Saves the data.
*
* @param int $user_id
* @return void
*/
public function save( $user_id )
{
if ( ! current_user_can( $this->settings['cap_save'], $user_id ) )
{
return;
}
$input = empty ( $_POST[ $this->settings['name'] ] )
? '' : $_POST[ $this->settings['name'] ];
$input = $this->prepare_input( $input );
update_user_meta( $user_id, $this->settings['name'], $input );
}
/**
* Prepares the user input. For extensions.
*
* @param string $input
* @return string
*/
public function prepare_input( $input )
{
return $input;
}
/**
* Prepares the form markup.
*
* @param string $markup
* @param string $old_val
* @return string
*/
public function markup_filter( $markup, $old_val )
{
$old_val = htmlspecialchars( $old_val, ENT_QUOTES, 'utf-8', FALSE );
return str_replace( '%content%', $old_val, $markup );
}
}
<?php
add_action( 'init', 'init_profile_addons' );
function init_profile_addons()
{
$GLOBALS['extended_author_text'] = new T5_User_Profile_Addon(
array (
'name' => 'extended_author_text'
, 'label' => 'Second text field'
, 'description' => '<p>This text will be shown at the top of your author archive. You may use HTML.</p>'
, 'markup' => '<table class="form-table"><tr><th>%label%<br /><br />%description%</th>
<td><textarea name="%name%" id="%id%" rows="10" cols="30">%content%</textarea></td></tr></table>'
)
);
}
Dans certains cas, vous souhaiterez peut-être étendre la classe pour modifier certains comportements. Ici, j'ai construit une case à cocher:
/**
* Template for a simple checkbox.
*/
class T5_User_Profile_Checkbox extends T5_User_Profile_Addon
{
public function prepare_input( $input )
{ // Convert the checkbox value to integer
return '' == trim( $input ) ? 0 : 1;
}
public function markup_filter( $markup, $old_value )
{ // Preselect the checkbox if necessary.
$checked = 1 == $old_value ? ' checked="checked"' : '';
return str_replace( '%checked%', $checked, $markup );
}
}
Mon système de gabarit primitif n'est peut-être pas la meilleure approche. Il n'y a pas de traitement d'erreur convivial. J'avais juste besoin de quelque chose qui fonctionne et qui est facile à comprendre. :)
/wp-admin/user-edit.php
: do_action( 'show_user_profile', $profileuser );
. Essayez de raccrocher votre appel à la metabox. Si cela ne fonctionne pas, vous devriez regarder quels scripts sont ajoutés pour les écrans de post-édition et les ajouter aussi.