サポート » 使い方全般 » メディア画像の表示をforループで表現したい

  • 解決済 atsushi312

    (@atsushi312)


    制作目標は、
    タクソノミーでカテゴリ分けされたメディアの最新画像を1枚表示し、
    それらをカテゴリの更新順に並べ替えることです。
    (参照:WPでカテゴリを投稿の新しい順に並べ替える

    一般的にメディア画像一覧表示などにはforeachループを使うようですが、
    今回「カテゴリ別」「更新順」という条件があるためforループで表現したいです。
    しかし下記のコードではうまくいかずとても困っています。

    問題点を探るため、一度forループを外してprint_rでひとつずつ要素を調べた所
    10行目のget_posts関数で値をまったく取得できていないようなのです。
    原因がつかめず、他の関数を当てはめようにもわからない状況です。
    どうか解決策やヒントだけでもご助力いただけませんでしょうか。

    <!--function.php-->
    <?php  //更新順・カテゴリー別アタッチメント表示方法
    function get_taxs_and_sort() {
        $taxs = get_terms( 'attachment_category', 'get=all' );	// 特定のタクソノミーにあるカテゴリをすべて読み込む
        $count = count($taxs);					// カテゴリの数を得る
        for ($i = 0; $i < $count; $i++) {				// カテゴリの数だけ繰り返す
    
            // 各カテゴリの最も新しい投稿を読み込む
            $where = array('attachment_category' => $taxs[$i]->term_id, 'orderby' => 'post_date',
    			'post_type' => 'attachment', 'order' => 'desc', 'numberposts' => 1);
            $newest_atms = get_posts($where); //■ここが機能しない■
    
            // カテゴリのオブジェクトに「newest_atm」というメンバを追加して、最新の投稿を代入する
            $taxs[$i]->newest_atm = $newest_atms[0];
        }
        	// カテゴリを、最新の投稿の日付が新しい順に並べ替える
        	usort($taxs, 'sort_by_postdate');
        	// 結果を返す
        	return $taxs;
    }
    
    function sort_by_postdate($a, $b) {
        // 2つのカテゴリの最新の投稿(newest_atmメンバ)の日付の大小関係を返す
        return ($a->newest_atm->post_date == $b->newest_atm->post_date) ? 0 :
               ($a->newest_atm->post_date < $b->newest_atm->post_date) ? 1 : -1;
    }
    ?>

    念のため、カスタム固定ページテンプレートのコードも載せておきます。

    <?php
    $taxs = get_taxs_and_sort();	// カテゴリーと各カテゴリーの最新投稿を取得
    $count = count($taxs);		// カテゴリの数を得る
    for($i=0; $i<$count; $i++) :	// カテゴリの数だけ繰り返す
    ?>
    
    <li class="photo-list">
    	<?php 	//最新の投稿に関する情報を準備しておく
    	 	$post = $taxs[$i]->newest_atm; setup_postdata($post);
    		//最新の投稿画像を呼び出せるようにしておく
    		$img = wp_get_attachment_image_src( $newest_atms[$i]->ID, '' );
    	 ?>
    
    	<!--メインコンテンツ-->
    	<?php echo $taxs[$i]->name ?>(<?php echo get_the_date(); ?>)<br />
    	<?php the_title(); ?>(<?php echo get_the_date(); ?>)<br />
    	<?php 	echo '<a href="' . $img[0] . '">';
    		echo wp_get_attachment_image( $newest_posts[0]->ID, 'thumbnail' );;
    		echo '</a>';
    	 ?>
    </li>
    
    <?php endfor; ?>

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

    (@jim912)

    タクソノミー名で指定する方法は、3.1より非推奨となっていますので、tax_query を使用してください。

    'tax_query' => array( array( 'taxonomy' => 'attachment_category', 'field' => 'term_id', 'terms' => $taxs[$i]->term_id ) )

    返信遅くなりましてすみません。
    jim912さんのアドバイスのおかげで解決しました!!

    本当にありがとうございました!
     

    保存用に書き換えたコード残しておきます。

    $where = array( 'orderby' => 'post_date', 'post_type' => 'attachment', 'order' => 'desc',
    			 'numberposts' => 1, 'tax_query' => array( array( 'taxonomy' => 'attachment_category',
    			 'field' => 'term_id', 'terms' => $taxs[$i]->term_id )) );
            $newest_atms = get_posts($where);

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「メディア画像の表示をforループで表現したい」には新たに返信することはできません。