Как получить только записи определенного формата в WordPress с помощью get_posts

13 апр. 2012 г., 14:34:00
Просмотры: 17.1K
Голосов: 11

Я пытаюсь создать архивный список только с моими статьями в "стандартном" формате (не 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>
    &nbsp;&nbsp;&nbsp;
    <span class="the_day">
        <?php the_time('j F Y'); ?>
    </span>
</p>

<?php endforeach; ?>

Мои навыки PHP находятся на начальном уровне, поэтому любая помощь будет очень ценной.

0
Все ответы на вопрос 4
4
22

Вы не можете передавать аргументы, связанные с таксономией, в функцию 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>
    &nbsp;&nbsp;&nbsp;
    <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>
        &nbsp;&nbsp;&nbsp;
        <span class="the_day">
            <?php the_time('j F Y'); ?>
        </span>
    </p>  
    <?php 

// Закрываем цикл
endwhile; endif;

// Сбрасываем данные $post к стандартному запросу
wp_reset_postdata();
13 апр. 2012 г. 16:14:24
Комментарии

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

daba daba
14 апр. 2012 г. 00:37:46

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

Chip Bennett Chip Bennett
14 апр. 2012 г. 00:43:06

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

shabushabu shabushabu
14 апр. 2012 г. 13:45:48

@shabushabu спасибо за это. Я обновил свой ответ.

Chip Bennett Chip Bennett
14 апр. 2012 г. 18:00:51
1

Форматы записей — это просто предопределенные термины в таксономии с названием 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-{НАЗВАНИЕ_ФОРМАТА}.

13 апр. 2012 г. 15:34:58
Комментарии

спасибо, но я пытаюсь создать архивы в шаблоне страницы, так что воспользуюсь одним из других решений :)

daba daba
14 апр. 2012 г. 00:35:48
0

Для двух разных таксономий. Для одной можно опустить аргумент 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'
        )
    )
);
13 апр. 2012 г. 15:02:00
1
-1

Вы можете сделать такой трюк:

<?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

3 янв. 2014 г. 14:15:16
Комментарии

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

honk31 honk31
20 июл. 2015 г. 22:16:40