Вопрос или проблема
Я пытаюсь скрыть вложения с помощью таксономии. Я хочу скрыть их на странице поста в wp-admin. Я не могу понять, как определить, на какой странице я нахожусь из ajax_query_attachments_args. Я пытался использовать pre_get_posts, но, похоже, это не вызывает ajax_query_attachments_args.
add_filter('ajax_query_attachments_args', 'hide_attachment_with_taxonomy', 50, 1);
function hide_attachment_with_taxonomy( $query = array() ) {
global $current_screen;
if ( ! $current_screen ) {
return $query; // Он всегда возвращает это значение. $current_screen или get_current_screen() всегда неопределены
}
if($current_screen->post_type == 'post'){
$query['tax_query'] = array(
array(
'taxonomy' => 'category',
'operator' => 'NOT EXISTS'
),
);
return $query;
}
}
Ответ – wp_get_referer(). Эта функция работает внутри ajax_query_attachments_args. Я могу затем использовать get_post_type с ID поста из параметров URL
$referer = parse_url(wp_get_referer());
parse_str($referer['query'], $params);
if (isset($params['post'])){
$post_type = get_post_type($params['post']);
} else if (strpos($referer['path'], 'post-new.php') !== false && !isset($params['post_type'])){
$post_type="post";
} else {
$post_type="";
}
if ( $post_type == 'post' ) {
$query['tax_query'] = array(
array(
'taxonomy' => 'category',
'operator' => 'NOT EXISTS'
),
);
}
.
Ответ или решение
Как определить, на какой странице загружается ajax_query_attachments_args
Если вам необходимо скрыть вложения с использованием таксономии в административной панели WordPress и убедиться, что это работает именно на странице редактирования поста, вам потребуется корректно определить текущую страницу. Давайте подробно разберем, как это сделать.
Проблема
Вы пытаетесь использовать фильтр ajax_query_attachments_args
для изменения параметров запроса вложений в зависимости от страницы, на которой этот запрос выполняется. Однако стандартный способ, такой как pre_get_posts
, в данном контексте не срабатывает.
Решение
Ключевым моментом является использование функции wp_get_referer()
, которую можно использовать для получения URL-адреса предыдущей страницы. На основе этого URL можно извлечь ID поста и его тип, что позволит вам адаптировать спрос к нужным условиям.
Вот пример того, как это реализовать:
add_filter('ajax_query_attachments_args', 'hide_attachment_with_taxonomy', 50, 1);
function hide_attachment_with_taxonomy( $query = array() ) {
// Получаем реферер
$referer = parse_url(wp_get_referer());
parse_str($referer['query'], $params);
// Проверяем, установлен ли ID поста
if (isset($params['post'])) {
$post_type = get_post_type($params['post']);
} elseif (strpos($referer['path'], 'post-new.php') !== false && !isset($params['post_type'])) {
$post_type = "post";
} else {
$post_type = "";
}
// Применяем фильтр, если тип поста "post"
if ($post_type == 'post') {
$query['tax_query'] = array(
array(
'taxonomy' => 'category',
'operator' => 'NOT EXISTS'
),
);
}
return $query;
}
Объяснение кода
-
Получение реферера: Используя
wp_get_referer()
, мы получаем URL предыдущей страницы и разбираем его с помощьюparse_url()
, чтобы выделить параметры запроса. -
Проверка параметров: Мы проверяем, установлен ли ID поста в реферере. Если он есть, мы определяем тип поста с помощью функции
get_post_type()
. -
Условия для фильтрации: Если тип поста соответствует ‘post’ или если пользователь находится на странице создания нового поста (‘post-new.php’), мы добавляем условие в запрос, чтобы скрыть вложения на основе заданной таксономии (‘category’).
Заключение
Вышеописанный подход обеспечивает возможность звукового управления отображением вложений в административной части WordPress, основываясь на контексте текущей страницы. Такой подход не только эффективен, но и гибок, позволяя вам легко вносить изменения в зависимости от ваших требований.
Подобные решения подчеркивают важность правильного понимания работы с таксономиями и AJAX-запросами в WordPress, что в конечном счете улучшает пользовательский опыт администраторов с использованием вашей системы.