0

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

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

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

4

3 回答 3

1

我认为理想的解决方案是有条件地过滤使用的分类查询,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 文档。检查功能比检查角色要容易得多,因此请选择一个逻辑功能,该功能仅限于您希望免于标签删除的用户级别。

于 2012-09-10T18:38:30.023 回答
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
?>
于 2012-09-10T17:55:41.080 回答
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      
?>

伊塔马尔

于 2018-08-05T16:45:35.217 回答