Cum să obții doar postări cu anumite formate în WordPress

13 apr. 2012, 14:34:00
Vizualizări: 17.1K
Voturi: 11

Încerc să creez o listă de arhivă care să conțină doar articolele mele cu format "standard" (nu link-uri, aside-uri, citate etc.).

Cum aș putea implementa has_post_format( 'standard' ), sau ceva similar, în codul de mai jos?

Nu am reușit să găsesc o interogare pentru get_posts care să solicite doar anumite tipuri de formate.

<?php    
    // Obține postările
    $myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');     
?>

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

<?php    
    // Inițializează variabilele postului
    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; ?>

Abilitățile mele de PHP sunt la nivel de începător, așa că orice ajutor ar fi foarte apreciat.

0
Toate răspunsurile la întrebare 4
4
22

Nu poți transmite efectiv un argument legat de taxonomie către get_posts(). (Edit: de fapt, poți. Codex-ul este doar puțin neclar. Privind în sursă, get_posts() este, în esență, doar un wrapper pentru WP_Query().) Poți transmite chei/valori meta și tipuri de postări, dar nu taxonomii precum formatul postării. Deci pentru această linie:

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

Aș recomanda să folosești WP_Query() în loc de 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'
        )
    )
) );

Notă: da, sunt multe array-uri imbricate. Interogările de taxonomii pot fi complicate în acest fel.

Următorul pas este să modifici declarațiile de deschidere/închidere a loop-ului. Schimbă acestea:

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

    <?php /* markup-ul loop-ului merge aici */ ?>

<?php endforeach; ?>

...în aceasta:

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

    <?php /* markup-ul loop-ului merge aici */ ?>

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Markup-ul actual al loop-ului ar trebui să poată rămâne același, cu excepția faptului că nu mai este nevoie să apelezi 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>

Deci, punând totul laolaltă:

<?php
// Interoghează doar postările cu
// formatul "standard" de postare, care
// necesită *excluderea* tuturor celorlalte
// formate de postare, deoarece nici taxonomia
// "post_format" și nici termenul de taxonomie
// "post-format-standard" nu sunt aplicate postărilor
// fără formate definite
$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'
        )
    )
) );

// Deschide loop-ul
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 

// Închide loop-ul
endwhile; endif;

// Resetează datele $post la interogarea implicită
wp_reset_postdata();
13 apr. 2012 16:14:24
Comentarii

mulțumesc, ai făcut-o foarte ușor de înțeles pentru un începător prin modul în care ai explicat pas cu pas. Presupun că, din moment ce folosesc doar formatul aside, link și postări standard, pot să sar peste restul.

daba daba
14 apr. 2012 00:37:46

Da; ar trebui să incluzi doar formatele de postări pentru care ai activat suportul.

Chip Bennett Chip Bennett
14 apr. 2012 00:43:06

get_posts() folosește de fapt WP_Query, așa că desigur că poți transmite interogări de taxonomie, doar să le trimiți ca un array și nu ca un șir de interogare.

shabushabu shabushabu
14 apr. 2012 13:45:48

@shabushabu mulțumesc pentru asta. Am actualizat răspunsul meu.

Chip Bennett Chip Bennett
14 apr. 2012 18:00:51
1

Formatele de postare sunt doar termeni predefiniți într-o taxonomie numită post_format, așa că ar trebui să poți folosi ierarhia de șabloane din WP pentru a crea arhive după formatul postărilor. Pur și simplu creează un fișier numit taxonomy-post_format-post-format-standard.php în rădăcina temei tale și acel fișier va fi folosit pentru a afișa toate postările standard. Poți înlocui 'standard' cu oricare dintre celelalte nume de formate, cum ar fi aside, link sau video, de exemplu taxonomy-post_format-post-format-video.php. Acest lucru funcționează și pentru orice altă taxonomie, apropo, atâta timp cât respecti acest format: taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php.

Dacă dorești să afișezi formatele de postare cu o buclă personalizată, de exemplu în bara laterală sau într-un șablon de pagină, atunci poți folosi interogarea taxonomiei de la @kaiser. Doar înlocuiește taxonomia cu post_format și slug-urile cu post-format-{FORMAT_NAME}.

13 apr. 2012 15:34:58
Comentarii

mersi, dar încerc să creez arhivele într-un șablon de pagină, așa că voi merge cu una dintre celelalte soluții :)

daba daba
14 apr. 2012 00:35:48
0

Pentru două taxonomii diferite. Pentru o singură taxonomie, poți omite argumentul relation.

$args = array(
    'tax_query' => array(
        'relation' => 'AND', // Relația între condiții - 'AND' sau 'OR'
        array(
            'taxonomy' => 'movie_janner', // Prima taxonomie
            'field' => 'slug', // Câmpul folosit pentru potrivire (slug, id sau name)
            'terms' => array( 'action', 'commedy' ) // Termeni individuali ca string - multipli ca array
        ),
        array(
            'taxonomy' => 'actor', // A doua taxonomie
            'field' => 'id', // Câmpul folosit pentru potrivire
            'terms' => array( 103, 115, 206 ), // ID-urile actorilor excluși
            'operator' => 'NOT IN' // Operatorul de excludere
        )
    )
);
13 apr. 2012 15:02:00
1
-1

Poți face un truc de genul acesta:

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

Aceasta funcționează deoarece get_post_format() pentru formatul standard de post returnează false. http://codex.wordpress.org/Function_Reference/get_post_format

3 ian. 2014 14:15:16
Comentarii

de fapt, această metodă funcționează, dar vei avea probleme când iei în considerare paginarea. dacă faci ceva de genul 'posts_per_page' => 6 și ai 4 articole cu șablon NON standard, vei vedea doar 2 articole, nu cele 6 care ar trebui să fie vizibile. filtrarea interogării este soluția corectă de urmat..

honk31 honk31
20 iul. 2015 22:16:40