web-dev-qa-db-ja.com

現在の分類からの投稿をアーカイブページに表示するにはどうすればいいですか?

次のコードを使用して、カテゴリアーカイブページの現在のカテゴリからのランダムな投稿を表示します(archive.phpを使用)。ただし、タグまたは分類のアーカイブページでは、現在のタグまたは分類から投稿が正しく表示されません(カテゴリの制限により)。 TagとTaxonomy(またはCategoryとTagもTaxonomiesなので、Taxonomy)だけで動作するように変更するにはどうすればよいですか。ありがとうございます。

// 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();

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(); ?>
2
Milo

あなたはページのために質問されたオブジェクトをつかみ、動的にあなたの分類法の情報を記入する必要があるでしょう。

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
        }
    }
} 

あなたがこのLoop に加えて _を必要としているのか、それともその代替として必要なのかは明確ではありません。メインクエリに代わるものであれば、アーカイブ機能が事実上削除されるため、これは「追加」であると思います。あなたは本当のアーカイブを持っていない、アーカイブからのランダムな投稿だけを持っていて、それだけではとてもフレンドリーではありません。

category.phptag.phpアーカイブテンプレートを使ってタグとカテゴリを別々に処理することができます。 archive.phpを使う必要はありません。

参照

http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
http://codex.wordpress.org/Function_Reference/get_queried_object

7
s_ha_dum

あなたはカスタムの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 );
    }

}

追加のWP_Query()ではなく、通常のループです。

1
birgire