it-swarm.asia

هل تقصر المستخدمين على عرض عناصر مكتبة الوسائط التي حمّلوها فقط؟

أريد أن يتمكن المستخدمون من تحميل الصور باستخدام add_cap('upload_files') ولكن في صفحة ملفهم الشخصي ، تعرض مكتبة الوسائط كل صورة تم تحميلها. كيف يمكنني تصفية ذلك حتى يتمكنوا فقط من عرض الصور هم تم الرفع؟

إليك الحل الخاص بي في الوقت الحالي ... أقوم بإجراء استعلام بسيط 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 ، هناك طريقة أفضل بكثير من خلال مرشح ajax_query_attachments_args ، كما هو منصوص عليه في documentation :

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

هذه نسخة معدلة من الإجابة المقبولة . نظرًا لأن الإجابة المقبولة تستهدف فقط عنصر قائمة الوسائط على اليسار ، فلا يزال بإمكان المستخدمين رؤية مكتبة الوسائط بأكملها داخل مربع الوسائط عند تحميل صورة إلى منشور. هذا القانون المعدل قليلا إصلاح هذا الموقف. سيرى المستخدمون المستهدفون عناصر الوسائط الخاصة بهم فقط من علامة تبويب Media Library في مربع الوسائط المنبثق داخل منشور.

هذا هو الرمز من الإجابة المقبولة مع تعليق بمناسبة السطر للتحرير ...

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

(فواصل الأسطر والتباعد يتم إدراجها فقط لسهولة القراءة هنا)

Notes: كما هو الحال في الإجابة المقبولة ، ستكون النشرات وعدادات الوسائط خاطئة. ومع ذلك ، هناك حلول لهذا في بعض الإجابات الأخرى على هذه الصفحة. لم أدمجها ببساطة لأنني لم أختبرها.

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

إحدى طرق القيام بذلك هي استخدام المكون الإضافي الدور الإضافي لـ Scoper ، وهو أمر رائع لإدارة الأدوار والقدرات المحددة للغاية أيضًا. يمكنك في الواقع قفل الوصول إلى الصور في مكتبة الوسائط فقط لتلك التي تم تحميلها من قبل كل مستخدم. لقد تم استخدامه لمشروع أعمل عليه في الوقت الحالي ويعمل بشكل جيد.

1
Rick Curran

لقد حلت مشكلتي مع حل تقريبي ولكن عملي.

1) قمت بتثبيت WP Hide Dashboard plugin ، بحيث يرى المستخدم رابطًا إلى نموذج تعديل ملف التعريف الخاص به فقط.

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" ، إذا علم أنه موجود. لا يمكنهم القيام بأي شيء باستثناء LOOK في الملفات ، ولن يعرف 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' );
?>

احفظ الكود أعلاه بإدارة_Your_media_only.php ، ثم اربطه ، ثم قم بتحميله كمكون إضافي إلى WP ، وقم بتنشيطه ، هذا كل شيء.

1
Philip Borisov