Как вывести записи из текущей таксономии на странице архива?

8 июн. 2013 г., 18:44:20
Просмотры: 15.4K
Голосов: 4

Я использую следующий код для вывода случайной записи из текущей категории на странице архива категории (используя archive.php). Однако на страницах архива меток или таксономий запись не выводится корректно из текущей метки или таксономии (из-за ограничения только категориями). Как можно модифицировать код, чтобы он работал с метками и таксономиями (или просто с таксономиями, так как категории и метки тоже являются таксономиями). Спасибо!

// присваиваем переменной текущую категорию
$currentcategory = $cat;

// формируем запрос
$args = 'showposts=1&cat=' . $currentcategory . '&orderby=rand';

$random_query = new WP_Query( $args );

// Цикл

if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post();

// кастомный шаблон для случайной записи

}

} else {

// записи не найдены

}

// Восстанавливаем оригинальные данные поста
wp_reset_postdata();

Измененный код согласно ответу s_ha_dum:

<?php // Запрос

if (is_tax() || is_category() || is_tag() ){
    $qobj = $wp_query->get_queried_object();

// формируем запрос
    $args = array(
        'posts_per_page' => 1,
        'orderby' => 'rand',
        'tax_query' => array(
            array(
                'taxonomy' => $qobj->taxonomy,
                'field' => 'id',
                'terms' => $qobj->term_id
                )
            )
        );
}

$random_query = new WP_Query( $args );

// Цикл
if ( $random_query->have_posts() ) {
    while ( $random_query->have_posts() ) {
        $random_query->the_post(); ?>

//HTML шаблон

<?php   }
} else {
    // записи не найдены
}
/* Восстанавливаем оригинальные данные поста */
wp_reset_postdata(); ?>
1
Комментарии

posts_per_page не работает, возвращается только одна запись.

Chozen Chozen
20 янв. 2015 г. 23:06:21
Все ответы на вопрос 2
5
11

Вам потребуется получить текущий объект запроса для страницы и динамически заполнить информацию о таксономии.

if (is_tax() || is_category() || is_tag() ){
    $qobj = get_queried_object();
    // var_dump($qobj); // только для отладки
    
    // формирование запроса
    $args = array(
      'posts_per_page' => 1,
      'orderby' => 'rand',
      'tax_query' => array(
        array(
          'taxonomy' => $qobj->taxonomy,
          'field' => 'id',
          'terms' => $qobj->term_id,
    //    также можно использовать slug
    //    'field' => 'slug', 
    //    'terms' => $qobj->name
        )
      )
    );

    $random_query = new WP_Query( $args );
    // var_dump($random_query); // только для отладки

    if ($random_query->have_posts()) {
        while ($random_query->have_posts()) {
          $random_query->the_post();
          // Вывод поста
        }
    }
} 

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

Вы можете использовать шаблоны архивов category.php и tag.php для отдельной обработки меток и категорий. Вам не обязательно использовать archive.php.

Ссылки

http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
http://codex.wordpress.org/Function_Reference/get_queried_object

8 июн. 2013 г. 19:43:47
Комментарии

Спасибо! Код отличный, но выводит весь "объект" текущей таксономии (из-за var_dump?). Я немного его модифицировал, чтобы избавиться от var_dump, и теперь он работает хорошо без вывода "объекта". Не уверен, корректна ли логика следующего кода, пожалуйста, помогите проверить.

Milo Milo
8 июн. 2013 г. 21:35:09

Да, var_dump почти всегда используется для отладки. Я добавил его, чтобы вы могли "увидеть", с чем имеете дело. Какой именно "следующий код"?

s_ha_dum s_ha_dum
8 июн. 2013 г. 21:36:47

Упс, я не могу добавить код в комментарий. Я добавил модифицированный код в исходный вопрос.

Milo Milo
8 июн. 2013 г. 21:43:02

@Milo : Вам нужно поместить этот запрос внутрь условия, а также в цикл, который его использует. См. правку. Моя ошибка.

s_ha_dum s_ha_dum
8 июн. 2013 г. 21:48:35

Извините, мне следовало быть более конкретным, мне нужен этот цикл в дополнение к основному. Я делаю слайдер в верхней части страницы category.php, чтобы показывать самые просматриваемые записи из текущей просматриваемой категории. ссылка

Chozen Chozen
21 янв. 2015 г. 20:12:21
2

Вы можете рассмотреть использование основного запроса с пользовательским хуком pre_get_posts:

add_action( 'pre_get_posts', 'custom_pre_get_posts' );

function custom_pre_get_posts( $query ) {
    if ( is_admin() or ! $query->is_main_query() )
        return;

    if ( is_archive() ) {
        $query->set( 'orderby', 'rand' );
        $query->set( 'posts_per_page',  1 );
    }

}

и обычного цикла, вместо дополнительного WP_Query().

8 июн. 2013 г. 19:36:57
Комментарии

Спасибо! pre_get_posts — это отличное решение, но оно изменяет основной цикл, и я не смогу отображать записи на страницах архивов. Но действительно хорошая идея для достижения цели умным способом.

Milo Milo
8 июн. 2013 г. 21:14:02

Хорошо, если вам нужен дополнительный WP_Query, обратите внимание на отличный ответ от @s_ha_dum ниже.

birgire birgire
8 июн. 2013 г. 21:40:16