我经营一个多作者网站。我想限制我的作者选择一些标签。
到目前为止,我发现的唯一选项是使用列表替换免费标记文本字段的技术(类似于类别列表)。这对我来说不是一个解决方案,因为我需要我的作者能够创建新的标签。
当然必须有一种方法来限制非管理员的特定标签?你知不知道怎么?欢迎任何头脑风暴或适当的解决方案。
答案 0 :(得分:1)
我认为理想的解决方案是有条件地过滤post_tags_meta_box
中使用的分类法查询,因为它可以解释其建议,如果有人试图手动输入您不想要的标记,甚至可能会提供一些错误处理他们使用它们,但我不知道有一个过滤器可以帮助解决这个问题。
扩展Giordano的建议并引用this other question,你可以在functions.php中使用这样的东西
add_action('save_post', 'remove_tags_function', 10, 1); //whenever a post is saved, run the below function
function remove_tags_function( $post_id ){
if(!current_user_can('manage_options')){ // if the logged in user cannot manage options (only admin can)
$post_tags = wp_get_post_terms( $post_id, 'post_tag', array( 'fields'=>'names' ) ); //grab all assigned post tags
$pos = array_search( 'tag-to-be-deleted', $post_tags ); //check for the prohibited tag
if( false !== $pos ) { //if found
unset( $post_tags[$pos] ); //unset the tag
wp_set_post_terms ($post_id, $post_tags, 'post_tag'); //override the posts tags with all prior tags, excluding the tag we just unset
}
}//end if. If the current user CAN manage options, the above lines will be skipped, and the tag will remain
}
非管理员用户仍然可以输入并添加tag-to-be-deleted
,但不会粘贴在帖子上。保存后,标签将被剥离。如果用户真的很专注,他们可以拼写不同的方式,或者,正如您所看到的,更改大小写,但无论他们做什么,它在技术上都不会是相同的标签,并且您将能够保持它纯粹用于您需要的任何主题目的。我无法想象没有管理员功能的用户可以添加禁用标签的情况,但我知道永远不会说永远不会。
如果您想允许某些非管理员用户将禁止标记分配给帖子,则必须修改传递到第4行if(!current_user_can('...'){
的参数。有关您可以传递给此条件语句的其他功能的信息,请查看Wordpress documentation of Roles & Capabilities。检查功能而不是角色要容易得多,因此选择一个仅限于您希望免除标签删除的用户级别的逻辑功能。
答案 1 :(得分:0)
您可以创建一个简单的插件,如果作者不是您,则在保存时从帖子中删除指定的标签。
使用add_action('save_post', 'remove_tags_function',10,2);
然后你会创建一个像
这样的函数function remove_tags_function($postID, $post){
if($parent_id = wp_is_post_revision($postID))
{
$postID = $parent_id;
$post = get_post($postID);
}
if($post->post_author != 'YOUR AUTHOR NUMBER'){
$tags = wp_get_post_tags( $post_id );
$i = 0;
foreach($tags as $tag){
if(in_array("TAG NAME", $tag)) unset $tags[$i];
$i++;
}
}}
我没有对它进行过测试,但从逻辑上说它可以正常工作。
编辑:
这不会奏效!
尝试将以下内容放在插件文件夹中的.php文件中。目前尚未测试,但看起来很好。
<?php
add_action('save_post', 'remove_tags_function',10,2);
function remove_tags_function($postID, $post){
if($parent_id = wp_is_post_revision($postID))
{
$postID = $parent_id;
$post = get_post($postID);
}
$user_info = $user_info = get_userdata($post->post_author);
if($user_info->user_level != 10){ // 10 = admin
untag_post($postID, array('TAGS', ... ));
}}
function untag_post($post_ids, $tags) {
global $wpdb;
if(! is_array($post_ids) ) {
$post_ids = array($post_ids);
}
if(! is_array($tags) ) {
$tags = array($tags);
}
foreach($post_ids as $post_id) {
$terms = wp_get_object_terms($post_id, 'post_tag');
$newterms = array();
foreach($terms as $term) {
if ( !in_array($term->name,$tags) ) { //$term will be a wordpress Term object.
$newterms[] = $term;
}
}
wp_set_object_terms($post_id, $newterms, 'post_tag', FALSE);
}
} // I got this from http://wordpress.stackexchange.com/questions/49248/remove-tags-from-posts-in-php/49256#49256
?>
答案 2 :(得分:0)
基于crowjonah的精彩回答,以下是删除多个标签的功能:
<?php
/** block non-admins from using specific post tags **/
function remove_tags_function( $post_id ){
if(!current_user_can('manage_options')){ // if the logged in user cannot manage options (only admin can)
$post_tags = wp_get_post_terms( $post_id, 'post_tag', array( 'fields'=>'names' ) ); //grab all assigned post tags
$pos = array_intersect( array('TAG1', 'TAG2', 'TAG3', 'ETC...'), $post_tags ); //check for the prohibited tag
if( !empty($pos) ) { //if found
$post_tags = array_diff($post_tags, $pos);
wp_set_post_terms ($post_id, $post_tags, 'post_tag'); //override the posts tags with all prior tags, excluding the tag we just unset
}
}//end if. If the current user CAN manage options, the above lines will be skipped, and the tag will remain
}
add_action('save_post', 'remove_tags_function', 10, 1); //whenever a post is saved, run the below function
?>
Itamar