it-swarm.asia

Kullanıcıların yalnızca yükledikleri medya kitaplığı öğelerini görüntülemesini kısıtlama

Kullanıcıların add_cap('upload_files') işlevini kullanarak fotoğraf yükleyebilmelerini istiyorum, ancak profil sayfasında Medya Kütüphanesi yüklenen her resmi gösterir. Bunu, yalnızca they yüklenen resimleri görebilecekleri şekilde nasıl filtreleyebilirim?

İşte şu an için çözümüm… Basit bir WP sorgusu yapıyorum, sonra kullanıcının "Profil" sayfasında bir döngü yapıyorum

$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

Medya listesini her zaman önce sayfayı ve kullanıcının yeteneklerini belirleyen ve belirli koşullar sağlandığında yazar parametresini ayarlayan bir pre_get_posts filtresi kullanarak filtreleyebilirsiniz.

Örnek

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

Silme sayfalarını bir koşul olarak kullandım, böylece Yöneticiler ve Editörler medya listesinin tamamını görmeye devam ediyorlar.

Hiç kanca göremediğim küçük bir yan etkisi var ve bu, medya listesinin üzerinde gösterilen ek sayılarıyla (belirli bir kullanıcınınkinden değil, medya öğelerinin toplam sayısını göstermeye devam edecek. Bu küçük bir sorun olsa da).

Hepsini aynı şekilde gönderirim diye düşündüm, faydalı olabilir ..;)

37
t31os

WP 3.7'den itibaren belgeleme 'de sağlandığı gibi, ajax_query_attachments_args filtresi üzerinden çok daha iyi bir yol var:

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

Hem yayınlar hem de medya için tam bir çözüm: (bu kod özellikle yazarlar içindir, ancak herhangi bir kullanıcı rolü için değiştirebilirsiniz). Bu aynı zamanda çekirdek dosyalara zarar vermeden posta/medya sayısını da düzeltir.

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

Bu/ kabul edilen cevabın değiştirilmiş bir versiyonudur. Kabul edilen cevap yalnızca soldaki Medya menü öğesini hedeflediğinden, kullanıcılar bir gönderiye fotoğraf yüklerken hala tüm modal kutunun içindeki medya kütüphanesini görebilir. Bu biraz değiştirilmiş kod bu durumu düzeltir. Hedeflenen kullanıcılar, kendi medya öğelerini yalnızca yayın içinde açılan kalıcı kutunun Medya Kitaplığı sekmesinden görür.

Bu, kabul edilen cevabın kodudur, yorum yapılacak satırı işaretler.

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

Kullanıcıların kendi medyalarını yalnızca yükleme modunun Medya menüsü VE Medya Kitaplığı sekmesinden görüntüleyebilmeleri için, belirtilen satırı bununla değiştirin ...

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

(satır sonları ve boşluklar, sadece burada okunabilirlik için eklenmiş)

Aşağıdakiler yukarıdaki ile aynıdır ancak aynı zamanda Mesajlar menü öğesinden kendi yazılarını görmelerini de kısıtlar.

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

(satır sonları ve boşluklar, sadece burada okunabilirlik için eklenmiş)

Notlar: kabul edilen cevapta olduğu gibi, yayınlar ve medya sayaçları yanlış olacaktır. Ancak, bu sayfadaki diğer bazı cevaplarda bunun için çözümler vardır. Bunları basitçe bunları test etmediğim için kullanın.

5
Sparky

t31os'un orada harika bir çözümü var. Tek şey, tüm mesajların sayısının hala ortaya çıkmasıdır.

Sayının jQuery kullanarak görünmesini engellemenin bir yolunu buldum.

Sadece bunu fonksiyon dosyasına ekleyin.

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

Benim için çalışıyor!

2
user15182

Çalışma kodunu tamamlayın .. Tek sorun, Yayın Ekle sayfasındaki medya kitaplığındaki görüntü sayısının yanlış olması.

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

Bunu yapmanın bir yolu da Role Scoper eklentisini kullanmak , çok özel roller ve yetenekleri yönetmek için de harika. Medya Kitaplığı'ndaki resimlere erişimi yalnızca her kullanıcı tarafından yüklenenler için kilitleyebilirsiniz. Şu an üzerinde çalıştığım bir proje için kullanıyorum ve iyi çalışıyor.

1
Rick Curran

Sorunumu oldukça kaba fakat uygulanabilir bir çözümle çözdüm.

1) WP Gösterge Tablosu eklentisini gizle 'yi kurdum, böylece Kullanıcı yalnızca profil düzenleme formuna bir bağlantı görecekti.

2) author.php şablon dosyasına, yukarıda kullandığım kodu girdim.

3) Daha sonra, giriş yapmış kullanıcılar için, "wp-admin/media-new.php" Yükleme sayfasına doğrudan bir bağlantı gösterdim.

4) Dikkatimi çeken bir sonraki konu, fotoğrafı yükledikten sonra, onları upload.php ... 'a yönlendirecek ... ve diğer tüm resimleri görebileceklerdi. Media-new.php sayfasına bir kanca bulamadım, bu yüzden çekirdek "media-upload.php" içine girip onları profil sayfalarına yönlendirdim:

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

Ardından wp_redirect( admin_url($location) );, wp_redirect($userredirect); ile değiştirildi.

Yine de birkaç mesele. Öncelikle, giriş yapmış olan kullanıcı var olduğunu bildiği halde hala "upload.php" adresine gidebilir. Dosyalara bakma dışında hiçbir şey yapamazlar ve insanların% 99'u bile bilmez, ama yine de en uygun değildir. İkincisi, ayrıca yüklendikten sonra Yönetici'yi profil sayfasına yönlendirir. Bunlar, kullanıcı rollerini kontrol ederek ve sadece Aboneleri yönlendirerek oldukça basit bir düzeltmeye sahip olabilir.

Herhangi biri, ana dosyaya girmeden Medya sayfasına takılma konusunda bir fikriniz varsa, çok memnun olurum. Teşekkürler!

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

Yukarıdaki kodu manage_your_media_only.php olarak kaydedin, sıkıştırın, sıkıştırın, WP cihazınıza yükleyin ve aktive edin, hepsi bu.

1
Philip Borisov