Как получить только записи определенного формата в WordPress с помощью get_posts
Я пытаюсь создать архивный список только с моими статьями в "стандартном" формате (не link, aside, quote и других форматах).
Как я могу реализовать has_post_format( 'standard' )
, или что-то подобное, в приведенном ниже коде?
Я не смог найти запрос для get_posts
, который получает только определенные форматы записей.
<?php
// Получаем записи
$myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');
?>
<?php foreach($myposts as $post) : ?>
<?php
// Настраиваем переменные записи
setup_postdata($post);
$year = mysql2date('Y', $post->post_date);
$month = mysql2date('n', $post->post_date);
$day = mysql2date('j', $post->post_date);
?>
<p>
<span class="the_article">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</span>
<span class="the_day">
<?php the_time('j F Y'); ?>
</span>
</p>
<?php endforeach; ?>
Мои навыки PHP находятся на начальном уровне, поэтому любая помощь будет очень ценной.

Вы не можете передавать аргументы, связанные с таксономией, в функцию (Примечание: на самом деле, это возможно. Кодекс просто недостаточно ясен. Если посмотреть исходный код, get_posts()
.get_posts()
по сути является обёрткой для WP_Query()
.) Вы можете передавать мета-ключи/значения и типы записей, но не таксономии, такие как формат записи. Поэтому для этой строки:
$myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');
Я рекомендую использовать WP_Query()
вместо get_posts()
:
$myposts = new WP_Query( array(
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-aside',
'post-format-audio',
'post-format-chat',
'post-format-gallery',
'post-format-image',
'post-format-link',
'post-format-quote',
'post-format-status',
'post-format-video'
),
'operator' => 'NOT IN'
)
)
) );
Примечание: да, здесь много вложенных массивов. Запросы по таксономиям могут быть такими сложными.
Следующий шаг — изменить открывающие и закрывающие теги цикла. Замените это:
<?php foreach($myposts as $post) : ?>
<?php /* разметка цикла здесь */ ?>
<?php endforeach; ?>
...на это:
<?php if ( $myposts->have_posts() ) : while ( $myposts->have_posts() ) : $myposts->the_post(); ?>
<?php /* разметка цикла здесь */ ?>
<?php endwhile; endif; ?>
<?php wp_reset_postdata(); ?>
Ваша текущая разметка цикла должна остаться такой же, за исключением того, что теперь вам не нужно вызывать setup_postdata( $post )
:
<?php
$year = mysql2date('Y', $post->post_date);
$month = mysql2date('n', $post->post_date);
$day = mysql2date('j', $post->post_date);
?>
<p>
<span class="the_article">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</span>
<span class="the_day">
<?php the_time('j F Y'); ?>
</span>
</p>
Итак, собрав всё вместе:
<?php
// Запрашиваем только записи с
// форматом "standard", что
// требует *исключения* всех
// других форматов, так как ни
// таксономия "post_format", ни
// термин таксономии "post-format-standard"
// не применяются к записям без
// определённого формата
$myposts = new WP_Query( array(
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-aside',
'post-format-audio',
'post-format-chat',
'post-format-gallery',
'post-format-image',
'post-format-link',
'post-format-quote',
'post-format-status',
'post-format-video'
),
'operator' => 'NOT IN'
)
)
) );
// Открываем цикл
if ( $myposts->have_posts() ) : while ( $myposts->have_posts() ) : $myposts->the_post(); ?>
$year = mysql2date('Y', $post->post_date);
$month = mysql2date('n', $post->post_date);
$day = mysql2date('j', $post->post_date);
?>
<p>
<span class="the_article">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</span>
<span class="the_day">
<?php the_time('j F Y'); ?>
</span>
</p>
<?php
// Закрываем цикл
endwhile; endif;
// Сбрасываем данные $post к стандартному запросу
wp_reset_postdata();

спасибо, вы очень упростили понимание для новичка, красиво разложив все по полочкам. Полагаю, раз я использую только aside, link и стандартные форматы записей, остальное можно пропустить.

Да; вам нужно включать только те форматы записей, для которых вы включили поддержку.

get_posts() на самом деле использует WP_Query, так что конечно вы можете передавать таксономии в запросе, просто передавайте их как массив, а не как строку запроса.

Форматы записей — это просто предопределенные термины в таксономии с названием post_format
, поэтому вы можете использовать иерархию шаблонов WordPress для создания архивов форматов записей. Просто создайте файл с именем taxonomy-post_format-post-format-standard.php
в корне вашей темы, и этот файл будет использоваться для вывода всех стандартных записей. Вы можете заменить 'standard' на любое другое название формата, например aside
, link
или video
, например: taxonomy-post_format-post-format-video.php
. Кстати, это работает и для любой другой таксономии, если придерживаться формата: taxonomy-{НАЗВАНИЕ_ТАКСОНОМИИ}-{НАЗВАНИЕ_ТЕРМИНА}.php
.
Если вы хотите отображать форматы записей с помощью пользовательского цикла, например, в сайдбаре или внутри шаблона страницы, вы можете использовать tax query, как предложил @kaiser. Просто замените таксономию на post_format
, а слаги на post-format-{НАЗВАНИЕ_ФОРМАТА}
.

Для двух разных таксономий. Для одной можно опустить аргумент relation
.
$args = array(
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'movie_janner',
'field' => 'slug',
'terms' => array( 'action', 'commedy' ) // Одиночные термины как строка - несколько как массив
),
array(
'taxonomy' => 'actor',
'field' => 'id',
'terms' => array( 103, 115, 206 ),
'operator' => 'NOT IN'
)
)
);

Вы можете сделать такой трюк:
<?php
while( have_posts() ) : the_post();
get_post_format()==false? get_template_part( 'loop', 'posts' ) : false;
endwhile;
?>
Это работает потому, что get_post_format() для стандартного формата записи возвращает false. http://codex.wordpress.org/Function_Reference/get_post_format

на самом деле это работает, но возникнут проблемы, если учитывать постраничную навигацию. если вы сделаете что-то вроде 'posts_per_page' => 6
и у вас будет 4 записи с НЕстандартным шаблоном, вы увидите только 2 записи вместо 6, которые должны быть видны. фильтрация запроса - правильный путь..
