Come visualizzare post dalla tassonomia corrente nella pagina archivio?
Sto utilizzando il seguente codice per visualizzare un post casuale dalla categoria corrente nella pagina archivio delle categorie (usando archive.php). Tuttavia, quando mi trovo nelle pagine archivio di Tag o Tassonomie, il post non viene visualizzato correttamente dalla Tag o Tassonomia corrente (a causa della limitazione alle sole categorie). Come posso modificarlo per farlo funzionare con Tag e Tassonomie (o solo Tassonomie dato che Categorie e Tag sono comunque Tassonomie)? Grazie!
// assegna la variabile come categoria corrente
$currentcategory = $cat;
// concatena la query
$args = 'showposts=1&cat=' . $currentcategory . '&orderby=rand';
$random_query = new WP_Query( $args );
// Il Loop
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post();
// template personalizzato per il post casuale
}
} else {
// nessun post trovato
}
// Ripristina i dati originali del Post
wp_reset_postdata();
Codice modificato in base alla risposta di s_ha_dum:
<?php // La Query
if (is_tax() || is_category() || is_tag() ){
$qobj = $wp_query->get_queried_object();
// concatena la query
$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 );
// Il Loop
if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post(); ?>
//HTML template
<?php }
} else {
// nessun post trovato
}
/* Ripristina i dati originali del Post */
wp_reset_postdata(); ?>

Dovrai recuperare l'oggetto interrogato per la pagina e inserire dinamicamente le informazioni sulla tassonomia.
if (is_tax() || is_category() || is_tag() ){
$qobj = get_queried_object();
// var_dump($qobj); // solo per debug
// concatena la query
$args = array(
'posts_per_page' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => $qobj->taxonomy,
'field' => 'id',
'terms' => $qobj->term_id,
// è possibile utilizzare anche uno slug
// 'field' => 'slug',
// 'terms' => $qobj->name
)
)
);
$random_query = new WP_Query( $args );
// var_dump($random_query); // solo per debug
if ($random_query->have_posts()) {
while ($random_query->have_posts()) {
$random_query->the_post();
// Visualizza
}
}
}
Non è chiaro se hai bisogno di questo Loop in aggiunta a il Loop principale o come sostituto di esso. Presumo che sia "in aggiunta" poiché rimuoverebbe effettivamente la funzionalità di archivio se dovesse sostituire la query principale. Non avresti archivi reali, solo un post casuale dall'archivio che non è molto utile da solo.
Potresti utilizzare i template di archivio category.php
e tag.php
per elaborare tag e categorie separatamente. Non è necessario utilizzare archive.php
.
Riferimenti
http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
http://codex.wordpress.org/Function_Reference/get_queried_object

Grazie! Il codice è fantastico ma mostra l'intero "oggetto" della tassonomia corrente (a causa di var_dump?). L'ho modificato un po' per eliminare var_dump e ora funziona bene senza mostrare l'"oggetto". Non sono sicuro se il seguente codice sia corretto nella logica e per favore aiutami a verificarlo.

Sì, un var_dump
è quasi sempre usato per debug. L'ho inserito lì così potevi "vedere" con cosa hai a che fare. Quale "codice seguente"?

Ops, non posso aggiungere codice nei commenti. Ho aggiunto il codice modificato nella domanda originale.

@Milo: Vuoi che quella query sia all'interno del condizionale così come il Loop che la utilizza. Vedi la modifica. Colpa mia.

Scusa, avrei dovuto essere più specifico, ho bisogno di questo Loop in aggiunta al Loop principale. Sto realizzando uno slider nella parte superiore della pagina category.php per mostrare i post più visualizzati della categoria corrente che viene visualizzata. link

Potresti considerare l'utilizzo della query principale con un hook personalizzato 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 );
}
}
e il classico loop, invece di un'ulteriore WP_Query()
.

Grazie! pre_get_posts
è ottimo ma modifica il loop principale e non sarò in grado di visualizzare i post nelle pagine archivio. Ma davvero un'ottima idea per raggiungere l'obiettivo in modo intelligente.
