• 解決済 makoto-t

    (@makoto-t)


    投稿した記事の日時とタイトルを
    アーカイブメニューとして表示したいのですがどうすれば可能でしょうか?

    <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が表示されます。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • リンクの遷移先を表示するためのテンプレートに問題がある可能性が高いので、
    まずは個別記事用テンプレートの内容を確認してみてください。

    「アーカイブメニュー」のループの記述そのものに限れば問題はありません。
    問題があるとすればテンプレート中での他のループとの位置関係でしょうか。

    遷移元と遷移先のテンプレートが同一である場合、
    もしくは個別記事用テンプレートにも「アーカイブメニュー」のループが記述されている場合、
    query_posts(); の代わりに get_posts(); を使うことで
    問題が回避できないか試してみてください。

    # ところで makoto-t さんの提示された出力結果が気になります。
    # the_date(); は年月日が同じ場合 2 件目以降では出力されないはずですが。。。
    # あと strong はどこに消えたんでしょう。。。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    表示される記事の内容がどちらをクリックしても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 になるよう処理されているはずなので、そのままでも大丈夫でしょう。

    トピック投稿者 makoto-t

    (@makoto-t)

    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() に変更させてもらいました。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    同じ年月日の2件目は、ご指摘の通り表示されていません。
    できれば・・・表示させたいのですが方法がわからない状況です。

    the_date() じゃなくて the_time() にすれば OK です。

    Win-XPにXAMPPをインストールしてEclipseからwordpressをインストールしました。

    やはりローカル環境なのですね。本番環境とローカル環境では動作が異なることが多いため、ローカルのテスト環境の場合はその旨を明記して頂きたいです。

    あと、

    あと ?p=1 , ?p=2,… と順に変化させてどうなるかも確かめてみてください。

    の結果はどうでしょうか? これの結果によって回答が変ってきます。

    まず、テーマをいじくるよりも、リクエストした URL に応じて正しい投稿が表示されるように調整することが先決です。おそらく、どんな URL を入れてもフロントページ (トップページ) が出てくるような状況ではないかと思いますので。

    トピック投稿者 makoto-t

    (@makoto-t)

    lilyfan様 たびたびすみません。

    同じ年月日の2件目は lilyfan様のアドバイス通りに
    the_date() から the_time() で解決できました。

    本番環境とローカル環境では動作が異なることが多い

    とのことでしたので、サーバーにUPして

    あと ?p=1 , ?p=2,… と順に変化させてどうなるかも確かめてみてください。

    を確認してみました。ご指摘通りどんな URL を入れてもフロントページ (トップページ) が出てくるような状況です。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    ご指摘通りどんな URL を入れてもフロントページ (トップページ) が出てくるような状況です。

    となるとパーマリンク設定がちょっと変ですね。パーマリンク設定はどうなっていますでしょうか? 標準のパーマリンクに戻してみて、もし .htaccess が生成されているなら、それを削除するとどうなるでしょう?

    トピック投稿者 makoto-t

    (@makoto-t)

    パーマリンク設定はデフォルトのまま利用しているのですが・・・・
    標準のパーマリンクに戻すというのは、デフォルトという意味合いとまた違うのでしょうか?
    あと .htaccess はどこに生成されるのですか?

    質問だらけになってしまいすみません。

    トピック投稿者 makoto-t

    (@makoto-t)

    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();を使うと
    対象のページが表示されたのですが、「アーカイブメニュー」が
    表示されている記事のみになってしまいました。

    アーカイブメニューが表示されている記事のみになってしまった、とはどういう状況でしょう?
    私にはちょっと状況が掴めないので、もう少し詳しく説明していただけませんか?
    問題の解決にはつながらないことかもしれませんが、どういう状況なのか私も理解したいです。

    トピック投稿者 makoto-t

    (@makoto-t)

    mizubeさま ありがとうございます。

    query_posts(); の代わりに get_posts(); を使う—-
    これを試してみたのですが、get_posts();を使うと
    対象のページが表示されたのですが、「アーカイブメニュー」が
    表示されている記事のみになってしまいました。

    の状況ですが、アーカイブメニュー部分が

    2008年6月20日
    投稿記事のタイトルA
    2008年6月18日
    投稿記事のタイトルB
    2008年6月11日
    投稿記事のタイトルC

    —と3つ並んでいたものが

    メニューの「投稿記事のタイトルB」をクリックすると
    対象の投稿記事は表示されるが
    アーカイブメニュー部分が

    2008年6月18日
    投稿記事のタイトルB

    1つだけになってしまうという意味なのですが・・・・
    この説明で状況掴めましたでしょうか?

    説明ありがとうございます。なるほど、不可解ですね。

    それでは、サーバー関係は 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 のテンプレートタグの挿入漏れということはありませんか?
    また、 「アーカイブメニュー」についてもう一点、このループは、
    メインの記事のループの前に位置していませんか?

    トピック投稿者 makoto-t

    (@makoto-t)

    mizubeさま お付き合いいただきありがとうございます。

    > 私が不勉強なためまともに回答できず申し訳ありませんが、

    とんでもないです。。。
    恐らく私がプログラムに明るい訳でもなく、
    WordPress初心者にしていきなりオリジナルのテーマで
    制作を始めたために なんじゃコリャ?状態になっているだけだと思います。m(_ _)m

    mizubeさま の
    > また、 「アーカイブメニュー」についてもう一点、このループは、
    > メインの記事のループの前に位置していませんか?

    とのご指摘の部分で あ!それってまずいん?と思い

    本で調べていると・・・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 ループを使った方がいいのではないかと思います。

    トピック投稿者 makoto-t

    (@makoto-t)

    lilyfanさま mizubeさま

    ご無沙汰しております。
    1年以上もお礼を忘れこのトピック事態も放置した形になってしまい申し訳ございませんでした。

    いろいろとご指導いただきありがとうございました!!
    今後とも宜しくお願いいたします。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「投稿日とタイトルを表示」には新たに返信することはできません。