Intereting Posts
Написание кода Mysql и Php в WordPress Сообщения Как добавить пользовательские таблицы / конечные точки в WP REST API? Перенаправление не www на www ТОЛЬКО для домена, субдомена без www WordPress post / page pagination (ссылки на страницы), чтобы вернуться к первому разделу Как мы можем использовать условные теги в плагинах? Использование короткого кода в коротком коде с динамической переменной комментарии приходят на неправильные должности Загрузка изображения "превышает максимальный размер загрузки для этого сайта", но php.ini верен Нужно ли ждать после нажатия «обновления» на странице редактирования после публикации? Вставка гиперссылки и не гиперссылки текста в одну строку, в центре, на .php Где пользователь WordPress хранит сообщения электронной почты при вводе комментариев? Детская тема с плоской тематикой Запрос по почте по категориям Как добавить косую черту в конец wordpress домой? Ошибка переадресации на целевой странице wordpress на localhost

Как сделать запрос только на определенной странице администратора?

Я создаю страницу для API настроек с использованием Codestar Framework, а загрузка полей с использованием их фильтруемых настроек – вопрос не связан с Codestar . В одном из таких полей выпадающего списка мне нужно загрузить все сообщения из настраиваемого типа сообщений, которые добавляются в течение 30 дней. Чтобы сделать вещи приятными и чистыми, я сделал пользовательскую функцию:

<?php /** * Get posts of last 30 days only. * * @return array Array of posts. * -------------------------------------------------------------------------- */ function pre_get_active_posts_of_30_days() { //admin-only function if( !is_admin() ) return; global $project_prefix; //set a project prefix (ie pre_) $latest_posts = new WP_Query( array( 'post_type' => 'cpt', 'post_status' => 'publish', 'posts_per_page' => -1, 'date_query' => array( array( 'after' => '30 days ago', 'inclusive' => true, ), ) ) ); $posts_this_month = array(); if( $latest_posts->have_posts() ) : while( $latest_posts->have_posts() ) : $latest_posts->the_post(); $validity_type = get_post_meta( get_the_ID(), "{$project_prefix}validity_type", true ); if( $validity_type && 'validity date' === $validity_type ) { $validity = get_post_meta( get_the_ID(), "{$project_prefix}validity", true ); $tag = days_until( $validity ) .' days left'; //custom function } else if( $validity_type && 'validity stock' === $validity_type ) { $tag = 'Stock'; } else { $tag = '...'; } $posts_this_month[get_the_ID()] = get_the_title() .' ['. $tag .']'; endwhile; endif; wp_reset_postdata(); return $posts_this_month; } 

Вопрос не связан даже с функцией.

Я хочу сделать запрос только на той странице top_level_custom-settings-api . Функция загружается при каждой загрузке страницы администратора. Я попытался использовать get_current_screen() но эта функция дала мне не найденную фатальную ошибку.

редактировать

Я не помнил этого @bonger. Я пробовал свой код таким образом:

 add_action('current_screen', 'current_screen_callback'); function current_screen_callback($screen) { if( is_object($screen) && $screen->id == 'top_level_custom-settings-api' ) { add_action( 'admin_init', 'pre_get_active_posts_of_30_days' ); } } 

Код работает хорошо, но он не контролирует загрузку моей функции только на этой конкретной странице. Я проверил запрос на других страницах, запрос тоже есть. И я попытался изменить условное на что-то неправильное, например $screen->id == 'top_level_-api' , он все еще работает именно так. 🙁

Боюсь, я знаю, что у меня есть серьезная нехватка действий за сценой и фильтрация вещей. Хотелось бы хорошо читать и об этом.

Solutions Collecting From Web of "Как сделать запрос только на определенной странице администратора?"

Стоит отметить, что использование admin_init в фильтре current_screen слишком поздно, потому что admin_init уже запущен.

Вместо этого выполните:

 add_action('current_screen', 'current_screen_callback'); function current_screen_callback($screen) { if( is_object($screen) && $screen->id === 'top_level_custom-settings-api' ) { add_filter('top_level_screen', '__return_true'); } } 

В другом месте в вашем top_level_page_callback ответственном за выполнение запроса:

 function top_level_page_callback() { $active_posts = null; if ( ($is_top_level = apply_filters('top_level_screen', false)) ) { $active_posts = pre_get_active_posts_of_30_days(); } //etc... } 

Это один из способов сделать это …

Или вы можете использовать add_action('load-top_level_custom-settings-api', 'callback');

Кроме current_screen hook, где еще вы пытались вызвать pre_get_active_posts_of_30_days() ? Потому что вы должны были назвать его в какой-то глобальной области, чтобы он работал на всех страницах, а не только на целевой странице.