Intereting Posts
WP_USE_EXT_MYSQL Производительность WordPress – общий кэш W3 и memcached / APCu Woocommerce – Показать текст на странице продукта на основе класса доставки Как проверить фильтр Измените текст «Разрешить комментарии» для экрана редактирования admin для пользовательского типа сообщений? Страница блога не будет использовать blog-template.php Добавить сообщение meta на основе другого значения meta сообщения перед публикацией публикации увеличить per_page limit в rest api Исключение страницы с определенным именем из wp_page_menu Как оставить строку между абзацами при написании текста в визуальном или текстовом редакторе tax_query не работает с разбиением на страницы с пользовательским запросом (как wp_query, так и query_posts ()) Надежный плагин AdSense. Он существует? HowTo: разработка шаблона WP с динамическим фоновым изображением создать пост acf frontend, не опубликованный, а не обработанный Как удалить все существующие трекбэки?

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

Я создаю страницу для 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() ? Потому что вы должны были назвать его в какой-то глобальной области, чтобы он работал на всех страницах, а не только на целевой странице.