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

8

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 par défaut Tag de l'écran Post, afin que les utilisateurs puissent facilement ajouter de nouveaux termes et trouver ceux qui sont couramment utilisés. J'utilise actuellement une liste de cases à cocher, mais cela pourrait devenir très long car nous aurons un certain nombre de taxonomies. Puis-je utiliser le post_tags_meta_box()? J'ai examiné, add_meta_box()mais cela ne fonctionne pas 'user'.

epschmidt
la source
2
+1 pour ce lien ... je ne savais pas que vous pouviez ajouter des taxonomies aux utilisateurs!
Michael Lewis
Pourriez-vous s'il vous plaît montrer ce que vous avez essayé? Je veux dire "montrer avec votre code que cela ne fonctionne pas".
kaiser
@kaiser Le seul code que j'ai vraiment essayé était add_meta_box () mais il ne peut être utilisé que sur les types de publication, pas sur l'objet utilisateur.
epschmidt
En tant que sidenote, les taxonomies peuvent être ajoutées à tout ce qui a un ID, y compris les commentaires, les utilisateurs, les publications ou même les taxonomies elles-mêmes. Cela est dû au fait que les termes de taxonomie relient les ID mais ne font aucune hypothèse sur ce que cet ID représente au-delà d'un format de données. Ce sont les fonctions en haut qui font ces hypothèses
Tom J Nowell

Réponses:

1

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

Vous pouvez détourner (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 toutes les pièces. Je suis presque sûr que les méta-boîtes postales utilisent ajax pour enregistrer et ajouter de nouveaux termes, vous devez donc détourner du javascript et le modifier également.

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

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

Michael Lewis
la source
Je suis allé sur le chemin d'essayer d'extraire le code de la boîte de balises dans post_tags_meta_box () du noyau et de l'ajouter au profil utilisateur. Mais vous avez raison, il y a des trucs javascript et ajax en cours que je devrais également recopier, ce qui rendrait cela plus compliqué que ce dont j'ai besoin. Je pense que je vais simplement créer un type de publication personnalisé «Membre» et publier une publication lorsqu'un utilisateur est enregistré et utiliser des taxonomies avec cela à la place.
epschmidt
1

Réponse brève pour esquisser uniquement ce qui doit être fait:

  1. WP utilise javascript pour ajouter toute la magie aux méta-boîtes (glisser-déposer, pliage, etc.) -> Vous en aurez besoin wp_enqueue_script( 'posts' );(ou de la façon dont ce descripteur de script a été appelé).
  2. Vous aurez besoin des crochets qui permettent d'enregistrer les méta-boîtes.
  3. Il y a des MarkUp spécifiques (principalement des conteneurs et autres) qui doivent être affichés sur l'écran du profil utilisateur.
kaiser
la source
1

Ce code fonctionne pour moi. Il utilise la taxonomie personnalisée «emplacements» et «suggère» javascript. Vous devez l'étendre pour prendre en charge la sélection de termes multiples .

Ajouter un champ personnalisé à l'écran de modification de l'utilisateur et stocker les métadonnées lorsque l'utilisateur / l'administrateur 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);
}

Mettre en file d'attente suggérer javascript pour l'écran d'édition utilisateur uniquement (en supposant que vous l'utilisez 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: ","
    });
});
user51434
la source