Wordpress show the_content захватывает неправильный контент сообщения. Зачем?

Моя проблема в том, что я показываю некоторые сообщения из категории "события". Затем чуть позже на той же странице я хочу отобразить случайный пост из категории "Спиллер", и это прекрасно работает. Он получает случайное сообщение, показывает заголовок, миниатюру, но когда я говорю "показать the_content" (или the_excerpt), он показывает все содержимое (или выдержки) сообщений в категории "события". Пожалуйста, помогите мне решить это!

<div class="well span6 Padding10">
    <h4 class="titleFont MarginBottom20">KOMMENDE BEGIVENHEDER</h4>
    <?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $args  = array(
        'category_name' => 'events', // Change these category SLUGS to suit your use.
        'paged'         => $paged

    );
    query_posts( $args ); ?>
    <ul>
        <?php
        while ( have_posts() ) : the_post(); ?>
            <li>
                <a href="<?php the_permalink(); ?>"><strong><?php the_title(); ?></strong></a>
            </li>
        <?php endwhile; ?>
    </ul>
</div>

<div class="span6 well" style="height: 250px;"><h4 class="titleFont">SPILLER HIGHLIGHT</h4>
    <div class="row-fluid">
        <?php
        $args       = array(
            'numberposts'   => 1,
            'orderby'       => 'rand',
            'category_name' => 'spiller'
        );
        $rand_posts = get_posts( $args );
        foreach ( $rand_posts as $post ) : ?>

            <div class="span5"><?php the_post_thumbnail( array( 150, 150 ) ); ?></div>
            <div class="span6 MarginTop10">
                <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
                <!-- THIS IS WHERE IT MESSES UP: --><?php the_content(); ?>
            </div>
        <?php endforeach; ?>
    </div>
</div>

1 ответ

Решение

Прежде всего, вам нужно избегать использования query_posts. Это влияет на многие глобалы Wordpress и изменяет цикл по умолчанию, которого - если только это не является вашим конкретным намерением - абсолютно необходимо избегать, так как это также может привести к проблемам с производительностью.

Пожалуйста, обратите внимание на замену query_posts на WP_Query.

Кроме того, вам нужно сбросить ваши постданные, а также настроить новые постданные в следующем цикле.

Сброс запроса::

<?php 
while ( have_posts() ) : the_post(); 
?>
<li>
    <a href="<?php the_permalink(); ?>"><strong><?php the_title(); ?></strong></a>
</li>

<?php endwhile;wp_reset_query(); ?>

Настроить:

foreach( $rand_posts as $post ) : setup_postdata($post); ?>

Сбросить постданные:

<?php endforeach;wp_reset_postdata(); ?>

Почему это нужно сделать?

Каждый раз, когда вы используете одну из тех удобных функций Wordpress с префиксом "the_", эта функция ссылается на $post Global. query_posts изменяет этот Global (как упоминалось выше), и если вы планируете ссылаться на этот Global в отдельном цикле, вы должны иметь возможность изменить его снова на лету.

Сброс ваших запросов - это просто хорошая общая практика, чтобы убедиться, что все ваши глобальные переменные вернулись к настройкам Wordpress по умолчанию. Но setup_postdata($post_object) - это то, что на самом деле позволяет нам изменить этот Global на текущий объект в нашем пользовательском цикле.

Причина, по которой WP_Query настолько эффективен, состоит в том, что сброс запроса больше не является необходимым, поскольку циклы WP_Query локализуются для этого конкретного объекта и не изменяют глобальный $wp_query (который случайно влияет на множество других глобальных переменных).

Вот некоторая полезная информация о query_posts против WP_Query, которая должна объяснить вам кое-что лучше.

Хмель это помогает.

Другие вопросы по тегам