サポート » 使い方全般 » 各タームの特定の記事を1件ずつ表示

  • 【現状】
    ポストタイプ名がmenu、タクソノミー名がmenucategory、termがそれぞれ10個ほどあります。Advance Custom Fieldsを使用しています。

    【実現したい事】
    アーカイブページに各タームから1つずつ記事をピックアップし、合計10の記事を表示させたい。

    functions.phpの記述

    function customize_menu_query($query) {
        if ( is_admin() || ! $query->is_main_query() )
            return;
    
        if ( $query->is_post_type_archive('menu') && $query->is_main_query() ) {
            $query->set( 'post_type', 'menu' );
            $query->set( 'posts_per_page', '1' );
            $tax_query[] = array(
                'taxonomy' => 'menucategory',
                'terms' => array('kani','obentou','drink','course','fugu','lunch','tanpin','kisetsu','niku','nabe'),
                'field' => 'slug',
                'operator' => 'IN');
            $query->set( 'tax_query', array('relation' => 'AND' , $tax_query) );
        }
    }
    add_action( 'pre_get_posts', 'customize_menu_query' );

    archive-menu.phpの記述

    <?php if(have_posts()): ?>
    <div class="foodbox">
    <?php while(have_posts()): the_post(); ?>
    <div class="fee">
    <h4><?php the_title(); ?></h4>
    <p><span>料金</span><?php the_field('price'); ?></p>
    <p><?php the_field('txt'); ?></p>
    </div>
    
    <?php
    $attachment_id = get_field('photo');
    $size = "custom_size"; //
    $image = wp_get_attachment_image_src( $attachment_id, $size );
    $attachment = get_post( get_field('photo') );
    $alt = get_post_meta($attachment->ID, '_wp_attachment_image_alt', true);
    $image_title = $attachment->post_title;
    ?>
    <img src="<?php echo $image[0]; ?>" width="<?php echo $image[1]; ?>" height="<?php echo $image[2]; ?>" alt="<?php the_title(); ?>" />
    <?php endwhile; ?>
    </div>
    <?php else: endif; ?>

    上記の方法だとポストタイプmenuの最新投稿が1件表示されるだけになってしまいます。
    各タームの特定の記事を表示したい場合、何処かにカスタムフィールドを追加し紐づけてピックアップすればいいのでしょうか?
    また、その際の記述はどのようにすればよろしいのでしょうか?
    アドバイスよろしくお願いします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • モデレーター jim912

    (@jim912)

    一番わかりやすい方法は、functions.php への記述は行わずに、archive-menu.php のテンプレートで実装してしまう方法かと思います。

    archive-menu.php では、get_terms でタームを取得し、foreach でタームをループ処理。(タームが10個固定で、追加・削除がないのであれば、固定の配列でも可)
    タームのループ内で、WP_Query もしくは、get_posts でタームの記事を1件取得し表示。

    となります。

    jim912さん

    早速のご回答ありがとうございます。
    アドバイス通りに下記を作成してみたところ上手く出力できました。

    <?php
        $taxonomy_name = 'menucategory';
        $taxonomys = get_terms($taxonomy_name);
        if(!is_wp_error($taxonomys) && count($taxonomys)):
            foreach($taxonomys as $taxonomy):
            $url = get_term_link($taxonomy->slug, $taxonomy_name);
            $tax_posts = get_posts(array(
                'post_type' => get_post_type(),
                'posts_per_page' => 1, // 表示させたい記事数
                'tax_query' => array(
                    array(
                        'taxonomy'=>'menucategory',
                        'terms'=>array( $taxonomy->slug ),
                        'field'=>'slug',
                        'include_children'=>true,
                        'operator'=>'IN'
                        ),
                    'relation' => 'AND'
                    )
                ));
        if($tax_posts):
    ?>
    
    <h3><?php echo($taxonomy->name); ?></h3>
    
    <?php foreach($tax_posts as $tax_post): setup_postdata($tax_post); ?>
    <div class="foodbox">
    <div class="fee">
    <h4><?php echo ($tax_post ->post_title); ?></h4>
    <p class="kakaku"><span>料 金</span><?php the_field('price'); ?></p>
    <p><?php the_field('txt', $tax_post->ID); ?></p>
    </div>
    
    <?php
    $attachment_id = get_field('img', $tax_post->ID);
    $size = "menu_single_thum"; // (thumbnail, medium, large, full or custom size)
    $image = wp_get_attachment_image_src( $attachment_id, $size );
    $attachment = get_post( get_field('img', $tax_post->ID) );
    $alt = get_post_meta($attachment->ID, '_wp_attachment_image_alt', true);
    $image_title = $attachment->post_title;
    ?>
    </div>
    <?php endforeach; ?>
    <?php
            endif;
    endforeach;
    endif;
    ?>

    この状態だと各タームの最新の投稿がそれぞれ出力されています。
    さらに特定の投稿を出力するにはカスタムフィールドを設置し、そこに入力された内容と紐づけて出力すればよろしいのでしょうか?

    重ね重ね申し訳ございません。
    よろしくお願いします。

    モデレーター jim912

    (@jim912)

    「特定の投稿」がどういう基準なのかがよくわかりませんが、管理画面でなんらかのチェックボックスにチェックしたものなどであれば、カスタムフィールドよりも、public を false に設定したタクソノミーを作成し、ピックアップなどのタームにチェックさせる方が、表示する際のパフォーマンスがよくなります。(特に記事数、カスタムフィールド数が多い場合)

    この条件で絞り込む場合は、tax_query に該当タクソノミーの配列を1つ追加してください。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「各タームの特定の記事を1件ずつ表示」には新たに返信することはできません。