サポート » テーマ » 各カテゴリのポストを新しいものから3件ずつメインインデックスに表示さ

  • 以前、こちらで教えていただいた手法を書き足して

    <?php
    $categories = get_categories('hide_empty=1&order=DESC');
    foreach ($categories as $category) :
    query_posts('showposts=1&cat='.$category->cat_ID);
    if (have_posts()) : the_post();
    ?>
    <?php echo get_category_link($category->cat_ID); ?><?php echo $category->name ?>
    <?php the_permalink(); ?><?php the_title(); ?>
    <?php the_permalink(); ?><?php dp_attachment_image($post->ID, 'thumbnail', 'alt="' . $post->post_title . '"'); ?>

    こののようなコードをメインインデックスページで利用しています。

    このコードでは、それぞれのカテゴリから最新1件分のポストタイトル・サムネール・パーマリンク・属しているカテゴリ名・そのカテゴリへのリンクを呼び出していますが、
    最新3件分のポストタイトル・サムネール・パーマリンクを呼び出したい場合には、どのようにコードを変更するとよいでしょうか?

    query_posts('showposts=1 ...
    の箇所を
    query_posts('showposts=3 ...
    と試しに変更してみましたが、特に変化が見られませんでした。

    また、呼び出した3件分のデータを
    HTML側で<ul><li> </li></ul>
    CSS側でul {display:inline;}あるいはul {float:left;}によって
    最新のポストから順に右へ向かって水平に並ぶように表示させたいと考えています。

    <li> </li>に囲まれた状態で固定ページへのパーマリンクを生成している
    <?php dp_list_pages; ?>と言うコードを見つけたので、このコードを応用すれば<li> </li>に囲まれた状態で3件分のデータを呼び出させそうに思うのですが、どのように書き換えれば先のコードと組み合わせたとき上手く動作しそうでしょうか?

    もし解決策に思い当たる方が居らっしゃいましたら、是非指南して頂ければ幸いです。

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

    (@jim912)

    smartdimpleさん、こんにちは。

    今さら聞けない WordPress で新着記事を表示する方法の決定版

    とご自分のコードを見較べてみて下さい。
    3件表示するには、当然ながら同じように書くか、3回繰り返す処理が必要になります。

    smartdimpleのコードと、上記のコードを較べて違うのは、

    while (have_posts()) :
    
    endwhile;

    が無いことですね。
    この部分が繰り返しの処理となり、複数の記事がある場合、その件数分だけ表示することになるのです。

    あとは、出力したいコードを考えて、whileの中、あるいは外に記述してあげればよいだけですね。

    ちなみに、dp_list_pagesというのは、私も知りませんでしたので検索したところ、どなたかが書いた、独自の関数名のようですね。WordPress本体以外に含まれていないものについては、具体的なコードか、紹介されているサイトへのリンクを提示いただけると助かります。

    トピック投稿者 smartdimple

    (@smartdimple)

    jim912さん、お時間を割いて下さってありがとうございます。

    早速
    ... query_posts('showposts=1&cat='.$category->cat_ID); ...
    ... query_posts('showposts=3&cat='.$category->cat_ID); ... へ。

    ... if (have_posts()) : the_post(); ?>
    ... if (have_posts()) : while (have_post()) : the_post(); ?> へ。

    <?php endif; endforeach; ?>
    <?php end while; endif; endforeach; ?> としてみました。

    複数のポストが存在するカテゴリから3件表示されるようになりました。
    やりたかったことの半分はこれで達成出来そうです。

    <?php dp_list_pages; ?>についてですが
    <?php wp_list_pages; ?>では
    <ul><li><a>(固定ページ)</a></li><li><a>(固定ページ)</a></li> ... </ul>
    とマークアップされた固定ページへのリンクリストが生成されるのに対して、
    <ul> ... </ul>セレクタを除いた固定ページへのリンクリストが生成されました。

    functions.php内に

    # Displays a list of pages
    function dp_list_pages() {
    	global $wpdb;
    	$querystr = "SELECT $wpdb->posts.ID, $wpdb->posts.post_title FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'page' ORDER BY $wpdb->posts.post_title ASC";
    	$pageposts = $wpdb->get_results($querystr, OBJECT);
    	if ($pageposts) {
    		foreach ($pageposts as $post) {
    			?><li><a href="<?php echo get_permalink($post->ID); ?>"><?php echo $post->post_title; ?></a></li><?php
    		}
    	}
    }

    という箇所があったので、jim912さんが予見された“独自関数”に当たるのではないかと思います。

    functions.php内の同じ並びに

    # Displays a list of categories
    function dp_list_categories($num=0, $exclude='') {
    	if (strlen($exclude)>0) $exclude = '&exclude=' . $exclude;
    	$categories = get_categories('hide_empty=1'.$exclude);
    	$first = true; $count = 0;
    	foreach ($categories as $category) {
    		if ($num>0) { $count++; if ($count>$num) break; } // limit
    		if ($category->parent<1) {
    			if ($first) { $first = false; $f = ' class="f"'; } else { $f = ''; }
    			?><li<?php echo $f; ?>>
    			<a href="<?php echo get_category_link($category->cat_ID); ?>"><?php echo $category->name ?><?php echo $raquo; ?></a></li>
    			<?php
    		}
    	}
    }

    という記述もあるため、
    <?php dp_list_categories; ?>と単純にテンプレートへ追加すれば
    <li><a>(カテゴリ)</a></li>という形で全カテゴリがリスト出力されそうです。

    でもdp_list_categoriesは使わず
    while ... endwhile 間のいずれかに

    [前略]
    <?php ... while (have_posts()) ... ?>
    <ul>
    <?php カテゴリ関連コード ?>
    <li><?php ポスト関連コード ?></li>
    </ul>
    <?php ... endwhile; ... ?>

    こんな形であらかじめ

    • を配置してしまえば
      3件分のポストデータをリスト化された状態で呼び出せるのかな?とも思えてきました。

    いま現在メインインデックスのポストループ周囲は

    <?php $categories = get_categories('hide_empty=1&order=DESC');
    foreach ($categories as $category) :
    query_posts('showposts=3&cat='.$category->cat_ID);
    if (have_posts()) : while (have_posts()) : the_post(); ?>
    
    <h2><a href="<?php echo get_category_link($category->cat_ID); ?>"><?php echo $category->name ?></a></h2>
    <div class="post">
    	<div class="thumb"><a href="<?php the_permalink(); ?>"><?php dp_attachment_image($post->ID, 'thumbnail', 'alt="' . $post->post_title . '"'); ?></a></div>
    	<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    	<p><?php echo dp_clean($post->post_content, 300); ?></p>
    	<a href="<?php the_permalink(); ?>" class="readmore">つづきを読む</a>
    </div>
    
    <?php endwhile; endif; endforeach; ?>

    となっています。

    【※】
    これらのコードが書かれているのは、WP Theme Designerさんが配布されている“MEGANEWS”と言うマガジンスタイルのWPテーマです。
    今となってはちょっと古めな2009年製WPテーマですが、各カテゴリの最新のポストからタイトル・サムネール・抜粋・パーマリンクを呼び出し、ポストが投稿された日時順でメインインデックスに並べてくれるWPテーマなので重宝しています。
    ※同様の機能をもっとスマートに実現している・より新しいWPテーマがもしあれば、そういったWPテーマも試してみたいとは思っているのですが…

    以上を踏まえた上で、引き続き御指南・お付き合い頂ければ幸いです。

    トピック投稿者 smartdimple

    (@smartdimple)

    【訂正】

    ごめんなさい。
    逆クオートを加えそこねたため

    こんな形であらかじめ


    ・を配置してしまえば

    という箇所は

    こんな形であらかじめ
    <ul>と<li>を配置してしまえば

    と記入してあります。

    トピック投稿者 smartdimple

    (@smartdimple)

    <?php $categories = get_categories('hide_empty=1&order=DESC');
    foreach ($categories as $category) :
    query_posts('showposts=3&cat='.$category->cat_ID);
    if (have_posts()) : ?>
    
    <h2><a href="<?php echo get_category_link($category->cat_ID); ?>"><?php echo $category->name ?></a></h2>
    <?php while (have_posts()) : the_post(); ?>
    <div class="post">
    	<div class="thumb">
    		<a href="<?php the_permalink(); ?>"><?php dp_attachment_image($post->ID, 'thumbnail', 'alt="' . $post->post_title . '"'); ?></a>
    	</div>
    	<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    	<p><?php echo dp_clean($post->post_content, 300); ?></p>
    	<a href="<?php the_permalink(); ?>" class="readmore">つづきを読む</a>
    </div>
    <?php endwhile; ?>
    
    <?php endif; endforeach; ?>

    このように<?php while (have_posts()) : the_post(); ?><?php endwhile; ?>をループさせたい箇所に配置しなおしたところ、ほぼ目的の通りに出力されるようになりました。
    showposts=3と指定してあるものの、どのカテゴリからも最新の1件目を抜かしたが2件目と3件目のポスト2件しか表示されなくなってしまいました。
    jim912さん含め、この現象について改善策に思い当たる方が居られましたら、教えて頂けれると助かります。

    モデレーター jim912

    (@jim912)

    smartdimpleさん、こんにちは。

    呈示いただいたコードから、独自関数部分を割愛したコードをTwenty Tenで試したところ、特に1件目が抜けるということもなく動作するようです。

    いただいている情報以外に原因がありそうな気がしますがいかがでしょう。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「各カテゴリのポストを新しいものから3件ずつメインインデックスに表示さ」には新たに返信することはできません。