Cum să afișezi postări din taxonomia curentă în pagina de arhivă?

8 iun. 2013, 18:44:20
Vizualizări: 15.4K
Voturi: 4

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

posts_per_page nu funcționează, returnează doar un singur articol.

Chozen Chozen
20 ian. 2015 23:06:21
Toate răspunsurile la întrebare 2
5
11

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

8 iun. 2013 19:43:47
Comentarii

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.

Milo Milo
8 iun. 2013 21:35:09

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

s_ha_dum s_ha_dum
8 iun. 2013 21:36:47

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

Milo Milo
8 iun. 2013 21:43:02

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

s_ha_dum s_ha_dum
8 iun. 2013 21:48:35

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

Chozen Chozen
21 ian. 2015 20:12:21
2

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.

8 iun. 2013 19:36:57
Comentarii

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.

Milo Milo
8 iun. 2013 21:14:02

ok, dacă ai nevoie de un WP_Query suplimentar ar trebui să verifici răspunsul frumos dat de @s_ha_dum mai jos.

birgire birgire
8 iun. 2013 21:40:16