Только get_posts определенных форматов сообщений

10

Я пытаюсь создать архивный список только с моими "обычными" статьями в формате поста (не в ссылках, в стороне, цитатах и ​​т. Д.).

Как бы я внедрил has_post_format( 'standard' ), или что-то подобное, в код ниже?

Мне не удалось найти запрос, get_postsкоторый запрашивает только определенные типы форматов.

<?php    
    // Get the posts
    $myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');     
?>

<?php foreach($myposts as $post) : ?>   

<?php    
    // Setup the post variables
    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-навыки в лучшем случае находятся на начальном уровне, поэтому любая помощь будет высоко ценится.

Даба
источник

Ответы:

20

Вы не можете передать аргумент, связанный с таксономией 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 /* loop markup goes here */ ?>

<?php endforeach; ?>

...к этому:

<?php if ( $myposts->have_posts() ) : while ( $myposts->have_posts() ) : $myposts->the_post(); ?>

    <?php /* loop markup goes here */ ?>

<?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
// Only query posts with the
// "standard" post format, which
// requires *excluding* all other
// post formats, since neither the
// "post_format" taxonomy nor the
// "post-format-standard" taxonomy term
// is applied to posts without
// defined post formats
$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'
        )
    )
) );

// Open the loop
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 

// Close the loop
endwhile; endif;

// Reset $post data to default query
wp_reset_postdata();
Чип Беннетт
источник
спасибо, вы очень легко поняли новичку, красиво разобрав его. Я предполагаю, что поскольку я использую только сторонние, ссылки и стандартные форматы сообщений, я могу пропустить все остальное.
Даба
1
Да; вам нужно будет включить только те форматы сообщений, для которых вы включили поддержку.
Чип Беннетт
get_posts () фактически использует WP_Query, поэтому, конечно, вы можете передавать запросы таксономии, просто передавая их как массив, а не как строку запроса.
шабушабу
@shabushabu спасибо за это. Я обновил свой ответ.
Чип Беннетт
2

Форматы записей - это просто предопределенные термины в таксономии post_format, так что вы должны иметь возможность использовать иерархию шаблонов WP для создания архивов форматов записей. Просто создайте файл с именем taxonomy-post_format-post-format-standard.phpв корне вашей темы, и этот файл будет использоваться для вывода всех ваших стандартных сообщений. Вы можете заменить «стандартный» любым другим именем формата, например aside, linkили video, например, так taxonomy-post_format-post-format-video.php. Это работает и для любой другой таксономии, кстати, если вы придерживаетесь этого формата:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Если вы хотите показывать форматы записей с помощью пользовательского цикла, например, на боковой панели или в шаблоне страницы, вы можете использовать налоговый запрос от @kaiser. Просто замените таксономию на post_formatи слизняки на post-format-{FORMAT_NAME}.

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

Для двух разных таксономий. Для одного вы можете оставить relationаргумент вне.

$args = array(
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_janner',
            'field' => 'slug',
            'terms' => array( 'action', 'commedy' ) // Single terms as string - multiple as array
        ),
        array(
            'taxonomy' => 'actor',
            'field' => 'id',
            'terms' => array( 103, 115, 206 ),
            'operator' => 'NOT IN'
        )
    )
);
кайзер
источник
0

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

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

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