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

8

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

Im Idealfall möchte ich das Standard-Tag-Meta-Feld auf dem Post-Bildschirm verwenden, damit Benutzer problemlos neue Begriffe hinzufügen und häufig verwendete 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 das irgendwie benutzen post_tags_meta_box()? Ich habe nachgesehen, add_meta_box()aber das funktioniert nicht 'user'.

epschmidt
quelle
2
+1 für diesen Link ... wusste nicht, dass Sie Benutzern Taxonomien hinzufügen können!
Michael Lewis
Könnten Sie bitte tatsächlich zeigen, was Sie versucht haben? Ich meine "Zeigen Sie mit Ihrem Code, der nicht funktioniert".
Kaiser
@kaiser Der einzige Code, den ich wirklich ausprobiert habe, war add_meta_box (), aber er kann nur für Beitragstypen verwendet werden, nicht für das Benutzerobjekt.
Epschmidt
Als Nebenbemerkung können Taxonomien zu allen Elementen hinzugefügt werden, die eine ID haben, einschließlich Kommentaren, Benutzern, Posts oder sogar Taxonomien. Dies liegt daran, dass Taxonomiebegriffe IDs betreffen, aber keine Annahme darüber treffen, was diese ID über ein Datenformat hinaus darstellt. Es sind die Funktionen an der Spitze, die diese Annahmen treffen
Tom J Nowell

Antworten:

1

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

Sie könnten den Code entführen (kopieren + einfügen) post_categories_meta_box()und versuchen, ihn an den Benutzer anzupassen. Sie würden jedoch mehr Zeit damit verbringen, 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üssten also Javascript entführen und dies ebenfalls ändern.

Ich denke, Ihre beste Wette ist es, den eingeschlagenen Weg fortzusetzen. Sie können overflow:scroll;Ihrem Kontrollkästchen-Container eine 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 empfehlen, die Markup- und PHP-Funktionen aus dem Kern wiederzuverwenden. Verwenden Sie sie stattdessen als Leitfaden, wenn Sie nicht weiterkommen.

Michael Lewis
quelle
Ich habe versucht, den Code aus dem Tag-Feld in post_tags_meta_box () aus dem Kern zu ziehen und ihn dem Benutzerprofil hinzuzufügen. Aber Sie haben Recht, es gibt einige Javascript- und Ajax-Dinge, die ich ebenfalls kopieren müsste, was dies komplizierter machen würde, als ich brauche. Ich denke, ich werde einfach einen benutzerdefinierten Beitragstyp "Mitglied" erstellen und einen Beitrag veröffentlichen, wenn ein Benutzer registriert ist, und stattdessen Taxonomien damit verwenden.
Epschmidt
1

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

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

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

Fügen Sie dem Benutzerbearbeitungsbildschirm 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);
}

Enqueue schlägt Javascript nur für den vom Benutzer bearbeiteten Bildschirm vor (vorausgesetzt, Sie verwenden dies in einem benutzerdefinierten Design).

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
quelle