从设计上来说,回答这个问题是一个多部分的过程。您(或插件/库)需要做几件事才能使用户分类法的行为与Post分类法类似,即使您(成功)注册了Post分类法。
这个答案在某种程度上是一项正在进行的工作。请添加其他答案和解决方案,以解决我所缺少的任何方面。
添加术语管理管理页面并修复父项在为“用户”注册分类法后,您会注意到缺少的第一件事是“管理”菜单项,它根本不存在。
添加管理页面时,Justin Tadlock发现使用edit-tags.php
admin页面(用于post分类)工作得出奇地好,但需要注意的是,我们需要向parent_file
钩子使新的管理页面显示为用户的子级,而不是帖子。
/**
* Creates the admin page for the taxonomy under the \'Users\' menu.
*
* It works the same as any other taxonomy page in the admin by using edit-tags.php
*
* ISSUE: When clicking on the menu item in the admin, WordPress\' menu system thinks
* you\'re viewing something under \'Posts\' instead of \'Users\'.
* SO: When you are on the edit-tags page the "Posts" section of the sidebar is open,
* but the taxonomy\'s name isn\'t there, it\'s still under users.
*
* @see filter_user_taxonomy_admin_page_parent_file() which fixes the issue with menu parent
*/
function add_user_taxonomy_admin_page() {
$tax = get_taxonomy( \'YOUR_TAXONOMY_NAME\' );
if (!is_object($tax) OR is_wp_error($tax))
return;
add_users_page(
esc_attr( $tax->labels->menu_name ),
esc_attr( $tax->labels->menu_name ),
$tax->cap->manage_terms,
\'edit-tags.php?taxonomy=\' . $tax->name
);
}
这与
admin_menu
措施:
add_action( \'admin_menu\', \'add_user_taxonomy_admin_page\');
如上所述,修复亲子关系上述修复工作正常,但侧边栏中的页面会混淆。它将显示为
Users > TAXONOMYNAME
但当您单击它时,用户菜单将不会打开,而侧栏的Posts部分将展开,即使当前页面(TAXONOMYNAME)不在其中。原因是WP认为当前父页是Posts,因为我们使用的是编辑标签。php。
因此,解决方案是过滤parent_file
通过回调确保users.php
当我们的分类法加载到edit-tags.php
:
/**
* Fix position of user taxonomy in admin menu to be under Users by filtering parent_file
*
* Should be used with \'parent_file\' filter.
*
* This is a fix to make edit-tags.php work as an editor of user taxonomies, it solves a
* problem where the "Posts" sidebar item is expanded rather than "Users".
*
* @see add_user_taxonomy_admin_page() which registers the user taxonomy page as edit-tags.php
* @global string $pagenow Filename of current page (like edit-tags.php)
* @param string $parent_file Filename of admin page being filtered
* @return string Filtered filename
*/
function filter_user_taxonomy_admin_page_parent_file( $parent_file = \'\' ) {
global $pagenow;
/**
* Only filter the parent if we are on a the taxonomy screen for
*/
if ( ! empty( $_GET[\'taxonomy\'] ) && ($_GET[\'taxonomy\'] == \'YOUR_TAXONOMY_NAME\') && $pagenow == \'edit-tags.php\' ) {
$parent_file = \'users.php\';
}
return $parent_file;
}
我们按如下方式注册过滤器:
add_filter( \'parent_file\', \'filter_user_taxonomy_admin_page_parent_file\');
将术语选择器添加到用户配置文件屏幕,并在用户保存时处理输入
update_count_callback
功能
update_count_callback
因为分类法是一个计算术语使用次数的函数,以便可以更新其“计数”。
在调用中自定义此值register_taxonomy()
这是非常重要的,因为默认的是专门针对帖子的。
JustinTadlock发现这个函数工作得很好,到目前为止,我发现它适用于任何用户分类法。
/**
* Function for updating a user taxonomy count.
*
* What this does is update the count of a specific term by the number of users that have been given the term.
*
* See the _update_post_term_count() function in WordPress for more info.
*
* @see https://web.archive.org/web/20150327042855/http://justintadlock.com/archives/2011/10/20/custom-user-taxonomies-in-wordpress
* @param array $terms List of Term taxonomy IDs
* @param object $taxonomy Current taxonomy object of terms
*/
function user_taxonomy_update_count_callback( $terms, $taxonomy ) {
global $wpdb;
foreach ( (array) $terms as $term ) {
$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d", $term ) );
do_action( \'edit_term_taxonomy\', $term, $taxonomy );
$wpdb->update( $wpdb->term_taxonomy, compact( \'count\' ), array( \'term_taxonomy_id\' => $term ) );
do_action( \'edited_term_taxonomy\', $term, $taxonomy );
}
}
要将其用作回调,请将调用更新为
register_taxonomy()
并添加
update_count_callback
参数:
$args[\'update_count_callback\'] = \'user_taxonomy_update_count_callback\';
过滤用户名以避免永久链接冲突