it-swarm-vi.tech

Bạn có thể xem những gì bạn có thể xem?

Tôi muốn người dùng có thể tải lên ảnh bằng cách sử dụng add_cap('upload_files') nhưng trong trang hồ sơ của họ, Thư viện phương tiện hiển thị mọi hình ảnh được tải lên. Làm cách nào tôi có thể lọc để họ chỉ có thể xem hình ảnh họ đã tải lên?

Đây là giải pháp của tôi cho thời điểm hiện tại tôi đang thực hiện một truy vấn WP đơn giản, sau đó lặp lại trên trang "Hồ sơ" của người dùng

$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

Bạn luôn có thể lọc danh sách phương tiện bằng bộ lọc pre_get_posts trước tiên xác định trang và khả năng của người dùng và đặt tham số tác giả khi đáp ứng một số điều kiện nhất định.

Thí dụ

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;
}

Tôi đã sử dụng giới hạn xóa trang như một điều kiện để Quản trị viên và Biên tập viên vẫn thấy danh sách phương tiện đầy đủ.

Có một hiệu ứng phụ nhỏ mà tôi không thể thấy bất kỳ móc nối nào, và đó là với số lượng tệp đính kèm được hiển thị phía trên danh sách phương tiện (sẽ vẫn hiển thị tổng số mục phương tiện, không phải của người dùng cụ thể - tôi sẽ coi đây là một vấn đề nhỏ).

Nghĩ rằng tôi sẽ đăng nó lên như vậy, có thể hữu ích ..;)

37
t31os

Kể từ WP 3.7, có một cách tốt hơn nhiều thông qua bộ lọc ajax_query_attachments_args, như được cung cấp trong tài liệu :

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

Đây là một giải pháp hoàn chỉnh cho cả bài đăng và phương tiện (mã này dành riêng cho tác giả, nhưng bạn có thể thay đổi nó cho bất kỳ vai trò người dùng nào). Điều này cũng sửa lỗi số lượng bài đăng/phương tiện mà không hack các tập tin cốt lõi.

// 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

Đây là phiên bản sửa đổi của câu trả lời được chấp nhận . Vì câu trả lời được chấp nhận chỉ nhắm mục tiêu mục menu Media ở bên trái, người dùng vẫn có thể thấy toàn bộ thư viện phương tiện trong hộp phương thức khi tải ảnh lên bài đăng. Mã sửa đổi một chút này khắc phục tình trạng đó. Người dùng được nhắm mục tiêu sẽ chỉ nhìn thấy các mục phương tiện của riêng họ từ tab Thư viện phương tiện của hộp phương thức bật lên trong một bài đăng.

Đây là mã từ câu trả lời được chấp nhận với một bình luận đánh dấu dòng để chỉnh sửa ...

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;
}

Đối với người dùng chỉ xem phương tiện của riêng họ từ menu Media VÀ tab Thư viện phương tiện của phương thức tải lên, thay thế dòng được chỉ định bằng ...

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

(ngắt dòng & khoảng cách chỉ được chèn để dễ đọc tại đây)

Dưới đây là giống như trên nhưng cũng hạn chế họ nhìn thấy bài viết của riêng họ từ mục menu Bài viết.

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

(ngắt dòng & khoảng cách chỉ được chèn để dễ đọc tại đây)

Ghi chú: như trong câu trả lời được chấp nhận, các bài đăng và bộ đếm phương tiện sẽ sai. Tuy nhiên, có một số giải pháp cho điều này trong một số câu trả lời khác trên trang này. Tôi không kết hợp những thứ đó đơn giản chỉ vì tôi chưa thử nghiệm chúng.

5
Sparky

t31os có một giải pháp tuyệt vời trên đó. Điều duy nhất là số lượng của tất cả các bài viết vẫn hiển thị.

Tôi đã tìm ra một cách để giữ cho số đếm không hiển thị bằng jQuery.

Chỉ cần thêm nó vào tập tin chức năng của bạn.

    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');

Nó làm việc cho tôi!

2
user15182

Hoàn thành mã làm việc .. Chỉ có vấn đề là, nhận sai số lượng hình ảnh trong thư viện phương tiện trên trang Thêm bài.

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

Một cách để làm điều này là sử dụng plugin Role Scoper , nó cũng rất tuyệt để quản lý các vai trò và khả năng rất cụ thể. Bạn thực sự có thể khóa quyền truy cập vào hình ảnh trong Thư viện phương tiện để chỉ những người được tải lên bởi mỗi người dùng. Tôi đã sử dụng nó cho một dự án mà tôi đang làm việc tại thời điểm này và nó hoạt động tốt.

1
Rick Curran

Tôi đã giải quyết vấn đề của mình bằng một giải pháp khá thô, nhưng hoàn toàn khả thi.

1) Tôi đã cài đặt plugin WP Ẩn Bảng điều khiển, vì vậy Người dùng sẽ chỉ thấy một liên kết đến biểu mẫu chỉnh sửa hồ sơ của họ.

2) Trong tệp mẫu Author.php, tôi đã chèn mã tôi đã sử dụng ở trên.

3) Sau đó, đối với người dùng đã đăng nhập, tôi đã hiển thị một liên kết trực tiếp đến trang Tải lên "wp-admin/media-new.php"

4) Vấn đề tiếp theo tôi nhận thấy, là sau khi họ tải ảnh lên, nó sẽ chuyển hướng họ đến upload.php ... và họ có thể thấy tất cả các hình ảnh khác. Tôi đã không tìm thấy một cái móc vào trang media-new.php, vì vậy cuối cùng tôi đã hack vào "media-upload.php" cốt lõi và chuyển hướng chúng đến trang hồ sơ của họ:

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

Sau đó, thay thế wp_redirect( admin_url($location) ); bằng wp_redirect($userredirect);

Một vài vấn đề, mặc dù. Đầu tiên, người dùng đã đăng nhập vẫn có thể truy cập "upload.php", nếu họ biết nó tồn tại. Họ không thể làm bất cứ điều gì ngoại trừ NHÌN các tệp và 99% mọi người thậm chí sẽ không biết về nó, nhưng nó vẫn không tối ưu. Thứ hai, nó cũng chuyển hướng Quản trị viên đến trang hồ sơ sau khi tải lên. Đây có thể có một sửa chữa khá đơn giản bằng cách kiểm tra vai trò của người dùng và chỉ chuyển hướng Người đăng ký.

Nếu bất cứ ai có ý tưởng về việc nối vào trang Media mà không đi vào các tệp cốt lõi, tôi sẽ đánh giá cao nó. Cảm ơn!

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' );
?>

Lưu mã ở trên dưới dạng Manage_your_media_only.php, Zip nó, tải lên dưới dạng plugin vào WP và kích hoạt nó, đó là tất cả.

1
Philip Borisov