Get_posts uniquement de certains formats de publication

10

J'essaie de créer une liste d'archives avec uniquement mes articles de format de publication "normaux" (pas de lien, de côté, de citation, etc.).

Comment pourrais-je implémenter has_post_format( 'standard' ), ou quelque chose de similaire, dans le code ci-dessous?

Je n'ai pas pu trouver une requête pour get_postslaquelle ne demande que des types de format spécifiques.

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

Mes compétences php sont au mieux au niveau débutant, donc toute aide serait très appréciée.

daba
la source

Réponses:

20

Vous ne pouvez pas réellement passer un argument lié à la taxonomie à get_posts(). (Edit: en fait, oui vous pouvez. Le Codex est juste quelque peu flou. En regardant la source, il get_posts()est, en son cœur, juste un wrapper pour WP_Query().) Vous pouvez passer des méta clés / valeurs et des types de publication , mais pas des taxonomies telles que la publication format. Donc pour cette ligne:

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

Je recommanderais d'utiliser WP_Query()plutôt que 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'
        )
    )
) );

Remarque: oui, cela fait beaucoup de tableaux imbriqués. Les requêtes fiscales peuvent être délicates comme ça.

L'étape suivante consiste à modifier vos instructions d'ouverture / fermeture de boucle. Modifiez-les:

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

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

<?php endforeach; ?>

...pour ça:

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

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

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Votre balisage de boucle réel devrait pouvoir rester le même, sauf que vous n'avez plus besoin d'appeler 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>

Donc, tout mettre ensemble:

<?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();
Chip Bennett
la source
merci, vous avez facilité la compréhension d'un débutant en le décomposant bien. Je suppose que puisque je n'utilise que les formats de côté, de lien et de publication standard, je peux en fait sauter le reste.
daba
1
Oui; il vous suffit d'inclure les formats de publication pour lesquels vous avez activé la prise en charge.
Chip Bennett
get_posts () utilise en fait WP_Query, donc bien sûr vous pouvez passer des requêtes de taxonomie, il suffit de les passer comme un tableau et non comme une chaîne de requête.
shabushabu
@shabushabu merci pour cela. J'ai mis à jour ma réponse.
Chip Bennett
2

Les formats de publication ne sont que des termes prédéfinis dans une taxonomie appelée post_format, vous devriez donc pouvoir utiliser la hiérarchie des modèles WP pour créer des archives de format de publication. Créez simplement un fichier appelé taxonomy-post_format-post-format-standard.phpà la racine de votre thème et ce fichier sera utilisé pour sortir tous vos messages standard. Vous pouvez remplacer «standard» par l'un des autres noms de format, comme aside, linkou video, par exemple, par exemple taxonomy-post_format-post-format-video.php. Cela fonctionne également pour toute autre taxonomie, btw, tant que vous vous en tenez à ce format:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Si vous souhaitez afficher les formats de publication avec une boucle personnalisée, par exemple dans votre barre latérale ou dans un modèle de page, vous pouvez utiliser la requête fiscale de @kaiser. Remplacez simplement la taxonomie par post_formatet les limaces par post-format-{FORMAT_NAME}.

shabushabu
la source
merci, mais j'essaie de créer les archives dans un modèle de page, donc je vais aller avec l'une des autres solutions :)
daba
1

Pour deux taxonomies différentes. Pour un seul, vous pouvez laisser l' relationargument en dehors.

$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'
        )
    )
);
kaiser
la source
0

Vous pouvez faire un tour comme ça:

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

C'est parce que get_post_format () pour le format de publication standard renvoie false. http://codex.wordpress.org/Function_Reference/get_post_format

theogrost
la source
en fait, cela fonctionne, mais vous aurez des ennuis lorsque vous envisagez de paginer. si vous faites quelque chose comme 'posts_per_page' => 6et avez 4 messages avec un modèle NON standard, vous ne verrez que 2 messages, pas les 6 qui devraient être visibles. filtrer la requête est la voie à suivre.
honk31