Как эффективно сбросить объект записи после вызова get_posts()
Функция ниже вызывается из моего index.php сразу после основного блока контента. Её цель - вывести список ссылок на последние записи. Однако мне нужно сбросить объект записи после выполнения этой функции (иначе последующий запрос для сайдбара считает, что текущей записью является последняя запись, обработанная этой функцией).
Как мне вернуть объект post к текущей записи страницы?
Я пробовал добавлять wp_reset_query() в конце функции, но это не даёт нужного результата (выводит несколько записей в области контента). Буду благодарен за любую помощь.
function myFunction(){
$catHidden=get_cat_ID('hidden');
$myquery = new WP_Query();
$myquery->query(array('cat' => "-$catHidden",'post__not_in' => get_option('sticky_posts')));
$myrecentpostscount = $myquery->found_posts;
if ($myrecentpostscount > 0){ ?>
<div>
<h4>Заголовок меню</h4>
<ul>
<?php
global $post;
$myrecentposts = get_posts(array('post__not_in' => get_option('sticky_posts'), 'cat' => "-$catHidden",'numberposts' => get_option('latest_count')));
foreach($myrecentposts as $idxrecent=>$post) { ?>
<li class="page_item">
<a href="<?php the_permalink(); ?>"><?php if(has_post_thumbnail() && get_option('show_thumbs')) the_post_thumbnail('thumbnail', array('class' => 'alignleft', 'style' => 'margin:0 10px 0 0;')); ?><?php the_title(); ?></a>
<?php
if(has_post_thumbnail() && get_option('show_thumbs')) echo '<div style="clear:both"> </div>';?>
</li>
<?php }
echo "</ul></div>";}}

wp_reset_query()
сбрасывает запрос к исходному запросу, который WordPress выполнил на этой странице. Поэтому если вы где-то вызывали query_posts()
, он сбросится не к этому запросу, а к "главному" запросу.
Вероятно, вам следует использовать wp_reset_postdata()
, который сбрасывает переменную $post
к текущему посту в $wp_query
.
Лучший вариант — не перезаписывать глобальную переменную $post
в вашей функции. Все функции WordPress имеют варианты, принимающие объект поста, поэтому нет необходимости использовать глобальную переменную.

Я думаю, проблема здесь может быть связана с использованием глобальной переменной $post, а также с использованием get_posts.
По сути, вы дважды запрашиваете посты: первый раз с помощью нового WP_Query (просто чтобы проверить количество возвращённых постов), а второй раз с помощью get_posts.
При первой проверке посты уже возвращаются в основной переменной $myquery->posts;
Также не стоит использовать found_posts, так как это, похоже, возвращает неверное количество. Вместо этого используйте $myquery->post_count.
Как только вы избавитесь от global $post и get_posts, замените переменную found_posts — у вас больше не будет проблем с перезаписью данных. Я использовал такой подход:
$posts=new WP_Query(//массив параметров);
if($posts->have_posts()) :
while($posts->have_posts()) : $posts->the_post();
$thispost=$posts->post;
// работаем с постом, если нужны функции типа the_permalink, используем get_permalink($thispost->ID) вместо этого.
endwhile;
endif;
И это не испортило мои данные. Хотя это немного менее удобно, так как нельзя использовать стандартные the_title, the_content и т.д. Но можно использовать их get-аналоги, основанные на ID — и если вам нужны специфичные фильтры для стандартных функций, вы всегда можете применить их к полученному контенту.
