全記事を表示させた上で、さらに特定カテゴリの記事を表示
-
質問失礼いたします◎
今ブログでWordPress ver2.6を利用中です。
通常通り時系列順に記事を表示しているのですが、
さらに追加として特定カテゴリの記事を3件追加しようと思っています。
こういう感じです↓↓
(特定カテゴリの記事(時系列順))
・[Title]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)](以下は、通常のブログの表示)
・ ~~
・ ~~
・ ~~http://imai.studiobrain.net/2007/09/21/132
を試してみたんですが、ちょっとうまくいきませんでした。。。
よろしくお願いします!
-
ちなみに、表示させたいのはTOPページ(index.php)だけです◎
自分でもいろいろ試行錯誤はしているのですが、どうもうまくいきません。。。
<div class=”specialcategory”>
<?php
$posts = get_posts(‘numberposts=3&category=36’);
global $post;
?>
<?php
if($posts): foreach($posts as $post): setup_postdata($post); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”entry”>
<h2>” rel=”bookmark” title=”Permanent Link to <?php the_title(); ?>”><?php the_title(); ?></h2>
<div class=”post-content”>
<?php the_content(‘Read More »’); ?>
</div>
</div>
</div>
<?php endforeach; endif;?>
</div>↑↑を打ち込んだのですが、失敗しました。。。
上記セクションの冒頭に
<?php $myquery = $wp_query; ?>最後に
<?php $wp_query = $myquery; ?>と入れてみるとどうでしょう?
通常のクエリを$myqueryに一旦退避させて、特定カテゴリ記事の表示後、元に戻す方法です。>dxd5001さん
アドバイスありがとうございます。 やってみましたが・・・ん~やっぱり厳しいですね。
特定カテゴリの記事3件は表示されるのですが、
下に位置しなければならない通常のブログ記事が、
その特定カテゴリの記事3件に置き換わって表示されなくなってしまいます(下図のような感じです)。・[Title 01]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 02]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 03]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)](以下は本来なら通常の全カテゴリ対応のブログ記事)
・[Title 01]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 02]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 03]
[記事の始めの部分(記事の抜粋:<!–more–>の上部分)]
・
・
・・
どうにかならないでしょうか???
ソースを検討していないので、正確ではありませんが、現象から見ると、
ドキュメントには、通常のループとget_posts()とは別クエリーと記述されていますが、
実際には同じクエリーで置き換わってしまいます。
$postsという変数も、システム全体で使われるグローバルのようです。
どうも$postsがくせものなのではと考えました。そこで、ものは試しと思い、最初のループでは、別の変数名を使い
<?php $posts_new = get_posts('xxxxxx'); foreach( $posts_new as $post ) : setup_postdata($posts); ?> <!--Do something--> <?php endforeach; ?>
次のループではget_posts()ではなく、通常のループを使用します。
<?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?>
....
私のところでは、これでうまく表示できています。
なお、最初のループには一応おまじない(dxd5001さんの書かれたもの)を入れています。>turbbitさん
ということは、私がindex.phpに施せば良いのは、入れたい箇所の所で<?php $myquery = $wp_query; ?>
<?php $posts_new = get_posts(‘xxxxxx’);
foreach( $posts_new as $post ) :
setup_postdata($posts); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”entry”>
<h2>” rel=”bookmark” title=”Permanent Link to <?php the_title(); ?>”><?php the_title(); ?></h2>
<div class=”post-content”>
<?php the_content(‘Read More »’); ?>
</div>
</div>
</div>
<?php endforeach; ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php $wp_query = $myquery; ?>を入力すれば良いのでしょうか?
ちょっと混乱してきました。。。(^^;
できれば分かりやすくコレをindex.phpに挿入すべし!というコードを教えて頂きたいです。
わがままで申し訳ないです。。。あまり変わりないのですが、一応、これで表示できるというコードを書いてみました。
<!-- クエリを待避しておく --> <?php $myquery = $wp_query; ?> <!-- 条件に合わせた投稿を得る --> <?php $posts_new = get_posts('numberposts=3&category=36'); <!-- 上記で得た投稿の各々について処理する --> foreach( $posts_new as $post ) : setup_postdata($post); ?> <div class="post" id="post-<?php the_ID(); ?>"> <div class="entry"> <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Permanent Link to %s', 'kubrick'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h2> <div class="post-content"> <?php the_content('Read More ≫'); ?> </div> </div> </div> <?php endforeach; ?> <!-- 最初のループ終了 --> <!-- 待避したクエリを戻す --> <?php $wp_query = $myquery; ?> <!-- メインループ --> <?php if (have_posts()) : ?> <?php while (have_posts()) : the_post(); ?> <div class="post" id="post-<?php the_ID(); ?>"> <div class="entry"> <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php printf(__('Permanent Link to %s', 'kubrick'), the_title_attribute('echo=0')); ?>"><?php the_title(); ?></a></h2> <div class="post-content"> <?php the_content('Read More ≫'); ?> </div> </div> </div> <?php endwhile; ?> <!-- 前後ページへのリンク --> <div class = "navigation"> <?php posts_nav_link(' | ', '« 前のページへ', '次のページへ »'); ?> </div> <?php else : ?> <p>お探しの記事は見つかりません</p> <?php endif; ?>
最初のループ、つまりカテゴリID36の記事を3件表示するループではget_posts()を
使っています。
メインのループ、つまり全記事の表示では、通常のループを使っています。クエリの待避については誤解されているようですので、ご注意ください。
最初のクエリ(numberposts=3&category=36)を行なう前後に待避、復帰を入れます。お試しください。
>turbbitさん
丁寧なご回答ありがとうございます!!
これを貼っつけてみたんですが、Parse errorが表示されてしまいまして。。。
どうやら貼り付けたコードの周りのループと関係があるのではないかと思いまして、
念のため、こちらにindex.phpのコード全部載せてみます。
面倒くさいかもしれませんが、お読み頂ければ非常に助かります。index.php
<?php get_header(); ?>
<div id=”content”>
<?php if(is_home()) : ?>
<div class=”content-explanation”>
<img src=”<?php bloginfo(‘wpurl’); ?>/img/xxxxx.png” alt=”xxxxx” />
</div><!–ここに特定カテゴリの記事3件分を表示させたい!–>
<!–ブログタイトル画像配置開始–><div class=”latest-news”>
<p><img src=”img/xxxxx.png” alt=”xxxxx” /></p>
</div><!–ブログタイトル画像配置終了><?php endif; ?>
<?php if(is_category()) : ?>
<div class=”latest-news”>
<p><?php single_cat_title(); ?>のニュース</p>
</div><?php endif; ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<div class=”post” id=”post-<?php the_ID(); ?>”>
<div class=”entry”>
<h2>” rel=”bookmark” title=”Permanent Link to <?php the_title(); ?>”><?php the_title(); ?></h2>
<span class=”post-calendar”><?php the_time(‘Y/n/d’) ?></span>
<div class=”post-content”>
<?php the_content(‘Read More »’); ?>
</div>
</div>
</div><?php endwhile; ?>
<div class=”navigation”>
<span class=”navigation-b”></span><?php if(function_exists(‘wp_pagenavi’)) { wp_pagenavi(); } ?>
</div><?php else : ?>
<h2 class=”center”>Not Found</h2>
<p class=”center”>Sorry, but you are looking for something that isn’t here.</p><?php endif; ?>
<!–ナビゲーションリンク開始–><div class=”tablenav”>
<?php echo paginate_links( array(
‘base’ => trailingslashit(get_pagenum_link(1)) . ‘%_%’,
‘format’ => user_trailingslashit(‘page/%#%/’, ‘paged’),
‘total’ => $wp_query->max_num_pages,
‘mid_size’ => 3,
‘current’ => ($paged ? $paged : 1),
)); ?>
</div><!–ナビゲーションリンク終了–></div><!–/content –>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
<!--ここに特定カテゴリの記事3件分を表示させたい!-->
の部分に、次のコードを置きます。
(コードのみなので、divやスタイルは、ご自分でお願いしますね)<!-- クエリを待避しておく --> <?php $myquery = $wp_query; ?> <!-- 条件に合わせた投稿を得る --> <?php $posts_new = get_posts('numberposts=3&category=36'); <!-- 上記で得た投稿の各々について処理する --> foreach( $posts_new as $post ) : setup_postdata($post); ?> <div class="post" id="post-<?php the_ID(); ?>"> <div class="entry"> <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2> <div class="post-content"> <?php the_content('Read More ≫'); ?> </div> </div> </div> <?php endforeach; ?> <!-- 最初のループ終了 -->
なお、メインループの中の次の部分が間違っています。
(その前の投稿からですが)
<h2>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></h2>
ここは、最初のループでも使っていますが、構造を整理して表示すると、
<h2> <a href = "<?php the_permalink() ?>" rel = "bookmark" title = "Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?> </a> </h2>
となっているはずです。
どちらかからコピーされる際、最初のthe_permalink の部分が抜け落ちて、
" rel =
のように残ってしまっているように見えます。当方で試してありますので、
上記のようにして、パースエラーが出るのなら、エラーはindex.php ではなく、
ヘッダなど他の部分にエラーがあると考えられます。お試しください。
何度か試したのですがうまくいかなかったので、
foreach( $posts_new as $post ) :
setup_postdata($post); ?>
で、$postがどこか別のところで使われている可能性があると思いましたので、
$postを$post_newsにしてみると、3件表示がうまくいきました。<!-- 条件に合わせた投稿を得る --> <?php $posts_new = get_posts('numberposts=3&category=32'); foreach( $posts_new as $post_news ) : setup_postdata($post_news); ?> <div class="post" id="post-<?php the_ID(); ?>"> <div class="entry"> <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"> <?php the_title(); ?> </a></h2> <div class="post-content"> <?php the_content('Read More ≫'); ?> </div> </div> </div> <?php endforeach; ?> <!-- 最初のループ終了 -->
3件表示はされたのですが、その3件が、
・[Title ex01]
[記事ex01(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title ex02]
[記事ex02(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title ex03]
[記事ex03(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]になるはずが、
・[Title 01]
[記事ex01(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 01]
[記事ex02(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 01]
[記事ex03(特定カテゴリ)の始めの部分(記事の抜粋:<!–more–>の上部分)]・[Title 01]
[記事01の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 02]
[記事02の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 03]
[記事03の始めの部分(記事の抜粋:<!–more–>の上部分)]
・[Title 04]
…
…
…というように、記事抜粋部分はきちんと3件それぞれ表示されているのですが、
特定カテゴリの記事タイトルが3件とも、
下部の通常ブログ記事の最新記事タイトルと同じになってしまいました。。。(^^;
ソース見る限りは何ともないと思ったのですが。。。何度か試したのですがうまくいかなかったので、
foreach( $posts_new as $post ) :
setup_postdata($post); ?>
で、$postがどこか別のところで使われている可能性があると思いましたので、the_title()
などは $post というグローバル変数の内容を出すことが前提なので、この名前を変えてしまうとうまく動かないかもしれません。逆に、$post をグローバル宣言してやる必要がありそうです。あと、$posts の名称変更をするなら、$wp_query の待避はなくても OK かもしれません (やった方が無難ではありますが)。手元のテストでは、
<dl> <?php global $post; $preamble = get_posts('numberposts=3&category=1'); foreach($preamble as $post) : setup_postdata($post); ?> <dt><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dt> <dd><?php the_excerpt(); ?></dd> <?php endforeach; ?> </dl>
とやればうまく動いています。
>lilyfanさん
毎度お世話になってます◎
おお!このソースだと周りに影響を及ぼさず、きちんと表示されます!!
WordPressは奥が深いなあ。。。
ありがとうございました!
- トピック「全記事を表示させた上で、さらに特定カテゴリの記事を表示」には新たに返信することはできません。