Tylko get_posts niektórych formatów postów


10

Próbuję utworzyć listę archiwalną zawierającą tylko moje „normalne” artykuły w formacie pocztowym (nie w formacie linków, boków, cytatów itp.).

Jak mam zaimplementować has_post_format( 'standard' )lub coś podobnego w poniższym kodzie?

Nie udało mi się znaleźć zapytania, get_postsktóre dotyczy tylko określonych typów formatów.

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

Moje umiejętności php są w najlepszym razie na poziomie początkującym, więc każda pomoc byłaby mile widziana.

Odpowiedzi:


20

W rzeczywistości nie można przekazać argumentu związanego z taksonomią get_posts(). (Edycja: faktycznie, tak, można. Kodeks jest po prostu niejasny. Patrząc na źródło, get_posts()jest on po prostu opakowaniem WP_Query().) Możesz przekazać meta klucze / wartości i typy postów , ale nie taksonomie takie jak post format. Więc dla tej linii:

$myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');

Poleciłbym WP_Query()raczej używać niż 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'
        )
    )
) );

Uwaga: tak, to wiele zagnieżdżonych tablic. Takie zapytania podatkowe mogą być trudne.

Następnym krokiem jest zmodyfikowanie instrukcji otwierania / zamykania pętli. Zmień te:

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

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

<?php endforeach; ?>

...do tego:

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

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

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Rzeczywiste znaczniki pętli powinny pozostać takie same, z tym wyjątkiem, że nie trzeba już dzwonić 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>

Podsumowując:

<?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();

dzięki, naprawdę ułatwiłeś początkującym zrozumienie, ładnie je rozkładając. Zgaduję, ponieważ używam tylko formatów bocznych, linkowych i standardowych, mogę właściwie pominąć resztę.
daba

1
Tak; musisz tylko podać formaty postów, dla których włączyłeś obsługę.
Chip Bennett

get_posts () faktycznie wykorzystuje WP_Query, więc oczywiście można przekazywać zapytania taksonomiczne, po prostu przekazywać je jako tablicę, a nie jako ciąg zapytania.
shabushabu

@shabushabu dzięki za to. Zaktualizowałem swoją odpowiedź.
Chip Bennett

2

Formaty post_formatpostów są po prostu predefiniowanymi terminami w tak zwanej taksonomii , więc powinieneś mieć możliwość korzystania z hierarchii szablonów WP do tworzenia archiwów formatu postu. Wystarczy utworzyć plik o nazwie taxonomy-post_format-post-format-standard.phpw katalogu głównym motywu, a ten plik będzie używany do wyświetlania wszystkich standardowych postów. Można zastąpić „standard” z żadnym z innych nazw formatu, jak aside, linklub video, więc np taxonomy-post_format-post-format-video.php. Działa to również w przypadku każdej innej taksonomii, tak długo jak trzymasz się tego formatu:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Jeśli chcesz wyświetlać formaty postów za pomocą niestandardowej pętli, np. Na pasku bocznym lub w szablonie strony, możesz użyć zapytania podatkowego z @kaiser. Po prostu zastąp taksonomię post_formati ślimaki post-format-{FORMAT_NAME}.


dzięki, ale próbuję utworzyć archiwa w szablonie strony, więc wybiorę jedno z innych rozwiązań :)
daba

1

Dla dwóch różnych taksonomii. Dla jednego możesz pominąć relationargument.

$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

Możesz zrobić taką sztuczkę:

<?php 
while( have_posts() ) : the_post();
get_post_format()==false? get_template_part( 'loop', 'posts' ) : false;
endwhile;
?>

Jest tak, ponieważ get_post_format () dla standardowego formatu wiadomości zwraca false. http://codex.wordpress.org/Function_Reference/get_post_format


tak naprawdę to działa, ale wpadniesz w kłopoty, gdy weźmiesz pod uwagę stronicowanie. jeśli zrobisz coś podobnego 'posts_per_page' => 6i masz 4 posty z NIE standardowym szablonem, zobaczysz tylko 2 posty, a nie 6, które powinny być widoczne. filtrowanie zapytania jest najlepszym sposobem na zrobienie tego.
honk31,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.