将默认的WordPress标记元框添加到用户个人资料


8

我已经设置了用户个人资料,以允许按照本教程进行自定义分类法。

理想情况下,我想使用“张贴”屏幕中的默认“标记”元框,以便用户可以轻松添加新术语并查找常用术语。我当前正在使用一个复选框列表,但这可能会花费很长时间,因为我们将使用许多分类法。我能以某种方式使用post_tags_meta_box()吗?我已经调查了,add_meta_box()但是没用'user'


2
为该链接+1 ...不知道您可以为用户添加分类法!
迈克尔·刘易斯

您可以实际显示您尝试过的内容吗?我的意思是“显示不起作用的代码”。
kaiser

@kaiser我真正尝试过的唯一代码是add_meta_box(),但它只能用于帖子类型,而不能用于用户对象。
epschmidt

作为旁注,可以将分类法添加到具有ID的任何内容中,包括评论,用户,帖子,甚至分类法本身。之所以如此,是因为分类术语与ID相关,但不对该ID代表的数据格式做任何假设。正是这些最基础的功能做出了这些假设
Tom J Nowell

Answers:


1

不幸的是,我会说答案是否定的。

您可以劫持(复制+粘贴)其中的代码,post_categories_meta_box()并尝试使其适应用户,但是您将花费更多时间尝试重新连接所有代码。我非常确定post meta框使用ajax保存和添加新术语,因此您必须劫持一些javascript并对其进行修改。

我认为您最好的选择是继续前进。您可以将overflow:scroll;css属性添加到复选框容器中,以免时间太长。

几个月前,我对前端的post meta框进行了反向工程,这并不难。我不建议尝试从核心重用标记和php函数。相反,如果遇到问题,请以它们为指导。


我沿着试图从核心的post_tags_meta_box()中的“标记”框中提取代码并将其添加到用户个人资料的路径走了。但是您是对的,我需要复制一些JavaScript和Ajax内容,这会使它比我需要的更加复杂。我想我将创建一个“成员”自定义帖子类型,并在注册用户时发布帖子,并使用分类法来代替。
epschmidt

1

简要答案仅概述需要做什么:

  1. WP使用javascript将所有魔术添加到meta框(拖放,折叠等)->您需要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: ","
    });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.