Добавить мета-поле тега WordPress по умолчанию в профиль пользователя

8

Я настроил свои профили пользователей, чтобы разрешить настраиваемые таксономии после этого урока .

В идеале я хотел бы использовать мета-поле «Тег» по умолчанию на экране «Пост», чтобы пользователи могли легко добавлять новые термины и находить часто используемые. В настоящее время я использую список флажков, но это может занять очень много времени, поскольку у нас будет несколько таксономий. Могу ли я как-то использовать post_tags_meta_box()? Я смотрел в, add_meta_box()но это не работает 'user'.

epschmidt
источник
2
+1 за эту ссылку ... не знал, что вы можете добавить таксономии для пользователей!
Майкл Льюис
Не могли бы вы показать, что вы пробовали? Я имею в виду "показать с вашим кодом, который не работает".
Кайзер
@kaiser Единственный код, который я действительно попробовал, был add_meta_box (), но его можно использовать только для типов записей, но не для пользовательских объектов.
epschmidt
В качестве идентификатора таксономии могут быть добавлены ко всему, что имеет идентификатор, включая комментарии, пользователей, публикации или даже сами таксономии. Это потому, что термины таксономии связаны с идентификаторами, но не предполагают, что этот идентификатор представляет за пределами формата данных. Именно функции сверху делают эти предположения
Том Дж. Новелл

Ответы:

1

К сожалению, я бы сказал, что ответ - нет.

Вы можете захватить (скопировать + вставить) код post_categories_meta_box()и попытаться адаптировать его под пользователя, однако вы потратите больше времени, пытаясь соединить все части. Я уверен, что в мета-боксах постов используется ajax для сохранения и добавления новых терминов, поэтому вам придется взломать некоторый javascript и изменить его.

Я думаю, что вам лучше всего идти по пути, по которому вы идете. Вы можете добавить overflow:scroll;свойство css в свой контейнер флажков, чтобы оно не становилось слишком длинным.

Я поменял несколько мета-постов для внешнего интерфейса несколько месяцев назад, и это было не слишком сложно. Я бы не советовал пытаться повторно использовать функции разметки и php из ядра. Вместо этого используйте их как руководство, если вы застряли.

Майкл Льюис
источник
Я пошел по пути, пытаясь извлечь код из поля Tag в post_tags_meta_box () из ядра и добавить его в профиль пользователя. Но вы правы, есть некоторые javascript и ajax вещи, которые мне нужно скопировать, что сделает это более сложным, чем мне нужно. Я думаю, что я просто создам пользовательский тип поста «Член» и опубликую пост, когда пользователь зарегистрирован, и вместо этого буду использовать таксономии.
epschmidt
1

Краткий ответ, чтобы только набросать, что нужно сделать:

  1. WP использует javascript для добавления всей магии в мета-блоки (перетаскивание, сворачивание и т. Д.) -> Вам потребуется wp_enqueue_script( 'posts' );(или как бы этот дескриптор сценария не вызывался).
  2. Вам понадобятся хуки, которые позволяют регистрировать мета-блоки.
  3. Есть конкретный MarkUp (в основном контейнеры и тому подобное), который должен отображаться на экране профиля пользователя.
кайзер
источник
1

Этот код работает для меня. Он использует пользовательскую таксономию «местоположения» и JavaScript «предложить». Вы должны расширить его для поддержки выбора нескольких терминов .

Добавьте настраиваемое поле на экран редактирования пользователя и сохраните метаданные, когда пользователь / администратор обновит профиль

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

Поставьте в очередь предложение javascript только для экрана редактирования пользователем (при условии, что вы используете это в пользовательской теме)

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
источник