投稿日とタイトルを表示
-
投稿した記事の日時とタイトルを
アーカイブメニューとして表示したいのですがどうすれば可能でしょうか?<ul> <?php query_posts('showposts=10'); ?> <?php if (have_posts()):while(have_posts()):the_post(); ?> <li><a href="<?php the_permalink(); ?>"><strong><?php the_date('Y年n月j日'); ?></strong><br /> <?php the_title(); ?></a></li> <?php endwhile; endif; ?> </ul>
こんな感じで見た目は実現できたのですが・・・リンクが上手く動作しません。
生成されたHTMLを見るとリンクも
<li><a href="http://127.0.0.1:8080/wordpress-2.5/?p=14">2008年6月18日のA</a></li>
<li><a href="http://127.0.0.1:8080/wordpress-2.5/?p=13">2008年6月18日のB</a></li>
となっており投稿した記事のIDと合っているようなのですが
表示される記事の内容がどちらをクリックしてもBが表示されます。
-
リンクの遷移先を表示するためのテンプレートに問題がある可能性が高いので、
まずは個別記事用テンプレートの内容を確認してみてください。「アーカイブメニュー」のループの記述そのものに限れば問題はありません。
問題があるとすればテンプレート中での他のループとの位置関係でしょうか。遷移元と遷移先のテンプレートが同一である場合、
もしくは個別記事用テンプレートにも「アーカイブメニュー」のループが記述されている場合、
query_posts(); の代わりに get_posts(); を使うことで
問題が回避できないか試してみてください。# ところで makoto-t さんの提示された出力結果が気になります。
# the_date(); は年月日が同じ場合 2 件目以降では出力されないはずですが。。。
# あと strong はどこに消えたんでしょう。。。表示される記事の内容がどちらをクリックしてもBが表示されます。
この場合、テーマの問題ではなく、WordPress のインストールに問題がある場合があります。
「http://127.0.0.1:8080/wordpress-2.5/?p=13」というクエリー形式の URL で、クエリー内容が違っても同じ記事になるのは、非常に不可思議です。URL から見るとローカルインストールでのテストのようですが、設置環境を詳しく書いてもらえないでしょうか。あと ?p=1 , ?p=2,… と順に変化させてどうなるかも確かめてみてください。
「http://example.com/2008/06/18/」のようなパーマリンクで、URL が違っても同じ記事になる場合は、.htacess の設置ができてなかったり mod_rewrite が無効だったりするんですが、今回はそれとは違うっぽいです。
<li><a href="<?php the_permalink(); ?>"><strong><?php the_date('Y年n月j日'); ?></strong><br /> <?php the_title(); ?></a></li>
これだと XSS 脆弱性が生じる危険性があるので、
the_title_attribute()
テンプレートタグを使ってください。get_permalink の方は、安全な URL になるよう処理されているはずなので、そのままでも大丈夫でしょう。mizube様 アドバイスありがとうございます。
# the_date(); は年月日が同じ場合 2 件目以降では出力されないはずですが。。。
# あと strong はどこに消えたんでしょう。。。情報を正確に伝えておりませんでした。すみません。
同じ年月日の2件目は、ご指摘の通り表示されていません。
できれば・・・表示させたいのですが方法がわからない状況です。
また、strong も消えておりません。私の記述もれです。query_posts(); の代わりに get_posts(); を使う—-
これを試してみたのですが、get_posts();を使うと
対象のページが表示されたのですが、「アーカイブメニュー」が
表示されている記事のみになってしまいました。
ちなみに<ul> <?php wp_get_archives('type=postbypost&limit=5'); ?> </ul>
で 「アーカイブメニュー」にすると、
メニューに投稿日時は表示されませんが各メニューをクリックすると
ちゃんと対象ページに遷移しております。lilyfan様 アドバイスありがとうございます。
設置環境ですが
http://zone.maple4ever.net/documents/xampp_eclipse01.html
上記のサイトを参考にして
Win-XPにXAMPPをインストールしてEclipseからwordpressをインストールしました。また、the_title() から the_title_attribute() に変更させてもらいました。
同じ年月日の2件目は、ご指摘の通り表示されていません。
できれば・・・表示させたいのですが方法がわからない状況です。the_date()
じゃなくてthe_time()
にすれば OK です。Win-XPにXAMPPをインストールしてEclipseからwordpressをインストールしました。
やはりローカル環境なのですね。本番環境とローカル環境では動作が異なることが多いため、ローカルのテスト環境の場合はその旨を明記して頂きたいです。
あと、
あと ?p=1 , ?p=2,… と順に変化させてどうなるかも確かめてみてください。
の結果はどうでしょうか? これの結果によって回答が変ってきます。
まず、テーマをいじくるよりも、リクエストした URL に応じて正しい投稿が表示されるように調整することが先決です。おそらく、どんな URL を入れてもフロントページ (トップページ) が出てくるような状況ではないかと思いますので。
lilyfan様 たびたびすみません。
同じ年月日の2件目は lilyfan様のアドバイス通りに
the_date() から the_time() で解決できました。本番環境とローカル環境では動作が異なることが多い
とのことでしたので、サーバーにUPして
あと ?p=1 , ?p=2,… と順に変化させてどうなるかも確かめてみてください。
を確認してみました。ご指摘通りどんな URL を入れてもフロントページ (トップページ) が出てくるような状況です。
ご指摘通りどんな URL を入れてもフロントページ (トップページ) が出てくるような状況です。
となるとパーマリンク設定がちょっと変ですね。パーマリンク設定はどうなっていますでしょうか? 標準のパーマリンクに戻してみて、もし .htaccess が生成されているなら、それを削除するとどうなるでしょう?
パーマリンク設定はデフォルトのまま利用しているのですが・・・・
標準のパーマリンクに戻すというのは、デフォルトという意味合いとまた違うのでしょうか?
あと .htaccess はどこに生成されるのですか?質問だらけになってしまいすみません。
wp_get_archives()
を利用するときはページ遷移が正常だったので・・・
Customizable Post Listings プラグインを利用して
やりたいことが実現できました。でも今後のためにも
<ul> <?php query_posts('showposts=10'); ?> <?php if (have_posts()):while(have_posts()):the_post(); ?> <li><a href=""><strong><?php the_date('Y年n月j日'); ?></strong> <?php the_title_attribute(); ?></a></li> <?php endwhile; endif; ?> </ul>
この方法でも解決したいので・・・
フォーラムの皆さまご指導の程よろしくお願いいたします。少し前の話に戻りますが、
query_posts(); の代わりに get_posts(); を使う—-
これを試してみたのですが、get_posts();を使うと
対象のページが表示されたのですが、「アーカイブメニュー」が
表示されている記事のみになってしまいました。アーカイブメニューが表示されている記事のみになってしまった、とはどういう状況でしょう?
私にはちょっと状況が掴めないので、もう少し詳しく説明していただけませんか?
問題の解決にはつながらないことかもしれませんが、どういう状況なのか私も理解したいです。mizubeさま ありがとうございます。
query_posts(); の代わりに get_posts(); を使う—-
これを試してみたのですが、get_posts();を使うと
対象のページが表示されたのですが、「アーカイブメニュー」が
表示されている記事のみになってしまいました。の状況ですが、アーカイブメニュー部分が
2008年6月20日
投稿記事のタイトルA
2008年6月18日
投稿記事のタイトルB
2008年6月11日
投稿記事のタイトルC—と3つ並んでいたものが
メニューの「投稿記事のタイトルB」をクリックすると
対象の投稿記事は表示されるが
アーカイブメニュー部分が2008年6月18日
投稿記事のタイトルB1つだけになってしまうという意味なのですが・・・・
この説明で状況掴めましたでしょうか?説明ありがとうございます。なるほど、不可解ですね。
それでは、サーバー関係は lilyfan さんにお任せして、
私は何故このテンプレートでうまく動作しないのかを探りたいと思います。
(サーバーの問題という結論になる可能性が高いかもしれませんけど^^; )
makoto-t さんには、私が不勉強なためまともに回答できず申し訳ありませんが、
もう少しお付き合いいただければと思います。まず確認なのですが、 get_posts(); のテンプレートは
<ul> <?php $posts = get_posts(); foreach ($posts as $post) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><strong><?php the_time('Y年n月j日'); ?></strong><br /> <?php the_title_attribute(); ?></a></li> <?php endforeach; ?> </ul>
のようになると思いますが、 get_posts(); に渡す引数はどんなものですか?
それと今気付いたのですが、引用されたコード<ul> <?php query_posts('showposts=10'); ?> <?php if (have_posts()):while(have_posts()):the_post(); ?> <li><a href=""><strong><?php the_date('Y年n月j日'); ?></strong> <?php the_title_attribute(); ?></a></li> <?php endwhile; endif; ?> </ul>
ですが、 HTML の a 要素の href 属性が空になっています。
もしテンプレートから直接引用されたものであるなら、
URL のテンプレートタグの挿入漏れということはありませんか?
また、 「アーカイブメニュー」についてもう一点、このループは、
メインの記事のループの前に位置していませんか?mizubeさま お付き合いいただきありがとうございます。
> 私が不勉強なためまともに回答できず申し訳ありませんが、
>
とんでもないです。。。
恐らく私がプログラムに明るい訳でもなく、
WordPress初心者にしていきなりオリジナルのテーマで
制作を始めたために なんじゃコリャ?状態になっているだけだと思います。m(_ _)mmizubeさま の
> また、 「アーカイブメニュー」についてもう一点、このループは、
> メインの記事のループの前に位置していませんか?
>
とのご指摘の部分で あ!それってまずいん?と思い本で調べていると・・・1ページ内に複数のループを記述する場合、出力条件を指定しなければ
全て同じように表示されます。との行がありました。そこで、メインインデックのテンプレートアーカイブメニュー部分は
※アーカイブメニューは<?php get_sidebar(); ?>として読み込んでます。<ul> <?php query_posts('showposts=10'); ?> <?php if (have_posts()):while(have_posts()):the_post(); ?> <li><a href="<?php the_permalink(); ?>"><strong><?php the_time('Y年n月j日'); ?></strong><br /> <?php the_title_attribute(); ?></a></li> <?php endwhile; endif; ?> </ul>
として
次に記述しているループ部分(シングルページのテンプレート)を
<?php if($posts): foreach($posts as $post): setup_postdata($post); ?> <p class="date"><?php the_time('Y年n月j日'); ?></p> <h1 style="clear: both;"><?php the_title(); ?></h1> <?php the_content(); ?> <?php endforeach; endif; ?>
とすることで、解決しました。
私が最初の質問の際に、アーカイブメニュー部分と投稿記事の関係を正確に記述していれば
mizubeさまもlilyfanさまも回答し易かったのだろうな~と推測しております。この方法であれば問題ないですかね?一応、見た目は解決した状況になっております。
だいたい原因が理解できました。
query_posts() は WordPress ループを変更するためのものですから、
query_posts(); と WordPress ループを用いたアーカイブメニューのループが、
メインの記事のループの前に設置されている場合、
メインの記事の表示条件も query_posts(); によって変更されてしまいます。
makoto-t さんの当初の場合、 query_posts(); に渡す引数で showposts=10 としていたので、
メイン記事は 11 件目以降の記事ということになるので、何も表示されなかったわけです。query_posts(); で条件を指定したアーカイブメニューのループを先に設置し、
その後にメイン記事のループを設置させたい、という場合には、
メイン記事のループの直前に
<?php query_posts($query_string); ?> とすることで、大抵の場合は OK です。一方で、 get_posts(); は WordPress ループの条件を変更しません。
渡せる引数が query_posts(); と異なりますが、
アーカイブメニューにこちらを使えば、テンプレート上の位置を気にしなくて済みます。
get_posts(); でのアーカイブメニューの例は、前回の投稿に書きましたとおりです。また get_posts(); でメイン記事のループを定義してしまうと、
「前のページ」「次のページ」を表示してもメイン記事が変わらないなど、
弊害があるかもしれません。get_posts(); を使ったループでは
メイン記事のテンプレートを記述しないことをお勧めします。というわけで、見た目は解決しているかもしれませんが、
アーカイブメニューのループに get_posts(); を使い、
メイン記事のループに WordPress ループを使った方がいいのではないかと思います。
- トピック「投稿日とタイトルを表示」には新たに返信することはできません。