it-swarm-eu.dev

Omezení uživatelů na zobrazení pouze položek knihovny médií, které nahráli?

Chci, aby uživatelé mohli nahrát fotografie pomocí add_cap('upload_files'), ale na stránce s profilem zobrazí knihovna médií všechny obrázky, které byly nahrány. Jak mohu filtrovat, aby mohli prohlížet pouze obrázky oni nahrané?

Zde je moje řešení pro tuto chvíli… dělám jednoduchý dotaz WP, poté smyčku na stránce uživatele Profil

$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

Seznam médií můžete vždy filtrovat pomocí filtru pre_get_posts, který nejprve určuje stránku a možnosti uživatele, a při splnění určitých podmínek nastaví parametr autora.

Příklad

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

Použil jsem odstranit stránku cap jako podmínku, takže Admins a Editors stále vidí úplný seznam médií.

Tam je jeden malý vedlejší efekt, který nevidím žádné háčky pro, a to je s počtem příloh zobrazeny nad seznamem médií (což bude stále zobrazovat celkový počet mediálních položek, ne toho daného uživatele - i'd považovat tuto záležitost za menší.

Myslela jsem, že to všechno pošlu, může být užitečné ..;)

37
t31os

Jako u WP 3.7 existuje mnohem lepší cesta přes filtr ajax_query_attachments_args, jak je uvedeno v dokumentaci :

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

Zde je kompletní řešení jak pro příspěvky, tak pro média (tento kód je specificky určen pro autory, ale můžete jej změnit pro jakoukoli roli uživatele). To také opravuje počet příspěvků/médií bez hackování základních souborů.

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

Jedná se o upravenou verzi přijaté odpovědi . Vzhledem k tomu, že přijatá odpověď cílí pouze na položku nabídky Média vlevo, uživatelé mohou při nahrávání fotografie do příspěvku stále vidět celou knihovnu médií v rámci modálního pole. Tento mírně upravený kód tuto situaci opravuje. Cíloví uživatelé uvidí pouze vlastní mediální položky z karty Knihovna médií modálního pole, které se objeví v rámci příspěvku.

Toto je kód z přijaté odpovědi s komentářem označujícím řádek, který chcete upravit ...

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

Pro uživatele, aby si prohlíželi pouze vlastní média z nabídky Média a Knihovna médií v modálním nahrávání, nahraďte tento řádek tímto ...

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

(řádky a mezery pouze pro čtení zde)

Následující je stejné jako výše, ale také omezuje jejich zobrazení vlastních příspěvků z položky nabídky Příspěvky.

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

(řádky a mezery pouze pro čtení zde)

Poznámky: stejně jako v přijaté odpovědi budou příspěvky a čítače médií chybné. V některých dalších odpovědích na této stránce však existují řešení tohoto problému. začlenit ty jednoduše proto, že jsem je netestoval.

5
Sparky

t31os má skvělé řešení. Jediná věc je, že počet všech příspěvků se stále zobrazuje.

Přišel jsem na způsob, jak udržet číslo počítat od zobrazení pomocí jQuery.

Stačí to přidat do souboru funkcí.

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

Pracuje pro mě!

2
user15182

Kompletní pracovní kód .. Pouze problém je, dostat špatný počet obrázků v knihovně médií na stránce Přidat příspěvek.

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

Jedním ze způsobů, jak toho dosáhnout, je použít zásuvný modul Role Scoper , což je skvělé i pro správu velmi specifických rolí a schopností. Můžete skutečně uzamknout přístup k obrázkům v knihovně médií pouze k těm, které nahráli všichni uživatelé. Používal jsem ho pro projekt, na kterém v tuto chvíli pracuji a funguje to dobře.

1
Rick Curran

Vyřešil jsem svůj problém s poměrně hrubým, ale funkčním řešením.

1) Nainstaloval jsem WP Skrýt Dashboard plugin, takže uživatel by viděl pouze odkaz na formulář pro úpravu profilu.

2) V souboru šablony author.php jsem vložil kód, který jsem použil výše.

3) Pak jsem pro přihlášené uživatele zobrazil přímý odkaz na stránku „wp-admin/media-new.php“.

4) Dalším problémem, který jsem si všiml, bylo, že po nahrání fotografie je přesměroval na upload.php ... a viděli všechny ostatní obrázky. Na stránce media-new.php jsem nenalezl háček, takže jsem skončil v hackování do jádra „media-upload.php“ a přesměrování na stránku profilu:

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

Pak wp_redirect( admin_url($location) ); nahradili wp_redirect($userredirect);

Několik otázek. Zaprvé, přihlášený uživatel může stále přejít na "upload.php", pokud vědí, že existuje. Nemohou dělat nic kromě LOOKu u souborů a 99% lidí o tom ani neví, ale stále to není optimální. Za druhé, po nahrání také přesměruje Admin na stránku profilu. Ty mohou mít poměrně jednoduchou opravu kontrolou uživatelských rolí a pouze přesměrováním předplatitelů.

Pokud má někdo nápady na zaháknutí na stránku Média, aniž by se dostal do základních souborů, ocenil bych to. Dík!

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

Uložte kód výše jako manage_your_media_only.php, Zip, nahrajte jako plugin do WP a aktivujte jej, to je vše.

1
Philip Borisov