Intereting Posts
Использование расширенного настраиваемого поля для загрузки файлов, как загрузить файл url Как получить текущий идентификатор сообщения в functions.php Пустой / Белый экран на Frontend, но доступный бэкэнд? Добавить теги для ранее созданных пользовательских типов сообщений Linefeed добавлен после include / require в PHP Реализация кнопки «Отправить по электронной почте»? Функция wpdb-> prepare удаляет одинарную кавычку для% s в статусе SQL Как отменить отмену эскизов Боковая панель случайного автора Подготовить meta_value к постоянной ссылке Кнопка «Пред. / След.» С эскизом и текстом субтитров между страницами в однострочном столбце Повторная перемотка таксономии Могу ли я интегрировать Google Analytics с моим блогом, размещенным на wordpress.com? Экспортировать локальную WP-установку, чтобы жить – нужна помощь Могу ли я использовать настраиваемый тип сообщений в качестве пользовательской таксономии для другого настраиваемого типа сообщений?

Переопределение глобальных результатов запроса без перехвата

У меня есть специальная PHP-страница, и мне нужно переопределить глобальные переменные сообщений, но я не могу заставить ее работать. При переходе через основной цикл im можно переопределить глобальные сообщения, но я не могу переопределить все, что has_posts () использует для получения счета. Я получаю данные от стороннего API, поэтому мне нужно построить объект WP «на лету», а затем переопределить объекты по умолчанию, возвращенные из запроса по умолчанию. У меня есть следующий код и его работа, но проблема в том, что я получаю результат, который содержит сообщение, а затем несколько нулевых объектов.

require_once('../../../wp-blog-header.php'); global $post, $posts, $found_posts, $post_count; $post->ID = 99999999999; $post->post_content = "TEST PAGE content"; $post->post_title = "Page Title"; $post->post_name = "test"; $posts = array($post); $post_count = 1; $found_posts = 1; if ( have_posts() ) { while ( have_posts() ) { the_post(); var_dump($post); } } 

Вышеприведенный код генерирует следующий вывод. Мне нужно избавиться от NULL. Для этого мне нужно сделать так, чтобы has_posts () возвращал true только один раз.

объект (WP_Post) # 2975 (24) {["ID"] => int (99999999999) ["post_author"] => строка (1) "1" ["post_date"] => строка (19) "2016-01 -21 19:50:24 "[" post_date_gmt "] => string (19)" 2016-01-21 19:50:24 "[" post_content "] => string (17)" TEST PAGE content "[" post_title "] => string (10)" Название страницы "[" post_excerpt "] => string (0)" "[" post_status "] => string (7)" publish "[" comment_status "] => string (6) "closed" ["ping_status"] => string (6) "closed" ["post_password"] => string (0) "" ["post_name"] => string (4) "test" ["to_ping"] = > string (0) "" ["pinged"] => string (0) "" ["post_modified"] => string (19) "2016-01-21 19:50:24" ["post_modified_gmt"] => string (19) "2016-01-21 19:50:24" ["post_content_filtered"] => string (0) "" ["post_parent"] => int (0) ["guid"] => string (36 ) "" ["menu_order"] => int (0) ["post_type"] => string (4) "page" ["post_mime_type"] => string (0) "" ["comment_count"] => string ( 1) "0" ["filter"] => string (3) "raw"} NULL NULL NULL NULL NULL NULL NULL NULL NULL

Solutions Collecting From Web of "Переопределение глобальных результатов запроса без перехвата"

Трудно понять, что вам нужно сделать здесь, но вам нужно посмотреть на следующее

  • Не используйте глобальные переменные в качестве локальных переменных, он разбивает глобальные переменные и вызывает проблемы с циклом. Также довольно сложно отлаживать, когда вы сталкиваетесь с проблемами. Единственная глобальная переменная, которая должна использоваться как локальная переменная, – это когда вы работаете с setup_postdata() . setup_postdata() требует $post global. Вам просто нужно помнить, что $post этого перезагрузите $post global.

  • Используйте действия и фильтры, доступные внутри WP_Query чтобы изменить результат из определенного объекта запроса

В общем $post_count свойство $post_count рассчитывается исходя из количества сообщений внутри $posts . Перед подсчетом сообщений мы получаем фильтр the_posts . Это позволяет нам добавлять / удалять объекты post ( или упорядочивать почтовый заказ ) из массива $posts . Любое изменение здесь в количестве сообщений приведет к изменению свойства $ post_count

Вот соответствующий код из класса WP_Query

 if ( ! $q['suppress_filters'] ) { /** * Filter the array of retrieved posts after they've been fetched and * internally processed. * * @since 1.5.0 * * @param array $posts The array of retrieved posts. * @param WP_Query &$this The WP_Query instance (passed by reference). */ $this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) ); } // Ensure that any posts added/modified via one of the filters above are // of the type WP_Post and are filtered. if ( $this->posts ) { $this->post_count = count( $this->posts ); $this->posts = array_map( 'get_post', $this->posts ); if ( $q['cache_results'] ) update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']); $this->post = reset( $this->posts ); } else { $this->post_count = 0; $this->posts = array(); } 

Если вы хотите добавить сообщение в массив возвращенных сообщений, это будет место для этого

 add_filter( 'the_posts', function ( $posts, \WP_Query $q ) { if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions return $posts; $post_to_add = [ // Valid post properties ]; $post_to_add = array_map( 'get_post', $post_to_add ); // Add some checks to make sure our $post_to_inject is a valid. // Add $post_to_add in front of $posts array $posts = array_merge( $post_to_add, $posts ); // If you need to replace $posts with your object //$posts = [$post_to_add]; return $posts; }, 10, 2 ); 

$post устанавливается с первого поста в массиве $posts , поэтому также нет необходимости возиться с этим.

Что касается $found_posts вы можете использовать фильтр found_posts для настройки количества найденных сообщений

 add_filter( 'found_posts', function ( $found_posts, \WP_Query $q ) { if ( !$q->is_main_query ) // Only target the main query, return if not. Add any additional conditions return $found_posts; $found_posts = 1; // Taken info from your question return $found_posts; }): 

Как я уже сказал, я не очень уверен, что вам нужно делать, но я надеюсь, что я коснулся того, что вы после

Я нашел решение этого в переменной $ wp_query. Получив глобальную переменную для этого и переопределив значения внутри нее, я смог полностью контролировать то, что отображается на странице. Это позволило мне создать объект WP post, который поступал из базы данных вне wordpress, но не должен был делать ничего сложного для его отображения.

Вот полное руководство, в котором объясняется, как это сделать. http://yomotherboard.com/how-to-add-a-custom-php-page-to-wordpress-using-a-plugin/