Cum să obții doar postări cu anumite formate în WordPress
Î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>
<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.

Nu poți transmite efectiv un argument legat de taxonomie către (Edit: de fapt, poți. Codex-ul este doar puțin neclar. Privind în sursă, get_posts()
.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>
<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>
<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();

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.

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

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.

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}
.

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

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

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..
