管理员上载Pre_Get_Posts未按预期工作

时间:2016-08-25 作者:ngearing

现在是下午4点,我的大脑一个小时前就停止了工作,就我的一生而言,我就是搞不明白为什么事情没有按预期进行。

我试图在媒体库中仅显示用户上载的媒体。我的过滤器工作并只返回用户上传的媒体,直到我添加if语句以确保它只影响媒体库。

/**
 * Hide others media from Contributors
 */
function ggstyle_hide_media_by_other($query)
{
    // When I add this if statement the filter no longer works.
    $screen = get_current_screen();
    if ($screen->id != \'upload\') {
        return $query;
    }

    if (current_user_can(\'contributor\')) {
        $query->set(\'author\', get_current_user_id());
    }
    return $query;
}
add_filter(\'pre_get_posts\', \'ggstyle_hide_media_by_other\');

// Debuggin function
function ggstyle_debug()
{
    // Debug shows that this screen IS \'upload\'....
    echo "<pre>".print_r(get_current_screen(), true)."</pre>";
}
add_filter(\'admin_head\', \'ggstyle_debug\');

1 个回复
最合适的回答,由SO网友:bynicolas 整理而成

好吧,首先get_current_screen 仅适用于管理区域,但即使在管理中也会在某些页面上造成问题。使用$pagenow 改为全局变量。

所以现在如果你想隐藏媒体not 上传的贡献者这是我会怎么做。

// Prevents user to see all uploads, only theirs
add_action(\'pre_get_posts\',\'wpse_users_own_attachments\');
function wpse_users_own_attachments( $wp_query_obj ) {

  global $current_user, $pagenow;

  if( !is_a( $current_user, \'WP_User\') )
    return;

  if( !in_array( $pagenow, array( \'upload.php\', \'admin-ajax.php\' ) ) )
    return;

  if( current_user_can(\'contributor\') )
    $wp_query_obj->set(\'author\', $current_user->ID );

  return;
}