Aggiungi la meta box del tag WordPress predefinito al profilo utente


8

Ho impostato i miei profili utente per consentire tassonomie personalizzate seguendo questo tutorial .

Idealmente, mi piacerebbe utilizzare la meta box Tag predefinita dalla schermata Posta, in modo che gli utenti possano facilmente aggiungere nuovi termini e trovare quelli comunemente usati. Attualmente sto usando un elenco di caselle di controllo, ma questo potrebbe richiedere molto tempo poiché avremo un numero di tassonomie. Potrei in qualche modo usare il post_tags_meta_box()? Ho esaminato add_meta_box()ma non funziona 'user'.


2
+1 per quel link ... non sapevo che potresti aggiungere tassonomie agli utenti!
Michael Lewis,

Potresti davvero mostrare cosa hai provato? Voglio dire "mostra con il tuo codice che non funziona".
Kaiser

@kaiser L'unico codice che ho davvero provato è stato add_meta_box () ma può essere utilizzato solo su tipi di post, non sull'oggetto utente.
epschmidt,

Come sidenote, le tassonomie possono essere aggiunte a tutto ciò che ha un ID, inclusi commenti, utenti, post o persino tassonomie stesse. Questo perché i termini della tassonomia si riferiscono agli ID ma non fanno ipotesi su ciò che quell'ID rappresenta oltre un formato di dati. Sono le funzioni in cima che fanno queste ipotesi
Tom J Nowell

Risposte:


1

Purtroppo, direi che la risposta è no.

Potresti dirottare (copiare + incollare) il codice post_categories_meta_box()e provare ad adattarlo all'utente, tuttavia passeresti più tempo a provare a riconnettere tutti i pezzi. Sono abbastanza sicuro che le meta box post utilizzino ajax per salvare e aggiungere nuovi termini, quindi dovresti dirottare javascript e modificarlo anche.

Penso che la tua scommessa migliore sia continuare lungo il percorso che stai seguendo. È possibile aggiungere una overflow:scroll;proprietà CSS al contenitore della casella di controllo in modo che non diventi troppo lungo.

Ho invertito la progettazione dei meta box post per il front-end alcuni mesi fa, e non è stato troppo difficile. Non consiglierei di provare a riutilizzare le funzioni di markup e php dal core. Invece, usali come guida se rimani bloccato.


Ho seguito il tentativo di estrarre il codice dalla casella Tag in post_tags_meta_box () dal core e di aggiungerlo al profilo utente. Ma hai ragione, ci sono alcune cose javascript e ajax che dovrei copiare e che renderebbero tutto ciò più complicato del necessario. Penso che creerò semplicemente un tipo di post personalizzato "Membro" e pubblicherò un post quando un utente sarà registrato e userò tassonomie con quello.
epschmidt,

1

Breve risposta per delineare solo ciò che deve essere fatto:

  1. WP usa javascript per aggiungere tutta la magia alle meta box (trascina e rilascia, piega, ecc.) -> Dovrai wp_enqueue_script( 'posts' ); (o comunque è stato chiamato quel handle di script).
  2. Avrai bisogno di ganci che consentano la registrazione delle meta box.
  3. C'è MarkUp specifico (principalmente container e simili) che deve essere renderizzato nella schermata del profilo utente.

1

Questo codice funziona per me. Utilizza la tassonomia personalizzata di 'locations' e javascript 'suggest'. È necessario estenderlo per supportare la selezione di più termini .

Aggiungi campo personalizzato alla schermata di modifica dell'utente e archivia i metadati quando l'utente / amministratore aggiorna il profilo

// 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);
}

Accoda suggerisci javascript solo per la schermata di modifica dell'utente (supponendo che tu lo usi in tema personalizzato)

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: ","
    });
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.