it-swarm.com.de

Fügen Sie dem Benutzerprofil das Standard-Meta-Feld für WordPress-Tags hinzu

Ich habe meine Benutzerprofile so eingerichtet, dass benutzerdefinierte Taxonomien gemäß diesem Lernprogramm zulässig sind.

Im Idealfall möchte ich das Standard-Tag-Metafeld auf dem Post-Bildschirm verwenden, damit Benutzer problemlos neue Begriffe hinzufügen und häufig verwendete Begriffe finden können. Ich verwende derzeit eine Checkbox-Liste, aber dies kann sehr lange dauern, da wir eine Reihe von Taxonomien haben. Könnte ich irgendwie die post_tags_meta_box() benutzen? Ich habe add_meta_box() untersucht, aber das funktioniert nicht mit 'user'.

8
epschmidt

Leider würde ich sagen, die Antwort ist nein.

Sie könnten den Code aus post_categories_meta_box() hijacken (kopieren + einfügen) und versuchen, ihn an den Benutzer anzupassen, aber Sie würden mehr Zeit darauf verwenden, alle Teile wieder zu verbinden. Ich bin mir ziemlich sicher, dass die Post-Meta-Boxen Ajax verwenden, um neue Begriffe zu speichern und hinzuzufügen. Sie müssen also JavaScript hijacken und das auch ändern.

Ich denke, Ihre beste Wette ist es, den eingeschlagenen Weg fortzusetzen. Sie können Ihrem Kontrollkästchen-Container eine overflow:scroll; css-Eigenschaft hinzufügen, damit es nicht zu lang wird.

Ich habe vor ein paar Monaten die Post-Meta-Boxen für das Frontend rückgängig gemacht, und es war nicht allzu schwer. Ich würde jedoch nicht vorschlagen, die Markup- und PHP-Funktionen aus dem Kern wiederzuverwenden. Verwenden Sie sie stattdessen als Richtlinie, wenn Sie nicht weiterkommen.

1
Michael Lewis

Kurze Antwort, um nur zu skizzieren, was zu tun ist:

  1. WP verwendet Javascript, um den Meta-Boxen die Magie hinzuzufügen (Drag & Drop, Falzen usw.) -> Sie müssen wp_enqueue_script( 'posts' ); (oder wie auch immer das Skript-Handle aufgerufen wurde).
  2. Sie benötigen die Haken, mit denen Sie die Meta-Boxen registrieren können.
  3. Es gibt bestimmte MarkUp-Dateien (meistens Container usw.), die auf dem Benutzerprofilbildschirm gerendert werden müssen.
1
kaiser

Dieser Code funktioniert für mich. Es verwendet die benutzerdefinierte Taxonomie "Orte" und "schlägt" Javascript vor. Sie müssen es erweitern, um die Auswahl mehrerer Begriffe zu unterstützen .

Fügen Sie dem Benutzer-Bearbeitungsbildschirm ein benutzerdefiniertes Feld hinzu und speichern Sie Metadaten, wenn der Benutzer/Administrator das Profil aktualisiert

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

Schlagen Sie Javascript nur für den Benutzer-Bearbeitungsbildschirm vor (vorausgesetzt, Sie verwenden dies in einem benutzerdefinierten Thema)

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