Как эффективно сбросить объект записи после вызова get_posts()

26 мая 2011 г., 17:49:35
Просмотры: 9.81K
Голосов: 5

Функция ниже вызывается из моего 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">&nbsp;</div>';?>
                </li>
            <?php } 
    echo "</ul></div>";}}
0
Все ответы на вопрос 2
1

wp_reset_query() сбрасывает запрос к исходному запросу, который WordPress выполнил на этой странице. Поэтому если вы где-то вызывали query_posts(), он сбросится не к этому запросу, а к "главному" запросу.

Вероятно, вам следует использовать wp_reset_postdata(), который сбрасывает переменную $post к текущему посту в $wp_query.

Лучший вариант — не перезаписывать глобальную переменную $post в вашей функции. Все функции WordPress имеют варианты, принимающие объект поста, поэтому нет необходимости использовать глобальную переменную.

26 мая 2011 г. 18:09:13
Комментарии

Вот и все, Ян. Я добавил wp_reset_postdata() в конец функции, и теперь все работает хорошо. Однако мне не удалось заставить функцию работать без установки global $post. Даже передача $post в функцию не работает так, как ожидалось.

Scott B Scott B
26 мая 2011 г. 18:26:31
0

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

26 мая 2011 г. 18:22:41