web-dev-qa-db-fra.com

Seulement get_posts de certains formats de publication

J'essaie de créer une liste d'archives avec uniquement mes articles de format de publication "normaux" (pas les formats 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 été en mesure de trouver une requête pour get_posts qui demande uniquement 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 en php sont au mieux au niveau débutant, donc toute aide serait la bienvenue.

10
daba

Vous ne pouvez pas réellement passer un argument relatif à la taxonomie à get_posts() .  (Edit: en fait, oui, vous le pouvez. Le Codex n’est pas très clair. En regardant la source, get_posts() est, au fond, juste un wrapper pour WP_Query().) Vous pouvez passer des méta clés/valeurs et poster types, mais pas les taxonomies telles que le format de publication. 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 questions fiscales peuvent être délicates comme ça.

L'étape suivante consiste à modifier vos instructions d'ouverture/fermeture de boucle. Changer ces:

<?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 balise de boucle réelle devrait pouvoir rester identique, 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>

Alors, 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();
20
Chip Bennett

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 de 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 générer tous vos articles standard. Vous pouvez remplacer "standard" par n’importe quel autre nom de format, tel que aside, link ou video, par exemple. taxonomy-post_format-post-format-video.php. Cela fonctionne également pour toute autre taxonomie, à condition de respecter le format suivant: 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 de taxe de @kaiser. Il suffit de remplacer la taxonomie par post_format et les slugs par post-format-{FORMAT_NAME}.

2
shabushabu

Pour deux taxonomies différentes. Pour un seul, vous pouvez laisser la relation argumenter.

$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'
        )
    )
);
1
kaiser

Vous pouvez faire un truc 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

0
theogrost