Wordpress query_posts orderby rand не работает в шаблоне архива категории

Я не могу заставить мою тему Wordpress рандомизировать сообщения, которые я показываю в архивах категорий [я использую ее как CMS]. Домашняя страница обычно выбирается случайным образом, и я [я думаю] правильно изменяю WP_query. Ниже приведен точный массив args:

array(4) { ["orderby"]=> string(4) "rand" ["order"]=> string(3) "ASC" ["posts_per_page"]=> string(2) "-1" ["category_name"]=> string(8) "branding" }

Для удобства чтения это:

orderby => rand
order => ASC
posts_per_page => -1
category_name => branding (or whatever the query_string brings in)

Я получаю все сообщения из категории, но они расположены в порядке даты публикации.

Какие-нибудь подсказки? или альтернативные методы перетасовки результата моего WP_query в have_posts?

Спасибо.

************EDIT************

Извините, я должен был быть более понятным в отношении массива args выше. Это var_dump массива запроса, а не мои аргументы, которые я добавляю в запрос.

    $args = array(
        'orderby'        => 'rand',
        'order'      => 'ASC',
        'posts_per_page' => '-1',
    );
    global $wp_query;           
    remove_all_filters('posts_orderby');
    $theq = array_merge($args, $wp_query->query);
    query_posts($theq);

Я добавил remove_all_filters в соответствии с предложением шейха Хиры, но это не изменило ситуацию.


person iiz    schedule 06.06.2012    source источник


Ответы (3)


Тогда вам может быть лучше создать новый запрос. Его следует использовать только в шаблоне таксономии, например, в category.php или taxonomy-yourcustomtaxonomy.php.

global $wp_query;

$term = $wp_query->queried_object;

$args=array(
    'orderby' => 'rand',
    'posts_per_page' => -1,
    'post_type' => 'post',
    'tax_query' => array(
            array(
                'taxonomy'  => $term->taxonomy,
                'field'     => 'slug',
                'terms'     => $term->slug,
                )
            )
    );

$new_query = null;
$new_query = new WP_Query($args);

while ($new_query->have_posts()) : $new_query->the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <h2 class="entry-title"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <div class="entry-meta"><?php // Meta ?></div><!-- .entry-meta -->
        <div class="entry-content"><?php the_content(); ?></div>
    </div>
<?php
endwhile;
wp_reset_postdata();
person Paul Phillips    schedule 08.06.2012
comment
Спасибо, что рандомизация работает правильно. Для всех, кто просматривает, обратите внимание, что для tax_query категории category вам необходимо изменить приведенный выше массив аргументов на: 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'the_category_name' ) - person iiz; 19.06.2012

Это может быть другой плагин, который создает проблему, но вы можете сделать следующее

remove_all_filters('posts_orderby');
$args=array(
    orderby => 'rand'
    order => 'ASC'
    posts_per_page => -1
    category_name => 'branding'
);
query_posts($args);

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

person The Alpha    schedule 06.06.2012
comment
Привет и спасибо, я попробовал это предложение, но это не имело значения. Я добавил несколько деталей и код к своему вопросу. - person iiz; 07.06.2012

Я думаю, вы хотите объединить его с исходным запросом. Тогда нет необходимости указывать категорию, и это работает, если она также использует настраиваемую таксономию.

$args = array(
    'posts_per_page' => -1,
    'orderby' => 'rand'
    );

query_posts( array_merge( $wp_query->query, $args) ); 
person Paul Phillips    schedule 06.06.2012
comment
Привет и спасибо, но я уже этим занимаюсь. Я добавил несколько деталей и свой полный код. - person iiz; 07.06.2012
comment
И вы используете while ( have_posts() ) : the_post(); после него как обычно? Вам не нужно включать order => ASC, так как он в любом случае случайный. - person Paul Phillips; 07.06.2012
comment
Ага. После запроса у меня есть: if ( have_posts() ) : while (have_posts() ) : the_post(); $count = $wp_query->current_post + 1; $meta = get_post_custom();, а затем прямо в цикл - person iiz; 07.06.2012