我经营一个多作者网站。我想限制我的作者选择一些标签。
到目前为止,我发现的唯一选项是用列表替换自由标签文本字段的技术(类似于类别列表)。这对我来说不是一个解决方案,因为我需要我的作者能够创建新标签。
当然必须有一种方法来限制非管理员的特定标签?你知不知道怎么?欢迎任何头脑风暴或适当的解决方案。
我经营一个多作者网站。我想限制我的作者选择一些标签。
到目前为止,我发现的唯一选项是用列表替换自由标签文本字段的技术(类似于类别列表)。这对我来说不是一个解决方案,因为我需要我的作者能够创建新标签。
当然必须有一种方法来限制非管理员的特定标签?你知不知道怎么?欢迎任何头脑风暴或适当的解决方案。
我认为理想的解决方案是有条件地过滤使用的分类查询,post_tags_meta_box
因为它 ajaxes 其建议,如果有人试图手动输入您不希望他们使用的标签,甚至可能提供一些错误处理,但我是不知道有一个过滤器可以帮助解决这个问题。
扩展 Giordano 的建议并引用另一个问题,您可以在 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 文档。检查功能比检查角色要容易得多,因此请选择一个逻辑功能,该功能仅限于您希望免于标签删除的用户级别。
如果作者不是您,您可能可以创建一个简单的插件,在保存时从帖子中删除指定的标签。您可以在帖子保存时调用您的函数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
?>
基于 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
?>
伊塔马尔