代码限制在仪表板上,在前端意外运行(pre_get_post和admin-ajax.php)

时间:2016-08-07 作者:Riccardo

我意识到pre_get_post my中的筛选器functions.php 正在破坏前端中运行的其他模块(ajax)的默认行为while user is logged in.

我想要实现的是过滤仪表板中的媒体库内容,以防止非管理内容出现在媒体库中。所以我设置了一个过滤器pre_get_post 当非管理员用户访问媒体库时,内容将被过滤。这运行得很好。

出现此问题的原因是此筛选器应用于仪表板媒体库加载模块(即admin-ajax.php) 由于未知原因,当用户在前端导航时,似乎也在应用过滤器(while logged in), 而前端的Ajax导航也会受到这种影响。

我想知道是否有解决方案来阻止这种情况,确保只有当用户在仪表板中时才真正应用过滤器。当用户不在仪表板中时,我尝试填充尽可能多的条件以停止运行代码,但我无法使其工作。

下面是函数中有问题的代码。php:

    $url_split = explode("/",$_SERVER[\'REQUEST_URI\']); // get current URI to ensure the filter is only applied when navigating in the dashboard

    $user = wp_get_current_user();   
    if ( is_admin() && !in_array( \'administrator\', (array) $user->roles ) && strtolower($url_split[1]) == "wp-admin"){
        add_filter(\'pre_get_posts\', \'posts_for_current_role\');
    }

    // ********** post & media lists filtered by user role & category ****************
function posts_for_current_role($query) {
global $students_allowed_cat;
global $teachers_allowed_cat;
global $pagenow;


        $user = wp_get_current_user();

        if( \'edit.php\' == $pagenow   ){
            if ($query->get(\'cat\') == \'0\' || IsNullOrEmptyString($query->get(\'cat\')) || !count($_GET) ){
                if ( in_array( \'teacher\', (array) $user->roles ) ) {
                    //The user has the "teacher" role
                    $filtered_cat = $teachers_allowed_cat;
                }
                if ( in_array( \'student\', (array) $user->roles ) ) {
                    //The user has the "student" role
                    $filtered_cat = $students_allowed_cat;
                }
                $query->set(\'cat\',  $filtered_cat);
            }
        }
        if (in_array( $pagenow, array( \'upload.php\', \'admin-ajax.php\')  ) ){
                // hide admin media for non-admin users
                $query->set(\'author\',  \'-1\'); // **** OFFENDING!!!
                // log to a file what page is applying the filter
                $file = \'c:\\temp\\log.txt\';
                $runningpage = $pagenow."\\n";
                file_put_contents($file, $runningpage , FILE_APPEND | LOCK_EX);
                // unbelievable but the log file will show that the code is being run from admin-ajax.php   
            }
        return ($query);     

}

1 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

对WP的任何ajax调用都可能调用admin ajax。php,因为这就是在WP中进行ajax调用的方式。因此,对于许多前端ajax调用,您的最后一个条件将为true,然后为所有这些查询设置author-1,并排除用户#1(通常是默认的管理员用户)编写的所有内容。

最好使用wp\\u ajax\\u query\\u attachments钩子,它只在您想要的上下文中触发,因此为您的查询调整提供了更具体的目标:

if ( is_admin() && !in_array( \'administrator\', (array) $user->roles ) ) { 
    add_filter( \'ajax_query_attachments_args\', \'exclude_admin_media\', 1, 1 );
} 

function exclude_admin_media( $query ) { 

    $query[\'author\'] = \'-1\'; 
    // exclude admin media 

    return $query; 
}