web-dev-qa-db-fra.com

Ajouter la méta-boîte par défaut de la balise WordPress au profil utilisateur

J'ai configuré mes profils utilisateur pour autoriser les taxonomies personnalisées après ce didacticiel .

Idéalement, j'aimerais utiliser la méta-boîte Tag par défaut à partir de l'écran Post afin que les utilisateurs puissent facilement ajouter de nouveaux termes et en rechercher les plus utilisés. J'utilise actuellement une liste de cases à cocher, mais cela pourrait être très long car nous aurons un certain nombre de taxonomies. Puis-je en quelque sorte utiliser la post_tags_meta_box()? J'ai regardé dans add_meta_box() mais cela ne marche pas avec 'user'.

8
epschmidt

Malheureusement, je dirais que la réponse est non.

Vous pouvez pirater (copier + coller) le code de post_categories_meta_box() et essayer de l'adapter à l'utilisateur, mais vous passeriez plus de temps à essayer de reconnecter tous les éléments. Je suis à peu près sûr que les méta-boîtes post utilisent ajax pour enregistrer et ajouter de nouveaux termes. Vous devez donc détourner du code javascript et le modifier également.

Je pense que votre meilleur pari est de continuer sur la voie que vous suivez. Vous pouvez ajouter une propriété overflow:scroll; css à votre conteneur de cases à cocher afin qu'elle ne soit pas trop longue.

J'ai inversé l'ingénierie des boîtes à méta de poste pour le front-end il y a quelques mois, et ce n'était pas trop difficile. Je ne suggérerais cependant pas d'essayer de réutiliser les fonctions de balisage et php du noyau. Au lieu de cela, utilisez-les comme guide si vous êtes bloqué.

1
Michael Lewis

Brève réponse pour ne décrire que ce qui doit être fait:

  1. WP utilise javascript pour ajouter toute la magie aux boîtes de méta (glisser-déposer, pliage, etc.) -> Vous aurez besoin de wp_enqueue_script( 'posts' ); (ou quel que soit le nom de ce descripteur de script).
  2. Vous aurez besoin des crochets permettant d’enregistrer les méta-boîtes.
  3. Il existe des marquages ​​spécifiques (principalement des conteneurs, par exemple) qui doivent être rendus sur l'écran du profil de l'utilisateur.
1
kaiser

Ce code fonctionne pour moi. Il utilise la taxonomie personnalisée 'locations' et le javascript 'suggérer'. Vous devez l’étendre pour prendre en charge la sélection de plusieurs termes .

Ajouter un champ personnalisé à l'écran de modification de l'utilisateur et stocker des métadonnées lorsque l'utilisateur/admin met à jour le profil

// for account owner
add_action('show_user_profile', 'add_custom_user_profile_fields');
add_action('personal_options_update', 'save_custom_user_profile_fields');

// for admins
add_action('edit_user_profile', 'add_custom_user_profile_fields');
add_action('edit_user_profile_update', 'save_custom_user_profile_fields');

function add_custom_user_profile_fields($user) {
    printf(
    '
<h3>%1$s</h3>
<table class="form-table">
<tr>
<th><label for="location">%2$s</label></th>
<td>
  <input type="text" name="location" id="location" value="%3$s" class="regular-text" />
  <br /><span class="description">%4$s</span>
</td>
</tr>
</table>
',      __('Extra Profile Information', 'locale'),
        __('Location', 'locale'),
        esc_attr(get_user_meta($user->ID, 'location', true)),
        __('Start typing location name.', 'locale')
    );
}

function save_custom_user_profile_fields($user_id) {
    if (!current_user_can('edit_user', $user_id))
        return FALSE;

    $location_name = ( isset($_POST['location']) ) ? $_POST['location'] : '';

    // use your taxonomy name instead of 'locations'
    $location = get_term_by('name', $location_name, 'locations');

    // human readable value and id
    update_user_meta($user_id, 'location', $location_name);
    update_user_meta($user_id, 'location_id', $location->term_id);
}

Enqueue suggère javascript pour l'écran d'édition utilisateur uniquement (en supposant que vous l'utilisiez dans un thème personnalisé)

function admin_scripts($hook) {
    $screen = get_current_screen();
    if ('user-edit' == $screen->id) {
    wp_enqueue_script(
        'user-edit-tag',
        get_stylesheet_directory_uri() . '/js/usermeta.js',
        array('suggest'),
        '20140509',
        true
    );
    }
}

usermeta.js

jQuery(document).ready(function($) {
   // use 'tax=your_taxonomy_name' instead of 'tax=locations'
   $('#location').suggest(ajaxurl+"?action=ajax-tag-search&tax=locations",{
        multiple:false,
        multipleSep: ","
    });
});
1
user51434