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


46

Kullanıcıların fotoğrafları kullanarak yükleyebilmelerini istiyorum, add_cap('upload_files')ancak profil sayfalarında Medya Kitaplığı yüklenen her resmi gösterir. Nasıl onlar sadece görüntüleri görüntüleyebilmek için o filtre onlar yükledi?

İş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);

1
Kendi sorununuza bir cevap bulursanız, sorunun kendisinde değil, aşağıdan bir cevap olarak eklemeniz daha iyi olur. Bu, sisteme paralel olarak daha iyidir ve cevabınızı yukarı oylayabiliriz; bu, bu sitedeki itibarınızı artıracaktır.
Jan Fabry


'Kendi Mesajlarını Göster Yalnızca Medya' eklentisini gerçekten ikinci kez eklemeliyim, her yerde bir jquery veya php / html / css çözümü aradıktan sonra benim için mükemmel çalıştı.
waffl

Yanıtlar:


37

Medya listesini her zaman pre_get_postsönce sayfayı ve kullanıcının özelliklerini belirleyen bir filtre kullanarak filtreleyebilir ve belirli koşullar sağlandığında yazar parametresini ayarlayabilirsiniz.

Ö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 (yine de belirli bir kullanıcınınkinden değil, toplam medya öğelerinin toplamını gösterecek - Bu küçük bir sorun olsa da).

Hepsini aynı şekilde gönderirim dedim, faydalı olabilir ..;)


Abone düzeyinde kullanıcılara dosya yüklemeye izin verdim. kodunuzu kullanmaya çalıştı ancak çalışmıyor.
Sisir

1
"Çalışmamak" devam edecek bir şey değil.
t31,

Aynı gözlemi onaylayabilirim. Benim için "çalışmamak", "katkıda bulunanlar" rolünün, bir jpg yüklediğinde tüm medya öğelerini görebileceği anlamına geliyor. Ancak, menüden medya kütüphanesine gittiğinde, boş. ( "Katkıda" rolüm zaten zaten dosya yükleme yeteneğine sahip ve işe yarıyor. )
Sparky

Bu nedenle, kodunuzun sadece yükleme penceresinin "Medya Kitaplığı" sekmesini hangi sayfanın doldurduğuna göre ayarlanması gerekir. Bunu şimdi araştırıyorum.
Sparky

Doğru hatırlıyorsam (ve hatalar oluyorsa), bu cevabı yazarken uygun bir kanca yoktu, medya sayımını sabitlemek için hiçbir kancanın bulunmadığına benzer şekilde. Ancak, WordPress'in yazma zamanından bu yana 3 yeni yeni sürümü var, bu nedenle çözümler şimdi mümkün olabilir.
t31os 3'14

32

WP 3.7'den itibaren ajax_query_attachments_args, belgelerde belirtildiği gibi , filtre yoluyla ç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;
}

19

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 ayrıca, ç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;
}

büyük snippet ancak medya kitaplığında hiçbir öğe yoksa, hataları tükürür, Warning: array_sum (), parametre 1'in dizi olmasını, boş değer verilmesini ve Uyarı: array_keys (), parametre 1'in dizi olmasını, boş olarak verilmesi
beklenir

$_num_posts komutunu fix_media_counts () işlevinde bir dizi olarak tanımlamanız gerekir. $_num_posts = array();
Paul

4
Bu yanıttaki kod çalışıyor ancak Gelişmiş Özel Alanlar eklentisi tarafından oluşturulan tüm özel alanları da kaldırıyor.
Sparky


5

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 yayına fotoğraf yüklerken kullanıcılar tüm modal kutunun içindeki medya kütüphanesini görebilirler. 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 yerleştirilmiş )

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 yerleştirilmiş )

Notlar : Kabul edilen cevaplarda olduğu gibi, mesajlar ve medya sayaçları yanlış olacaktır. Ancak, bu sayfadaki diğer bazı cevaplarda bunun için çözümler var. Bunları dahil etmedim çünkü onları test etmedim.


2

Ç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
Kullanıcı seviyelerini kullanmamalısınız, WordPress'te hala temel olarak geriye dönük uyumluluk için (WP 2.0'dan önce), modern WordPress'teki kullanıcı yeteneklerini belirlemek için güvenilir değiller (çünkü bu uyumluluk artık gerekli olmadığında temelden kaybolacaklar) ). Kullanıcı haklarını belirlemek için gerçek bir yetenek kullanın .
t31os

İçeriğe rağmen media-upload.php, kodunuz Posta Düzenleme sayfası tarafından oluşturulan yükleme yönteminden çalışmıyor. Tüm kütüphane öğelerini hala görebilir.
Sparky

2

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!


1

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

1) WP Hide Dashboard eklentisini yükledim, 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) Bir sonraki sayı fark ettim, fotoğrafı yükledikten sonra, onları upload.php ... 'a yönlendirecekti ... ve diğer tüm resimleri görebildiler. 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;

Sonra yerini wp_redirect( admin_url($location) );ilewp_redirect($userredirect);

Yine de birkaç mesele. Birincisi, giriş yapmış olan kullanıcı varsa, 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 hakkında bir fikriniz varsa, çok memnun olurum. Teşekkürler!


2
admin_initHer yönetici isteğinde çalışan bir kanca var. Bir kullanıcının upload.php istemesi durumunda ve bu isteği engelleyebilmenizi (örn. wp_die('Access Denied')) Engellemek veya kanca başına geçerli bir yere yönlendirmek isteyebilirsiniz.
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' );
?>

Yukarıdaki kodu manage_your_media_only.php olarak kaydedin, sıkıştırın, WP'nize eklenti olarak yükleyin ve etkinleştirin, hepsi bu.


1

Bunu yapmanın bir yolu, Rol Scoper eklentisini kullanmaktır, çok özel rolleri ve yetenekleri yönetmek için de harikadır. 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.