限制Wordpress中非管理员的某些标签

时间:2012-09-10 17:37:24

标签: php wordpress tags privileges user-roles

我经营一个多作者网站。我想限制我的作者选择一些标签。

到目前为止,我发现的唯一选项是使用列表替换免费标记文本字段的技术(类似于类别列表)。这对我来说不是一个解决方案,因为我需要我的作者能够创建新的标签。

当然必须有一种方法来限制非管理员的特定标签?你知不知道怎么?欢迎任何头脑风暴或适当的解决方案。

3 个答案:

答案 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