这是一个很棒的插件材料。这个答案还将包括如何将用户与类别相关联(如果不知道这一点,很难给出解决方案)。
在我们开始之前,真正的肉是在第四步(在底部)。如果您不需要将类别与用户关联的方法,请跳到这一步。
所以首先,让我们把所有的事情都总结在一节课上。我们班有一个静电init
方法,该方法添加操作和(如)以及一些类常量。
<?php
WPSE65959_User_One_Cat::init();
class WPSE65959_User_One_Cat
{
/**
* Nonce name.
*
*/
const NONCE = \'wpse65959_nonce\';
/**
* The user meta key we\'ll use
*
*/
const KEY = \'wpse65959_category\';
/**
* The taxonomy we\'ll use. Just \'category\' in this case.
*
*/
const TAX = \'category\';
public static function init()
{
// add actions here
}
}
第一步:在用户编辑页面中添加一个字段
edit_user_profile
仅在编辑其他用户配置文件时显示。您在编辑自己的配置文件时永远不会看到它,但在编辑其他用户时会看到它。我们的字段将抓取当前所有类别,并将它们放在下拉菜单中。我们还将输出一个nonce字段,稍后在保存用户时检查该字段。
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
add_action(
\'edit_user_profile\',
array(__CLASS__, \'show_field\')
);
}
public static function show_field($user)
{
$terms = get_terms(self::TAX, array(\'hide_empty\' => false));
wp_nonce_field(self::NONCE . $user->ID, self::NONCE, false);
echo \'<h4>\';
esc_html_e(\'User Category\', \'wpse65959\');
echo \'</h4>\';
printf(\'<select name="%1$s" id="%1$s">\', esc_attr(self::KEY));
echo \'<option value="">----</option>\';
foreach($terms as $t)
{
printf(
\'<option value="%1$s" %2$s>%3$s</option>\',
esc_attr($t->term_id),
selected(get_user_meta($user->ID, self::KEY, true), $t->term_id, false),
esc_html($t->name)
);
}
echo \'</select>\';
}
}
这一领域的另一面是我们需要拯救它。这样做,钩住
edit_user_profile_update
. 该函数将验证nonce,并确保当前用户具有编辑该用户的权限。
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_action(
\'edit_user_profile_update\',
array(__CLASS__, \'save\')
);
}
public static function save($user_id)
{
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $user_id)
) return;
if(!current_user_can(\'edit_user\', $user_id))
return;
if(isset($_POST[self::KEY]) && $_POST[self::KEY])
update_user_meta($user_id, self::KEY, absint($_POST[self::KEY]));
else
delete_user_meta($user_id, self::KEY);
}
}
我们现在有了一种将用户与类别关联的方法。
第二步:移除类别元框add_meta_boxes_post
. 如果用户不是管理员,请删除类别框,以便作者无法更改类别。
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_action(
\'add_meta_boxes_post\',
array(__CLASS__, \'remove_metabox\')
);
}
public static function remove_metabox()
{
if(current_user_can(\'manage_options\'))
return; // this is an admin. Admins can do what they want.
remove_meta_box(
\'categorydiv\',
\'post\',
\'side\'
);
}
}
第三步:更改非管理员的默认类别如果用户不是管理员,他们将看不到类别元框,因此我们需要确保他们的帖子属于正确的类别。钩入
pre_option_default_category
要做到这一点。
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_filter(
\'pre_option_default_category\',
array(__CLASS__, \'default_cat\')
);
}
public static function default_cat($false)
{
if(current_user_can(\'manage_options\'))
return $false; // don\'t change default category for admins
if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true))
return $cat; // we have a default category for this user.
return $false; // no default category, return the original value
}
}
第四步:通过将用户与类别相关联的方式更改查询,我们现在可以更改查询以仅显示其类别中的帖子。
钩入request
. 检查用户是否是管理员,如果不是,则更改查询以仅包括其类别。
<?php
class WPSE65959_User_One_Cat
{
// snip snip
public static function init()
{
// snip snip
add_filter(
\'request\',
array(__CLASS__, \'request\')
);
}
public static function request($vars)
{
if(current_user_can(\'manage_options\'))
return $vars; // admins can view whatever
// if the user has a default category, make sure they only see that category
if($cat = get_user_meta(wp_get_current_user()->ID, self::KEY, true))
$vars[\'cat\'] = $cat;
// handle not having a category associated with them here
return $vars;
}
}
以上所有内容
as a plugin