pre_get_posts с get_posts

Поэтому в шаблоне у меня есть несколько признанных сообщений и ползунков и 2 цикла по умолчанию.

Я использую get_posts для всех, кроме циклов по умолчанию (очевидно).

Теперь проблема, с которой я get_posts сообщения get_posts из основных циклов. Я мог бы пойти query_posts , но влияние на производительность плохое, и я хочу работать над основным циклом еще до его сгенерирования.

Поэтому я буду использовать pre_get_posts в functions.php.

Внутри pre_get_posts я собираюсь изменить основной цикл и исключить данные get_posts.

У меня следующие проблемы:

  1. Мне нужно использовать get_posts внутри шаблона, поэтому мне нужно объявить переменную, удерживая ее как глобальную: (иначе она не будет доступна внутри моего шаблона.

  2. get_posts внутри pre_get_posts дает мне проблемы с памятью: Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 130968 байт

 function RoomsGazette_homepage_content( $query ) { //$tweets = getTweets( 4, $titan->getOption( 'tweets_from_user' ) ); $header_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 1, 'posts_per_page' => 5, ) ); //$footer_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 2, 'posts_per_page' => 5, ) ); //$featured = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 3, 'posts_per_page' => 2, ) ); $exclude_ids = array(); foreach ( $header_sliders as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } foreach ( $footer_sliders as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } foreach ( $featured as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post__not_in', $exclude_ids ); } } add_action( 'pre_get_posts', 'RoomsGazette_homepage_content' ); 

Solutions Collecting From Web of "pre_get_posts с get_posts"

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

 // avoid infinite loop remove_action( 'pre_get_posts', __FUNCTION__ ); 

Это гарантирует, что вы не подключаете его к pre_get_posts снова и снова, снова и снова get_posts() вызов get_posts() .

Во-вторых, используйте параметры WP_Query – и впоследствии get_posts – параметры fields , выбирая ids как значение, что уменьшает get_posts / рабочей нагрузки, получая только идентификаторы.