我意识到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);
}
最合适的回答,由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;
}