まず、貼っていただいたコードが変換されてしまって読めなくなってしまっているので
Codeタグを使ってもう一度貼っていただくか、長いコードの場合は「ペーストピン」というのを使ってください。
詳しいルールはこちらに書いてありますので、こちらをお読みになってそれに沿っていただくとバッチリかと思います( ・∀・)b
↓
http://ja.forums.wordpress.org/topic/11?replies=3
——-
今回書いてもらったものではquery_postsを使っているんですが、
この関数はなかなか初心者さんには使いこなすのが手強い関数です。
さらにexplodeとか出てくるので、かなりややこしいことになっております。
まずはどういう表示を実現したいのか、整理していきましょう。
少々時間がかかるかもしれませんがお付き合いください。
特定のカテゴリーとタグで絞り込んだ記事を、10件以上(または全部)表示したい
1.10件だけ表示させて完了でいいのか?10件でページ送りしたいのか?それとも全部表示したいのか?
それによって使う関数が若干変わってきますので、まずどっちかに決めましょう。
2.「特定のカテゴリーとタグで絞り込んだ」っていうのだとわかりづらいので具体的に書いてみますと
たとえば「日記(diary)」っていうカテゴリーの中に属していて、かつ「旅行」っていうタグの付いた記事だけをまとめて表示したい。
こんな感じのご要望で問題ないでしょうか?
3.で、絞り込んだものをどこに表示させたいのでしょうか。(ここ重要)
固定ページなのか、サイドバーなのか、トップページなのか、、、、
それによって考えるべきことがちょっと変わってきます。
4.ちなみに、貼ってもらった記述は、今お使いのテーマのどのファイルに書いていますか?
index.php?page.php?それとも??
—–
まずはここまで整理をお願いします。
コードの貼り直しもおねがいしますね。
トピック投稿者
F_K
(@f_k)
mypacecreatorさま、ご示唆いただきありがとうございます。ものすごく言葉足らずですみません。
ええとまず、1〜4の回答として、現状とやりたいことを順序がばらばらですが記します。
3、4->静的ページにrequireを使って、wordpressの中身を表示させております。htmlをphpにすれば、wordpressの記述がそのまま使えるということでしたので・・・
http://ドメイン.jp/wordpress/
と、サイトの中の一部にwordpressがあって、wordpressの外のphpファイルに記述しています。
2->そうです、具体的にいいますと「東京」カテゴリーに属し、かつ「アート」と「芝居」というタグが付いている記事を抜き出して表示したいのです。
それでこれまで、下記のような記述で一応成功していましたが、表示は5件まででした。
<?php require_once "../wordpress/wp-load.php" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
...
<?php
$cat_id = 5; //東京カテゴリー
$include_cats = explode( '/', $cat_id . get_category_children( $cat_id ) );
$args = array(
'category__in' => $include_cats,
'tag_slug__in' => array( 'a', 'b' ) //aアート、b芝居タグ
);
?>
<ul>
<?php
query_posts($args);
if(have_posts()) :
while(have_posts()) :
the_post();
?>
<?php echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a><em>(' . get_the_date('Y年m月d日') . ')</em></li>'; ?>
<?php endwhile; ?>
</ul>
<?php endif; wp_reset_query(); ?>
1->
5件というのは、wordpressの設定で最大投稿数を5件にしているからのようです。
wordpress内のアーカイブページなんかは5件でページ送りしておりここはこれでいいのですが、上記のrequireしているページはもっと多く表示したいのです。ページ送りはしなくていいです。
もっといいますと、
「東京」の「アート、芝居」一覧
「神奈川」の「アート、芝居」一覧
をつくりたいです。
こまかくてすみません、これでわかりますでしょうか?やはり素人には無謀なことでしょうか?
なるほどなるほど。つまりサイトのトップページに表示するわけですね。
ページ送りはナシでよいということなので、方向性は決まりました。
まずquery_postsを使うのをやめましょう。忘れましょう。
多分参考にされた記事が、ややこしいやり方をとっていたか、情報が古いのかなと思います。
あなたが使うべきはget_postsです。
説明の便宜上、手前味噌で恐縮ですが自分の書いたブログ記事を紹介させてください。
これに沿って説明します。
http://mypacecreator.net/blog/archives/1981
ここでご紹介している「基本となる書き方」で、
//ここに取得条件を色々書く の部分を以下のようにすればいけるはずです。
$newslist = get_posts( array(
'category_name' => 'tokyo', //特定のカテゴリースラッグを指定
'tag_slug__and' => array('アート', '芝居' ), //特定のタグスラッグを指定
'posts_per_page' => -1 //取得記事件数を全件に
));
神奈川の時はcategory_nameをkanagawaに変えてください。
上記はあとから見た時にわかりやすくするため、カテゴリーIDじゃなくてスラッグで指定できるように書いてます。
mypacecreator さん、
神奈川の時はcategory_nameをkanagawaに変えてください。
F_K さんは、1度ずつ表示するのではなくて、両方を一気に表示したいように読めるのですが… そうすると、
'category_name' => 'tokyo,kanagawa'
のように 2 つを指定すれば、OR 結合で、「東京」と「神奈川」両方のカテゴリが検索にかかるので、「変える」というよりも、「追加する」でいいのではないでしょうか。それから、タグの方は、「アート」タグがついた投稿と、「芝居」タグがついた投稿の両方を取得したい、というように読めるのですが、そうすると、tag_slug__and ではなくて、
'tag_slug__in' => array('アート', '芝居')
でないと、「アート」タグだけの投稿、「芝居」タグだけの投稿が除外されちゃいませんか? F_K さんがご自分で作られたパラメータ指定で、5件意図どおりの出力だったということは、たぶんそうではないかなぁ、と思うのですが… 間違えたら、ごめんなさい。
トピック投稿者
F_K
(@f_k)
mypacecreatorさま、できました、ありがとうございます!
すごい!
<?php
$newslist = get_posts( array(
'category_name' => 'tokyo', //東京カテゴリー
'tag_slug__in' => array('a', 'b' ), //aアート・b芝居
'posts_per_page' => -1 //全部表示
));
foreach( $newslist as $post ):
setup_postdata( $post );
?>
<?php echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a><em>(' . get_the_date('Y年m月d日') . ')</em></li>'; ?>
<?php
endforeach;
wp_reset_postdata();
?>
このサボテンさんのサイト、よく検索でヒットし勉強させていただいてました。
本物にお会いできて?光栄です。
そういえば query_postsより get_postsを使えとどこかでも書いてあった気が・・・
でもarray()の中の条件が書けず(T T;)ぎりぎり似た希望に合った記述をそのままパクってきてました。
これでつながりました!こうやって書くと、とてもシンプルでわかりやすいですね!
http://mypacecreator.net/blog/archives/1981
こちらも興味深く読みました。古いコードをコピペして使ってしまう…はい、反省します…
質問といえば大したことではありませんが、the_time(‘Y年n月j日’)だと日にちが表示されなくてget_the_date(‘Y年m月d日’)だったのですがなぜでしょう?
あと、
kjmtshさま、その通りです、 tag_slug__inにしました。andだとやはり表示されませんでした。ありがとうございます。
東京、神奈川については「両方を一気に」でなく一つ一つでよかったです。
細かく言いますと、今現状で
「東京のアート、芝居」5件/「神奈川のアート、芝居」5件/「埼玉の」…
という親ページがあるので、そこからそれぞれリンクして
・「東京のアート、芝居」全一覧ページ
・「神奈川のアート、芝居」全一覧ページ…
という個別のページを作ろうと思っています。
きっとシンプルな書き方があるのかもしれませんがとりあえず「東京」「神奈川」全ファイル作ります(^ ^)
今ある全カテゴリー5件ごとのページも、get_postsで自分で書き直してみようと思います。
皆様ありがとうございました。
the_time(‘Y年n月j日’)だと日にちが表示されなくてget_the_date(‘Y年m月d日’)だったのですがなぜでしょう?
それはechoを使った書き方をしているからです。
<?php echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a><em>(' . get_the_date('Y年m月d日') . ')</em></li>'; ?>
↑
↓
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><em><?php the_time('Y年m月d日') ?></em></li>
多分、ほぼ同じ出力結果になると思いますが、
the_time(同日投稿の記事がなければthe_dateでもOK)やthe_title、the_permalinkはechoを使わずに出力、 get_がつくのはechoを使って出力します。
※厳密には同じじゃないのですが、下記の記事が参考になるかなと思います。
http://ateitexe.com/wordpress-how-to-get-the/
http://firegoby.jp/archives/5402
※補足です。
echoのいらない、the_で始まるテンプレートタグは「ループ内で使う」ことになっています。(ループ外だと何も表示されません)
今回はforeach( $newslist as $post )~のループ内での出力になりますので、the_で始まるテンプレートタグが問題なく使えます。
上記参考サイトの2つめの記事で記載されている通り、どっちを使っても表示ができる場合は、できるだけthe_で始まるテンプレートタグを使ったほうが、初心者さんにも安心安全です。