उपयोगकर्ताओं को केवल उनके द्वारा अपलोड की गई मीडिया लाइब्रेरी आइटम देखने के लिए प्रतिबंधित करना?


46

मैं चाहता हूं कि उपयोगकर्ता फ़ोटो का उपयोग करने में सक्षम हों, 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);

1
यदि आपको अपनी समस्या का उत्तर मिल गया है, तो आप बेहतर तरीके से नीचे दिए गए उत्तर के रूप में जोड़ सकते हैं, प्रश्न में ही नहीं। यह सिस्टम के अनुरूप बेहतर है, और हम आपके उत्तर को वोट कर सकते हैं, जिससे इस साइट पर आपकी प्रतिष्ठा में सुधार होगा।
Jan Fabry


मुझे वास्तव में Own व्यू ओन पोस्ट्स मीडिया ओनली ’प्लगइन को दूसरा स्थान देना है, यह मेरे लिए पूरी तरह से एक jquery या php / html / css समाधान के लिए हर जगह देखने के बाद काम करता है।
13

जवाबों:


37

आप हमेशा एक 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;
}

मैंने डिलीट पेज कैप का उपयोग एक शर्त के रूप में किया था ताकि एडमीन और संपादक अभी भी पूर्ण मीडिया लिस्टिंग देखें।

एक छोटा सा साइड इफ़ेक्ट है, जिसके लिए मैं कोई हुक नहीं देख सकता, और वह है अटैचमेंट काउंट्स मीडिया लिस्ट के ऊपर दिखाया गया है (जो अभी भी मीडिया आइटम्स की कुल गिनती दिखाएगा, दिए गए यूजर की नहीं - i'd हालांकि इसे एक मामूली मुद्दा मानते हैं)।

सोचा था कि मैं इसे एक ही पोस्ट करूँगा, उपयोगी हो सकता है ..;)


मैंने सब्सक्राइबर स्तर के उपयोगकर्ताओं को फ़ाइल अपलोड की अनुमति दी है। अपने कोड का उपयोग करने की कोशिश की लेकिन काम नहीं कर रहा है।
सिसिर

1
"काम नहीं कर रहा है" बहुत ज्यादा नहीं है।
t31os

मैं उसी अवलोकन की पुष्टि कर सकता हूं। मेरे लिए "काम नहीं करना" का अर्थ है कि "योगदानकर्ता" भूमिका तब भी सभी मीडिया आइटम देख सकती है जब वह एक jpg अपलोड करने के लिए जाता है। हालाँकि, जब वह मेनू से मीडिया लाइब्रेरी में जाता है, तो वह खाली होता है। ( मेरी "योगदानकर्ता" भूमिका में पहले से ही फाइलें अपलोड करने की अतिरिक्त क्षमता है और वह काम कर रही है। )
स्पार्की

इसलिए आपके कोड को अपलोड विंडो के "मीडिया लाइब्रेरी" टैब को भरने वाले किसी भी पृष्ठ के लिए बस ट्विक करने की आवश्यकता है। मैं अब इस पर शोध कर रहा हूं।
स्पार्की

यदि मैं सही ढंग से याद करता हूं (और गलतियां होती हैं), तो इस उत्तर को लिखने के समय कोई उपयुक्त हुक नहीं था, इसी तरह मीडिया की गिनती को ठीक करने के लिए कोई हुक नहीं था। हालांकि, लेखन के समय से वर्डप्रेस के अच्छे 3 नए संस्करण आए हैं, इसलिए अब समाधान संभव हो सकता है।
t31os

32

WP 3.7 के रूप में 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;
}

19

यहां पोस्ट और मीडिया दोनों के लिए एक पूर्ण समाधान है (यह कोड विशेष रूप से लेखकों के लिए है, लेकिन आप इसे किसी भी उपयोगकर्ता की भूमिका के लिए बदल सकते हैं)। यह कोर फ़ाइलों को हैक किए बिना पोस्ट / मीडिया गणना को भी ठीक करता है।

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

महान स्निपेट, लेकिन अगर कोई आइटम मीडिया लाइब्रेरी में नहीं है, तो यह त्रुटियों को बाहर निकालता है, चेतावनी: array_sum () पैरामीटर 1 से सरणी, शून्य दिए जाने की उम्मीद करता है, और चेतावनी: array_keys () पैरामीटर 1 होने की उम्मीद करता है सरणी, शून्य दिया
chrismccoy

आपको बस fix_media_counts () फ़ंक्शन में एक सरणी के रूप में $ _num_posts को परिभाषित करना होगा। $_num_posts = array();
पॉल

4
इस उत्तर में कोड काम करता है लेकिन यह उन्नत कस्टम फ़ील्ड्स प्लगइन द्वारा बनाए गए किसी भी कस्टम फ़ील्ड को भी हटा देता है।
स्पार्की

1
बहुत से संबंधित: wordpress.stackexchange.com/questions/178236/…
cregox

5

यह स्वीकृत उत्तर का एक संशोधित संस्करण है । चूंकि स्वीकृत उत्तर केवल बाईं ओर मीडिया मेनू आइटम को लक्षित करता है, इसलिए उपयोगकर्ता किसी पोस्ट पर फोटो अपलोड करते समय मॉडल बॉक्स के भीतर पूरे मीडिया लाइब्रेरी को देख सकते हैं। यह थोड़ा संशोधित कोड उस स्थिति को ठीक करता है। लक्षित उपयोगकर्ता केवल पोस्ट के भीतर आने वाले मॉडल बॉक्स के मीडिया लाइब्रेरी टैब से अपने स्वयं के मीडिया आइटम देखेंगे।

यह एक टिप्पणी के साथ स्वीकृत उत्तर से कोड है जिसे संपादित करने के लिए लाइन को चिह्नित किया गया है ...

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

( लाइन-ब्रेक और रिस्पांस केवल पठनीयता के लिए डाला गया है )

नोट्स : जैसा कि स्वीकृत उत्तर में है, पोस्ट और मीडिया काउंटर गलत होंगे। हालांकि, इस पृष्ठ पर कुछ अन्य उत्तरों में इसके लिए समाधान हैं। मैंने उन्हें केवल इसलिए शामिल नहीं किया क्योंकि मैंने उनका परीक्षण नहीं किया था।


2

पूर्ण कार्य कोड .. केवल मुद्दा है, ऐड पोस्ट पेज पर मीडिया लाइब्रेरी में छवियों की गलत गणना।

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
आपको उपयोगकर्ता के स्तर का उपयोग नहीं करना चाहिए, वे वर्डप्रेस में अभी भी मुख्य रूप से बैकवर्ड संगतता (WP 2.0 से पहले) के लिए हैं, वे आधुनिक दिन वर्डप्रेस में उपयोगकर्ता क्षमताओं को निर्धारित करने के लिए विश्वसनीय नहीं हैं (क्योंकि वे संभवतः कोर से गायब हो जाएंगे जब उस संगतता की अब आवश्यकता नहीं है )। उपयोगकर्ता अधिकारों को निर्धारित करने के लिए वास्तविक क्षमता का उपयोग करें ।
t31os

युक्त होने के बावजूद media-upload.php, आपका कोड पोस्ट एडिट पेज द्वारा अपलोड किए गए अपलोड मोडल से काम नहीं कर रहा है। अभी भी सभी लाइब्रेरी आइटम देख सकते हैं।
स्पार्की

2

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

यह मेरे लिए काम कर रहा है!


1

मैंने अपनी समस्या को बहुत कठिन, लेकिन काम करने योग्य समाधान के साथ हल किया।

1) मैंने WP Hide Dashboard प्लगइन स्थापित किया है, इसलिए उपयोगकर्ता केवल अपने प्रोफ़ाइल संपादित फ़ॉर्म का लिंक देखेंगे।

2) Author.php टेम्पलेट फ़ाइल में, मैंने ऊपर इस्तेमाल किया कोड डाला।

3) फिर, लॉग इन उपयोगकर्ताओं के लिए, मैंने अपलोड पृष्ठ "wp-admin / media-new.p" पर एक सीधा लिंक प्रदर्शित किया

4) अगला मुद्दा जो मैंने देखा, वह फोटो अपलोड करने के बाद था, यह उन्हें अपलोड करने के लिए रीडायरेक्ट करेगा। पीपीपी ... और वे अन्य सभी तस्वीरें देख सकते थे। मुझे मीडिया-new.php पृष्ठ में कोई हुक नहीं मिला, इसलिए मैंने कोर "मीडिया-अपलोड.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% लोगों को इसके बारे में पता भी नहीं होगा, लेकिन यह अभी भी इष्टतम नहीं है। दूसरा, यह अपलोड करने के बाद प्रोफाइल पेज पर एडमिन को रीडायरेक्ट भी करता है। उपयोगकर्ता भूमिकाओं की जाँच करके, और केवल सब्सक्राइबर्स को पुनर्निर्देशित करके ये काफी सरल फिक्स हो सकते हैं।

अगर किसी के पास कोर फ़ाइलों में जाने के बिना मीडिया पेज पर हुक करने के बारे में विचार हैं, तो मैं इसकी सराहना करूंगा। धन्यवाद!


2
एक admin_initहुक है जो प्रत्येक व्यवस्थापक अनुरोध पर चलता है। यदि कोई उपयोगकर्ता upload.php का अनुरोध करता है और आप उसे रोकना चाहते हैं, तो आप उस अनुरोध को रोक सकते हैं (उदाहरण के लिए wp_die('Access Denied')) या प्रति हुक के लिए कुछ मान्य स्थान पर पुनर्निर्देशित कर सकते हैं।
हकर्रे

1
<?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

ऐसा करने का एक तरीका यह है कि रोल स्कोपर प्लगइन का उपयोग करें , यह बहुत विशिष्ट भूमिकाओं और क्षमताओं के प्रबंधन के लिए भी बहुत अच्छा है। आप वास्तव में केवल प्रत्येक उपयोगकर्ता द्वारा अपलोड की गई मीडिया लाइब्रेरी में छवियों तक पहुंच को लॉक कर सकते हैं। मैं इसे एक परियोजना के लिए उपयोग कर रहा हूं जो मैं इस समय काम कर रहा हूं और यह अच्छी तरह से काम करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.