Come visualizzare post dalla tassonomia corrente nella pagina archivio?

8 giu 2013, 18:44:20
Visualizzazioni: 15.4K
Voti: 4

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(); ?>
1
Commenti

posts_per_page non funziona, restituisce solo un post.

Chozen Chozen
20 gen 2015 23:06:21
Tutte le risposte alla domanda 2
5
11

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

8 giu 2013 19:43:47
Commenti

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.

Milo Milo
8 giu 2013 21:35:09

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

s_ha_dum s_ha_dum
8 giu 2013 21:36:47

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

Milo Milo
8 giu 2013 21:43:02

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

s_ha_dum s_ha_dum
8 giu 2013 21:48:35

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

Chozen Chozen
21 gen 2015 20:12:21
2

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

8 giu 2013 19:36:57
Commenti

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.

Milo Milo
8 giu 2013 21:14:02

Ok, se hai bisogno del WP_Query aggiuntivo dovresti dare un'occhiata alla bella risposta fornita da @s_ha_dum qui sotto.

birgire birgire
8 giu 2013 21:40:16