it-swarm-ko.tech

업로드 한 미디어 라이브러리 항목 만 보도록 사용자를 제한 하시겠습니까?

사용자가 add_cap('upload_files')을 사용하여 사진을 업로드 할 수있게하고 싶지만 프로필 페이지에서 미디어 라이브러리는 업로드 된 모든 이미지를 보여줍니다.theyuploaded 이미지 만 볼 수 있도록 필터링하는 방법은 무엇입니까?

여기에 내 해결책이있다. 간단한 WP 쿼리를 수행 한 다음 사용자의 "프로필"페이지에서 루프를 수행한다.

$querystr = " SELECT wposts.post_date,wposts.post_content,wposts.post_title, guid 
FROM $wpdb->posts wposts
WHERE wposts.post_author = $author 
AND wposts.post_type = 'attachment' 
ORDER BY wposts.post_date DESC";

$pageposts = $wpdb->get_results($querystr, OBJECT);
45
TerryMatula

pre_get_posts 필터를 사용하여 항상 미디어 목록을 필터링 할 수 있습니다. 필터는 먼저 페이지를 결정하고 사용자의 기능을 확인하고 특정 조건이 충족 될 때 작성자 매개 변수를 설정합니다.

add_action('pre_get_posts','users_own_attachments');
function users_own_attachments( $wp_query_obj ) {

    global $current_user, $pagenow;

    $is_attachment_request = ($wp_query_obj->get('post_type')=='attachment');

    if( !$is_attachment_request )
        return;

    if( !is_a( $current_user, 'WP_User') )
        return;

    if( !in_array( $pagenow, array( 'upload.php', 'admin-ajax.php' ) ) )
        return;

    if( !current_user_can('delete_pages') )
        $wp_query_obj->set('author', $current_user->ID );

    return;
}

삭제 페이지 캡을 조건으로 사용하여 관리자 및 편집자가 여전히 전체 미디어 목록을 볼 수 있습니다.

하나의 작은 부작용이 있습니다. 어떤 후크도 볼 수 없으며, 미디어 목록 위의 첨부 파일 수가 표시됩니다 (여전히 미디어 항목의 총 개수를 보여 주며 지정된 사용자의 총 개수는 표시하지 않습니다. 이 사소한 문제를 생각해보십시오).

내가 똑같이 올리면 유용 할거야.;)

37
t31os

WP 3.7부터는 documentation 에서 제공하는 ajax_query_attachments_args 필터를 통해 훨씬 더 좋은 방법이 있습니다 :

add_filter( 'ajax_query_attachments_args', 'show_current_user_attachments' );

function show_current_user_attachments( $query ) {
    $user_id = get_current_user_id();
    if ( $user_id ) {
        $query['author'] = $user_id;
    }
    return $query;
}
30
David

다음은 게시물과 미디어 모두를위한 완벽한 솔루션입니다 (이 코드는 작성자를위한 것이지만 모든 사용자 역할에 맞게 변경할 수 있습니다). 또한 코어 파일을 해킹하지 않고 게시/미디어 수를 수정합니다.

// Show only posts and media related to logged in author
add_action('pre_get_posts', 'query_set_only_author' );
function query_set_only_author( $wp_query ) {
    global $current_user;
    if( is_admin() && !current_user_can('edit_others_posts') ) {
        $wp_query->set( 'author', $current_user->ID );
        add_filter('views_edit-post', 'fix_post_counts');
        add_filter('views_upload', 'fix_media_counts');
    }
}

// Fix post counts
function fix_post_counts($views) {
    global $current_user, $wp_query;
    unset($views['mine']);
    $types = array(
        array( 'status' =>  NULL ),
        array( 'status' => 'publish' ),
        array( 'status' => 'draft' ),
        array( 'status' => 'pending' ),
        array( 'status' => 'trash' )
    );
    foreach( $types as $type ) {
        $query = array(
            'author'      => $current_user->ID,
            'post_type'   => 'post',
            'post_status' => $type['status']
        );
        $result = new WP_Query($query);
        if( $type['status'] == NULL ):
            $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : '';
            $views['all'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('All')
        );
        elseif( $type['status'] == 'publish' ):
            $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : '';
            $views['publish'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Publish')
        );
        elseif( $type['status'] == 'draft' ):
            $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : '';
            $views['draft'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Draft')
        );
        elseif( $type['status'] == 'pending' ):
            $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : '';
            $views['pending'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Pending')
        );
        elseif( $type['status'] == 'trash' ):
            $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : '';
            $views['trash'] = sprintf(
            '<a href="%1$s"%2$s>%4$s <span class="count">(%3$d)</span></a>',
            admin_url('edit.php?post_type=post'),
            $class,
            $result->found_posts,
            __('Trash')
        );
        endif;
    }
    return $views;
}

// Fix media counts
function fix_media_counts($views) {
    global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types;
    $views = array();
    $count = $wpdb->get_results( "
        SELECT post_mime_type, COUNT( * ) AS num_posts 
        FROM $wpdb->posts 
        WHERE post_type = 'attachment' 
        AND post_author = $current_user->ID 
        AND post_status != 'trash' 
        GROUP BY post_mime_type
    ", ARRAY_A );
    foreach( $count as $row )
        $_num_posts[$row['post_mime_type']] = $row['num_posts'];
    $_total_posts = array_sum($_num_posts);
    $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] );
    if ( !isset( $total_orphans ) )
        $total_orphans = $wpdb->get_var("
            SELECT COUNT( * ) 
            FROM $wpdb->posts 
            WHERE post_type = 'attachment'
            AND post_author = $current_user->ID 
            AND post_status != 'trash' 
            AND post_parent < 1
        ");
    $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));
    foreach ( $matches as $type => $reals )
        foreach ( $reals as $real )
            $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real];
    $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : '';
    $views['all'] = "<a href='upload.php'$class>" . sprintf( __('All <span class="count">(%s)</span>', 'uploaded files' ), number_format_i18n( $_total_posts )) . '</a>';
    foreach ( $post_mime_types as $mime_type => $label ) {
        $class = '';
        if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )
            continue;
        if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )
            $class = ' class="current"';
        if ( !empty( $num_posts[$mime_type] ) )
            $views[$mime_type] = "<a href='upload.php?post_mime_type=$mime_type'$class>" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . '</a>';
    }
    $views['detached'] = '<a href="upload.php?detached=1"' . ( $detached ? ' class="current"' : '' ) . '>' . sprintf( __( 'Unattached <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . '</a>';
    return $views;
}
19
Paul

이 버전은 승인 된 답변 의 수정 된 버전입니다. 허용 된 대답은 왼쪽의 미디어 메뉴 항목 만 대상으로하므로 사진을 게시물에 업로드 할 때 모달 상자에서 전체 미디어 라이브러리를 볼 수 있습니다. 이 약간 수정 된 코드는 그 상황을 수정합니다. 대상 사용자는 게시물 내에 나타나는 모달 상자의 미디어 라이브러리 탭에서 자신의 미디어 항목 만 볼 수 있습니다.

이것은 수락 할 답변에서 편집 할 줄을 주석으로 표시 한 코드입니다 ...

add_action('pre_get_posts','users_own_attachments');
function users_own_attachments( $wp_query_obj ) {

    global $current_user, $pagenow;

    if( !is_a( $current_user, 'WP_User') )
        return;

    if( 'upload.php' != $pagenow ) // <-- let's work on this line
        return;

    if( !current_user_can('delete_pages') )
        $wp_query_obj->set('author', $current_user->id );

    return;
}

사용자가 미디어 메뉴와 미디어 라이브러리 탭에서 업로드 모달의 고유 한 미디어 만 보려면 표시된 줄을 다음으로 바꾸십시오.

if( (   'upload.php' != $pagenow ) &&
    ( ( 'admin-ajax.php' != $pagenow ) || ( $_REQUEST['action'] != 'query-attachments' ) ) )

(줄 바꿈 및 간격은 여기에 읽기 쉽도록 삽입 됨)

다음은 위와 동일하지만 게시물 메뉴 항목에서 자신의 게시물을 볼 수 있도록 제한합니다.

if( (   'edit.php' != $pagenow ) &&
    (   'upload.php' != $pagenow ) &&
    ( ( 'admin-ajax.php' != $pagenow ) || ( $_REQUEST['action'] != 'query-attachments' ) ) )

(줄 바꿈 및 간격은 여기에 읽기 쉽도록 삽입 됨)

메모: 대답과 마찬가지로 게시물과 미디어 카운터가 틀립니다. 그러나이 답변은이 페이지의 다른 답변에서 볼 수 있습니다. 그들을 테스트하지 않았다.

5
Sparky

t31os에는 훌륭한 솔루션이 있습니다. 유일한 것은 모든 게시물의 수가 여전히 표시된다는 것입니다.

JQuery를 사용하여 숫자가 계속 표시되는 것을 막을 수있는 방법을 찾았습니다.

이 파일을 함수 파일에 추가하기 만하면됩니다.

    function jquery_remove_counts()
{
    ?>
    <script type="text/javascript">
    jQuery(function(){
        jQuery("ul.subsubsub").find("span.count").remove();
    });
    </script>
    <?php
}
add_action('admin_head', 'jquery_remove_counts');

그것은 나를 위해 일하고있어!

2
user15182

전체 작업 코드 .. 게시물 추가 페이지의 미디어 라이브러리에서 이미지 개수가 잘못 나오는 경우에만 문제가 발생합니다.

function my_files_only( $wp_query ) {
if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/upload.php' ) !== false ) {
    if ( !current_user_can( 'level_5' ) ) {
        global $current_user;
        $wp_query->set( 'author', $current_user->id );
    }
}
else if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/media-upload.php' ) !== false ) {
    if ( !current_user_can( 'level_5' ) ) {
        global $current_user;
        $wp_query->set( 'author', $current_user->id );
    }
}
}
add_filter('parse_query', 'my_files_only' );
2
Nitin

이 작업을 수행하는 한 가지 방법은 Role Scoper 플러그인 을 사용하는 것입니다. 매우 구체적인 역할과 기능을 관리하는 데에도 좋습니다. 실제로 미디어 라이브러리의 이미지에 대한 액세스는 각 사용자가 업로드 한 이미지로만 잠글 수 있습니다. 나는 현재 작업하고있는 프로젝트에서이 도구를 사용하고 있으며 잘 작동합니다.

1
Rick Curran

나는 거친, 그러나 실행할 수있는 해결책으로 나의 문제를 해결했다.

1) WP 대시 보드 숨기기 플러그인을 설치 했으므로 사용자는 프로필 편집 양식에 대한 링크 만 볼 수 있습니다.

2) author.php 템플릿 파일에서 위에 사용 된 코드를 삽입했습니다.

3) 그런 다음 로그인 한 사용자의 경우 업로드 페이지 "wp-admin/media-new.php"에 대한 직접 링크를 표시했습니다.

4) 내가 알아 차린 다음 호는 그들이 사진을 업로드 한 후 사진을 upload.php로 리디렉션 할 것이고 다른 모든 사진을 볼 수 있습니다. media-new.php 페이지에 훅을 발견하지 못했기 때문에 "media-upload.php"코어를 해킹하여 프로파일 페이지로 리디렉션했습니다.

    global $current_user;
    get_currentuserinfo();
    $userredirect =  get_bloginfo('home') . "/author/" .$current_user->user_nicename;

그런 다음 wp_redirect( admin_url($location) );wp_redirect($userredirect);로 바꿉니다.

하지만 몇 가지 문제가 있습니다. 첫째, 로그인 한 사용자는 'upload.php'로 이동할 수 있습니다 (존재하는 경우). 파일을 보는 것 외에는 아무 것도 할 수 없으며 사람들의 99 %는 알지도 못합니다.하지만 여전히 최적은 아닙니다. 둘째, 업로드 후에 관리자를 프로필 페이지로 리디렉션합니다. 이들은 사용자 역할을 확인하고 구독자를 리디렉션하는 것만으로도 상당히 간단한 수정을 할 수 있습니다.

누군가 코어 파일에 들어 가지 않고 미디어 페이지에 연결하는 것에 대한 아이디어가 있다면, 고맙겠습니다. 감사!

1
TerryMatula
<?php
/*
Plugin Name: Manage Your Media Only
Version: 0.1
*/

//Manage Your Media Only
function mymo_parse_query_useronly( $wp_query ) {
    if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/upload.php' ) !== false ) {
        if ( !current_user_can( 'level_5' ) ) {
            global $current_user;
            $wp_query->set( 'author', $current_user->id );
        }
    }
}

add_filter('parse_query', 'mymo_parse_query_useronly' );
?>

위의 코드를 manage_your_media_only.php로 저장하고 압축하여 WP에 플러그인으로 업로드하고 활성화하십시오.

1
Philip Borisov