Cum să afișezi postări din taxonomia curentă în pagina de arhivă?
Folosesc următorul cod pentru a afișa o postare aleatorie din categoria curentă în pagina de arhivă a categoriei (folosind archive.php). Totuși, când sunt în paginile de arhivă pentru Tag-uri sau Taxonomii, postarea nu este afișată corect din Tag-ul sau Taxonomia curentă (din cauza limitării la categorii). Cum pot modifica pentru a funcționa cu Tag-uri și Taxonomii (sau doar Taxonomii, deoarece Categoriile și Tag-urile sunt tot Taxonomii)? Mulțumesc!
// atribuie variabila ca fiind categoria curentă
$currentcategory = $cat;
// concatenează interogarea
$args = 'showposts=1&cat=' . $currentcategory . '&orderby=rand';
$random_query = new WP_Query( $args );
// Bucla
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post();
// șablon personalizat pentru postarea aleatorie
}
} else {
// nicio postare găsită
}
// Restabilește datele originale ale Postării
wp_reset_postdata();
Cod modificat conform răspunsului lui s_ha_dum:
<?php // Interogarea
if (is_tax() || is_category() || is_tag() ){
$qobj = $wp_query->get_queried_object();
// concatenează interogarea
$args = array(
'posts_per_page' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => $qobj->taxonomy,
'field' => 'id',
'terms' => $qobj->term_id
)
)
);
}
$random_query = new WP_Query( $args );
// Bucla
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post(); ?>
//Șablon HTML
<?php }
} else {
// nicio postare găsită
}
/* Restabilește datele originale ale Postării */
wp_reset_postdata(); ?>
Va trebui să obțineți obiectul interogat pentru pagină și să completați informațiile despre taxonomie în mod dinamic.
if (is_tax() || is_category() || is_tag() ){
$qobj = get_queried_object();
// var_dump($qobj); // doar pentru depanare
// concatenează interogarea
$args = array(
'posts_per_page' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => $qobj->taxonomy,
'field' => 'id',
'terms' => $qobj->term_id,
// utilizarea unui slug este de asemenea posibilă
// 'field' => 'slug',
// 'terms' => $qobj->name
)
)
);
$random_query = new WP_Query( $args );
// var_dump($random_query); // doar pentru depanare
if ($random_query->have_posts()) {
while ($random_query->have_posts()) {
$random_query->the_post();
// Afișează
}
}
}
Nu este clar dacă aveți nevoie de această Buclă în plus față de Bucla principală sau ca înlocuire a acesteia. Presupun că este "în plus", deoarece ar elimina efectiv funcționalitatea de arhivă dacă ar înlocui interogarea principală. Nu ați avea arhive reale, doar un post aleatoriu din arhivă, ceea ce nu este foarte prietenos de unul singur.
Puteți utiliza șabloanele de arhivă category.php
și tag.php
pentru a procesa etichetele și categoriile separat. Nu este necesar să folosiți archive.php
.
Referințe
http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
http://codex.wordpress.org/Function_Reference/get_queried_object

Mulțumesc! Codul este excelent dar afișează întregul "obiect" al taxonomiei curente (din cauza var_dump?). L-am modificat puțin pentru a scăpa de var_dump și funcționează bine fără a afișa "obiectul". Nu sunt sigur dacă următorul cod este corect din punct de vedere logic și vă rog să mă ajutați să-l verificați.

Da, un var_dump
este aproape întotdeauna folosit pentru depanare. L-am pus acolo ca să "vezi" cu ce ai de-a face. Ce "următor cod"?

Ups, nu pot adăuga cod în comentariu. Am adăugat codul modificat în întrebarea originală.

@Milo : Vrei ca interogarea să fie în interiorul condiționalului, precum și în Bucla care o folosește. Vezi modificarea. Greșeala mea.

Scuze, ar fi trebuit să fiu mai specific, am nevoie de această Buclă în plus față de Bucla principală. Fac un slider în partea de sus a paginii category.php pentru a afișa postarea cu cele mai multe vizualizări din categoria curentă care este vizualizată. link

Ai putea să te gândești să utilizezi interogarea principală cu un cârlig personalizat pre_get_posts
:
add_action( 'pre_get_posts', 'custom_pre_get_posts' );
function custom_pre_get_posts( $query ) {
if ( is_admin() or ! $query->is_main_query() )
return;
if ( is_archive() ) {
$query->set( 'orderby', 'rand' );
$query->set( 'posts_per_page', 1 );
}
}
și bucla obișnuită, în loc de WP_Query()
suplimentar.

Mulțumesc! pre_get_posts
este grozav dar modifică bucla principală și nu voi putea afișa postări pe paginile de arhivă. Dar chiar o idee bună pentru a atinge scopul într-un mod inteligent.
