Nur get_posts bestimmter Postformate

10

Ich versuche, eine Archivliste nur mit meinen "normalen" Artikeln im Post-Format zu erstellen (keine Link-, Seiten-, Zitat- usw. Formate).

Wie würde ich has_post_format( 'standard' )oder etwas Ähnliches in den folgenden Code implementieren ?

Ich konnte keine Abfrage finden get_posts, die nur bestimmte Formattypen anfordert.

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

Meine PHP-Fähigkeiten sind bestenfalls auf Anfängerniveau, daher wäre jede Hilfe sehr dankbar.

daba
quelle

Antworten:

20

Sie können ein taxonomiebezogenes Argument nicht an übergeben get_posts(). (Bearbeiten: Ja, das können Sie. Der Codex ist nur etwas unklar. Wenn Sie sich die Quelle ansehen, get_posts()ist dies im Kern nur ein Wrapper für WP_Query().) Sie können Metaschlüssel / -werte und Post- Typen übergeben , jedoch keine Taxonomien wie Post Format. Also für diese Zeile:

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

Ich würde WP_Query()eher empfehlen als 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'
        )
    )
) );

Hinweis: Ja, das sind viele verschachtelte Arrays. Steueranfragen können so schwierig sein.

Der nächste Schritt besteht darin, die Anweisungen zum Öffnen / Schließen der Schleife zu ändern. Ändern Sie diese:

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

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

<?php endforeach; ?>

... dazu:

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

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

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Ihr tatsächliches Loop-Markup sollte gleich bleiben können, außer dass Sie nicht mehr aufrufen müssen 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>

Also, alles zusammen:

<?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
quelle
danke, du hast es einem Anfänger wirklich leicht gemacht, es zu verstehen, indem du es gut aufgeschlüsselt hast. Ich vermute, da ich nur Seiten-, Link- und Standardpostformate verwende, kann ich den Rest tatsächlich überspringen.
Daba
1
Ja; Sie müssten nur die Postformate angeben, für die Sie die Unterstützung aktiviert haben .
Chip Bennett
get_posts () verwendet tatsächlich WP_Query, sodass Sie Taxonomie-Abfragen natürlich übergeben können. Übergeben Sie sie einfach als Array und nicht als Abfragezeichenfolge.
Shabushabu
@ Shabushabu danke dafür. Ich habe meine Antwort aktualisiert.
Chip Bennett
2

Postformate sind nur vordefinierte Begriffe in einer so genannten Taxonomie. post_formatSie sollten daher in der Lage sein, die WP-Vorlagenhierarchie zum Erstellen von Postformatarchiven zu verwenden. Erstellen Sie einfach eine Datei, die taxonomy-post_format-post-format-standard.phpim Stammverzeichnis Ihres Themas aufgerufen wird, und diese Datei wird verwendet, um alle Ihre Standardbeiträge auszugeben. Sie können mit allen anderen Formatnamen, wie ‚Standard‘ ersetzen aside, linkoder video, so zB taxonomy-post_format-post-format-video.php. Dies funktioniert übrigens auch für jede andere Taxonomie, solange Sie sich an dieses Format halten:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Wenn Sie Beitragsformate mit einer benutzerdefinierten Schleife anzeigen möchten, z. B. in Ihrer Seitenleiste oder in einer Seitenvorlage, können Sie die Steuerabfrage von @kaiser verwenden. Ersetzen Sie einfach die Taxonomie durch post_formatund die Schnecken durch post-format-{FORMAT_NAME}.

Shabu Shabu
quelle
danke, aber ich versuche, die Archive innerhalb einer Seitenvorlage zu erstellen, also werde ich mit einer der anderen Lösungen gehen :)
daba
1

Für zwei verschiedene Taxonomien. Für einen einzelnen können Sie das relationArgument weglassen.

$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
quelle
0

Sie können so einen Trick machen:

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

Dies liegt daran, dass get_post_format () für das Standardpostformat false zurückgibt. http://codex.wordpress.org/Function_Reference/get_post_format

Theogrost
quelle
Eigentlich funktioniert das, aber Sie werden in Schwierigkeiten geraten, wenn Sie Paging in Betracht ziehen. Wenn Sie so etwas tun 'posts_per_page' => 6und 4 Beiträge mit NICHT Standardvorlage haben, werden nur 2 Beiträge angezeigt, nicht die 6, die sichtbar sein sollten. Das Filtern der Abfrage ist der Beweis dafür.
Honk31