Лише 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. Це працює і для будь-якої іншої систематики, btw, якщо ви дотримуєтесь цього формату: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 () для стандартного формату публікації повертає помилково. http://codex.wordpress.org/Function_Reference/get_post_format


насправді це справді спрацьовує, але ви потрапите в проблеми, коли будете розглядати сторінку. якщо ви робите щось на кшталт 'posts_per_page' => 6і маєте 4 повідомлення зі стандартним шаблоном, ви побачите лише 2 повідомлення, а не 6, які повинні бути видні. фільтрування запиту - це доказ шлях. ..
honk31
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.