ব্যবহারকারীরা কেবলমাত্র মিডিয়া লাইব্রেরি আইটেমগুলিই আপলোড করেছেন সেগুলি দেখতে সীমাবদ্ধ করছেন?


46

আমি চাই ব্যবহারকারীরা ব্যবহার করে ফটো আপলোড করতে সক্ষম হন add_cap('upload_files')তবে তাদের প্রোফাইল পৃষ্ঠায়, মিডিয়া লাইব্রেরি আপলোড করা প্রতিটি চিত্র দেখায়। আমি কীভাবে ফিল্টার করব যাতে তারা কেবল তাদের আপলোড করা চিত্রগুলি দেখতে পারে ?

এই মুহুর্তের জন্য আমার সমাধান এখানে… আমি একটি সাধারণ ডাব্লুপি কোয়েরি করছি, তারপরে ব্যবহারকারীর "প্রোফাইল" পৃষ্ঠায় লুপ করছি

$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
যদি আপনি নিজের সমস্যার কোনও উত্তর খুঁজে পেয়েছেন তবে আপনি নীচে উত্তর হিসাবে এটি আরও ভালভাবে যুক্ত করুন, নিজেই প্রশ্নটিতে নয়। এটি সিস্টেমের সাথে সামঞ্জস্য রেখেই আরও ভাল এবং আমরা আপনার উত্তরটি ভোট দিতে পারি, যা এই সাইটে আপনার খ্যাতি বাড়িয়ে তুলবে।
জান ফ্যাব্রি


আমাকে সত্যিই 'নিজের পোস্ট মিডিয়া দেখুন' প্লাগইনকে দ্বিতীয় করতে হবে, এটি jquery বা পিএইচপি / এইচটিএমএল / সিএসএস সমাধানের জন্য সর্বত্র দেখার পরে আমার পক্ষে পুরোপুরি কাজ করেছিল worked
ওয়াফল

উত্তর:


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

আমি মুছে ফেলা পৃষ্ঠাগুলি ক্যাপটিকে শর্ত হিসাবে ব্যবহার করেছি যাতে প্রশাসক এবং সম্পাদকরা এখনও পুরো মিডিয়া তালিকা দেখতে পান।

একটি ছোট পার্শ্ব প্রতিক্রিয়া রয়েছে, যার জন্য আমি কোনও হুক দেখতে পাচ্ছি না, এবং এটি মিডিয়া তালিকার উপরে প্রদর্শিত সংযুক্তি গণনাগুলির সাথে রয়েছে (যা এখনও প্রদত্ত ব্যবহারকারীর মতো নয়, মিডিয়া আইটেমগুলির মোট গণনা প্রদর্শন করবে - আমি চাই যদিও এটি একটি গৌণ বিষয় বিবেচনা করুন)।

ভেবেছিলাম আমি এগুলি সব পোস্ট করে দিচ্ছি, দরকারী হতে পারে ..;)


আমি গ্রাহক স্তরের ব্যবহারকারীদের কাছে ফাইল আপলোডের অনুমতি দিয়েছি। আপনার কোড ব্যবহার করার চেষ্টা করেছে কিন্তু কাজ করছে না।
সিসির

1
"কাজ করছে না" চালানোর মতো বেশি কিছু নয়।
t31os

আমি একই পর্যবেক্ষণ নিশ্চিত করতে পারি। আমার জন্য "কাজ না করা" এর অর্থ হ'ল তিনি যখন কোনও জেপিজি আপলোড করতে যান তখন "অবদানকারী" ভূমিকাটি সমস্ত মিডিয়া আইটেম দেখতে পাবে। যাইহোক, তিনি মেনু থেকে মিডিয়া লাইব্রেরিতে যান, এটি খালি। ( আমার "অবদানকারী" ভূমিকায় ইতিমধ্যে ফাইলগুলি আপলোড করার অতিরিক্ত ক্ষমতা রয়েছে এবং এটি কাজ করছে ))
স্পার্কি

সুতরাং আপলোড উইন্ডোর "মিডিয়া লাইব্রেরি" ট্যাব যে কোনও পৃষ্ঠা পূরণ করে তার জন্য আপনার কোডটি কেবল টুইট করা দরকার। আমি এখন এটি গবেষণা করছি।
স্পার্কি

যদি আমি সঠিকভাবে স্মরণ করি (এবং ভুলগুলি ঘটে) তবে এই উত্তরটি লেখার সময় কোনও উপযুক্ত হুক ছিল না, একইভাবে মিডিয়া গণনা ঠিক করার জন্য কোনও হুক কীভাবে ছিল না তার সমান। যদিও লেখার সময় থেকেই ওয়ার্ডপ্রেসের একটি ভাল 3 টি নতুন সংস্করণ রয়েছে, সুতরাং সমাধানগুলি এখনই সম্ভব হতে পারে।
t31os

32

ডাব্লুপি ৩.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;
}

দুর্দান্ত স্নিপেট তবে যদি কোনও আইটেম মিডিয়া লাইব্রেরিতে না থাকে তবে এটি ত্রুটিগুলি ছড়িয়ে দেয়, সতর্কতা: অ্যারে_সুম () প্যারামিটার 1 টি অ্যারে, নাল দেওয়া এবং সতর্কতা: অ্যারে_কিজ () প্যারামিটার 1 অ্যারে হিসাবে প্রত্যাশা করবে, নাল দেওয়া হবে
ক্রিসম্যাকয়

আপনাকে ঠিক _ _num_posts সংজ্ঞা হিসাবে ফিক্স_মিডিয়া_কাউন্টস () ফাংশনে দিতে হবে। $_num_posts = array();
পল

4
এই উত্তরের কোডটি কাজ করে তবে এটি অ্যাডভান্সড কাস্টম ফিল্ডস প্লাগইন দ্বারা তৈরি যে কোনও কাস্টম ক্ষেত্রকে সরিয়ে দেয়।
স্পার্কি


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
আপনার ব্যবহারকারীর স্তরগুলি ব্যবহার করা উচিত নয়, এগুলি ওয়ার্ডপ্রেসে এখনও মূলত পিছনের সামঞ্জস্যের জন্য রয়েছে (ডাব্লুপিপি 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) আমি ডাব্লুপি হাইড ড্যাশবোর্ড প্লাগইন ইনস্টল করেছি, সুতরাং ব্যবহারকারী কেবল তাদের প্রোফাইল সম্পাদনা ফর্মের একটি লিঙ্ক দেখতে পাবে।

2) Author.php টেমপ্লেট ফাইলে, আমি উপরে ব্যবহার করা কোডটি sertedোকালাম।

3) তারপরে, লগ ইন করা ব্যবহারকারীদের জন্য, আমি "ডাব্লুপি-অ্যাডমিন / মিডিয়া-নিউ.পিপি" আপলোড পৃষ্ঠাতে একটি সরাসরি লিঙ্ক প্রদর্শন করেছি

৪) পরের সমস্যাটি আমি লক্ষ্য করেছি, তারা ফটো আপলোড করার পরে, এটি তাদের আপলোড.এফপি পুনর্নির্দেশ করবে ... এবং তারা অন্য সমস্ত ছবি দেখতে পাবে। আমি মিডিয়া-নতুন.এফপি পৃষ্ঠায় একটি হুক পাইনি, তাই আমি মূল "মিডিয়া-আপলোড.পিএফপি" এ হ্যাকিং শেষ করে তাদের প্রোফাইল পৃষ্ঠায় পুনঃনির্দেশিত করেছি:

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

তারপর wp_redirect( admin_url($location) );সঙ্গে প্রতিস্থাপনwp_redirect($userredirect);

যদিও কয়েকটি বিষয়। প্রথমত, লগ ইন করা ব্যবহারকারী এখনও "আপলোড.এফপি" এ যেতে পারেন, যদি তারা জানেন যে এটি বিদ্যমান রয়েছে। ফাইলগুলিতে তারা লুক ছাড়া কিছুই করতে পারে না এবং 99% লোক এমনকি এ সম্পর্কে জানতে পারে না, তবে এটি এখনও অনুকূল নয়। দ্বিতীয়ত, এটি আপলোড করার পরে অ্যাডমিনকে প্রোফাইল পৃষ্ঠায় পুনর্নির্দেশ করে। এগুলি ব্যবহারকারীর ভূমিকাগুলি পরীক্ষা করে এবং কেবল সাবস্ক্রাইবারদের পুনর্নির্দেশ করে মোটামুটি সহজ সমাধান করতে পারে।

কারও কাছে যদি মূল ফাইলগুলিতে না গিয়ে মিডিয়া পৃষ্ঠায় প্রবেশ সম্পর্কে ধারণা থাকে তবে আমি এটির প্রশংসা করব। ধন্যবাদ!


2
admin_initপ্রতিটি প্রশাসকের অনুরোধ অনুসারে একটি হুক রয়েছে runs যদি কোনও ব্যবহারকারী আপলোড.এফপি অনুরোধ করে এবং আপনি তা রোধ করতে চান তবে আপনি সেই অনুরোধটিকে (যেমন wp_die('Access Denied')) ব্লক করতে পারেন বা প্রতি হুকের জন্য কোনও বৈধ জায়গায় পুনর্নির্দেশ করতে পারেন।
hakre

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

উপরের কোডটি ম্যানেজ_ইউর_মিডিয়া_অনলি.এফপি হিসাবে সংরক্ষণ করুন, এটিকে জিপ করুন, আপনার ডব্লিউপি-তে প্লাগইন হিসাবে আপলোড করুন এবং এটিকে সক্রিয় করুন, এটাই।


1

এটি করার একটি উপায় হ'ল রোল স্কোপার প্লাগইনটি ব্যবহার করা , এটি খুব নির্দিষ্ট ভূমিকা ও ক্ষমতা পরিচালনা করার জন্য দুর্দান্ত। আপনি মিডিয়া লাইব্রেরিতে চিত্রগুলির অ্যাক্সেসটি কেবলমাত্র প্রতিটি ব্যবহারকারীর দ্বারা আপলোড করা তালিকায় লক করতে পারেন। আমি এটিকে এমন একটি প্রকল্পের জন্য ব্যবহার করছি যা আমি এই মুহুর্তে কাজ করছি এবং এটি ভালভাবে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.