Como exibir a postagem da taxonomia atual na página do arquivo?

2

Estou usando o seguinte código para exibir uma postagem aleatória da categoria atual na página de arquivo da categoria (usando archive.php). No entanto, quando em páginas de arquivo de tag ou taxonomia, a postagem não é exibida corretamente da tag ou taxonomia atual (devido à limitação de categoria apenas). Como posso modificar para que funcione com Tag e Taxonomia (ou apenas Taxonomia, já que Category e Tag são também Taxonomias). Obrigado!

// assign the variable as current category
$currentcategory = $cat;

// concatenate the query
$args = 'showposts=1&cat=' . $currentcategory . '&orderby=rand';

$random_query = new WP_Query( $args );

// The Loop

if ( $random_query->have_posts() ) {
while ( $random_query->have_posts() ) {
$random_query->the_post();

// custom template for the random post

}

} else {

// no posts found

}

// Restore original Post Data
wp_reset_postdata();

Código editado em relação à resposta de s_ha_dum:

<?php // The Query

if (is_tax() || is_category() || is_tag() ){
    $qobj = $wp_query->get_queried_object();

// concatenate the 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 );

// The Loop
if ( $random_query->have_posts() ) {
    while ( $random_query->have_posts() ) {
        $random_query->the_post(); ?>

//HTML tempalte

<?php   }
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata(); ?>
    
por Milo 08.06.2013 / 17:44

2 respostas

7

Você precisará capturar o objeto consultado para a página e preencher suas informações de taxonomia dinamicamente.

if (is_tax() || is_category() || is_tag() ){
    $qobj = get_queried_object();
    // var_dump($qobj); // debugging only

    // concatenate the query
    $args = array(
      'posts_per_page' => 1,
      'orderby' => 'rand',
      'tax_query' => array(
        array(
          'taxonomy' => $qobj->taxonomy,
          'field' => 'id',
          'terms' => $qobj->term_id,
    //    using a slug is also possible
    //    'field' => 'slug', 
    //    'terms' => $qobj->name
        )
      )
    );

    $random_query = new WP_Query( $args );
    // var_dump($random_query); // debugging only

    if ($random_query->have_posts()) {
        while ($random_query->have_posts()) {
          $random_query->the_post();
          // Display
        }
    }
} 

Não está claro se você precisa deste Loop além do Loop principal ou como um substituto para ele. Eu sou supor que isso é "além disso", pois seria efetivamente remover a funcionalidade de arquivamento se fosse para substituir a consulta principal. Você não tem arquivos reais, apenas um post aleatório do arquivo que não é muito amigável por si só.

Você pode usar os modelos de arquivo category.php e tag.php para processar tags e categorias separadamente. Você não precisa usar archive.php .

Referência

enlace
enlace

    
por s_ha_dum 08.06.2013 / 18:43
1

Você pode considerar o uso da consulta principal com um pre_get_posts hook personalizado:

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 o loop usual, em vez do adicional WP_Query() .

    
por birgire 08.06.2013 / 18:36