• 解決済 hiroseek

    (@hiroseek)


    はじめまして。hiroseekと申します。Wordpress初心者です。
    現在、ほぼ毎日開催される行事を出力するようにカスタマイズしておりますが、
    表示に問題が発生しております。以下、仕様等を記述致しますので
    どなたかお力添え頂けると大変助かります。
    ご面倒をおかけいたしますが、宜しくお願い致します。

    <仕様>
    トップページに、ユーザがアクセスした月の行事の投稿を出力する
    例)2012年3月にアクセスしたら3月に開催される行事一覧を出力

    2カラムでメインに上記内容を出力、右カラムにカレンダーをget_calendar();で出力、
    利用している出力ファイルは全般用の「index.php」と個別ページ用の「single.php」となり、個別ページ以外は「index.php」で出力させる仕様です。

    <問題点>
    右カラムに設置したカレンダーの下部にあるページ送りのリンクをクリックしてもトップページと同じ内容が出力されてしまう。
    例)2012年3月にアクセスし、カレンダーの「NEXT」をクリックするとURLは「/2012/03/」から「/2012/04/」に変わるものの、出力される内容は3月と同様のものが表示されてしまう。

    いろいろとウェブなどで調査した結果、おそらく当月投稿を出力するためにquery_postを以下のようにしたことが問題だとは思います。

    query_posts($query_string . '&orderby=date&order=ASC&monthnum=' . date( 'n', current_time( 'timestamp' ) ) );
    if (have_posts()) : while (have_posts()) : the_post();

    上記を削除すればページ送り後のページで各月の投稿が出力されるようにはなると思うのですが、肝心のトップページの「ユーザがアクセスした月の投稿を出力」ができなくなってしまいます。

    このようなジレンマ、どのように解消したら良いのでしょうか?
    スペシャリストの方々のお力をお貸し頂けないでしょうか?

    何卒、宜しくお願い致します。

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

    (@gatespace)

    こんにちは。
    ループ部分のコードがすべて書かれていないので憶測ですが。

    query_posts() でメインクエリーを改変した場合は
    ループ終了後、wp_reset_query() でクエリをリセットしておきましょう。
    くわしくはCodexを読んでください。

    トピック投稿者 hiroseek

    (@hiroseek)

    gatespaceさま

    こんにちは。hiroseekです。
    ご回答ありがとうございます!
    このような場で質問するのが始めてだったため、稚拙な説明で失礼しました。
    query_posts()についてはおっしゃる通り、wp_reset_query() でリセットをしています。
    (リセットする場所がわからず随分苦しんだものでw)

    そもそも、今回の処理を全て「index.php」には記述せず、「archive.php」を別途設けてそこに記述したほうがスムーズなのでしょうか??
    自分は現在、エビスコム社の「WordPressレッスンブック 2.7対応」という本に従い、Wordpressのオリジナルテーマを作成してカスタマイズしているのですが、上記のように若干複雑になっているためその本の範疇を超えてしまっています。

    一応以下、今回のコードをループの終わりまで転載させて頂きます。

    <div id="leftColumn">
    <?php
    query_posts($query_string . '&orderby=date&order=ASC&monthnum=' . date( 'n', current_time( 'timestamp' ) ) );
    ?>
    
    <?php	if (have_posts()) : while (have_posts()) : the_post();
    ?>
    
    <div id="schdlIndx">
    <?php
    // the_date()
    $the_date = the_date( 'U', null, null, false );
    if ( !empty( $the_date ) ) echo date( 'Y.M.d \(D\)', $the_date ); ?>
    <h3 class="eventTTL"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
    <ul class="mgenre"><?php
        $ary = get_post_meta($post->ID,'Music Genre', false);
        $n = count($ary);
        if ($n==0)  echo "";
        else        for ($i=0;$i<$n;$i++) echo "<li>$ary[$i] </li>";
    ?></ul>
    <?php the_content(); ?>
    </div>
    
    <?php endwhile; endif; ?>
    <?php wp_reset_query(); ?>			
    
    </div>
    <div id="rightColumn">
    <div id="cList">
    <?php get_calendar(); ?>
    <?php wp_get_archives(); ?>
    
    </div>
    </div>

    汚いコードで見づらくて恐縮ですが、何卒宜しくお願い致します。

    トピック投稿者 hiroseek

    (@hiroseek)

    【追記】
    今回、未来の行事を表示させるため、予約投稿をキャンセルするプラグイン「NO FUTURE POSTS」を利用し、その上でgeneral-template.phpの一部を以下のように変更しています。

    <変更前>

    $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
        FROM $wpdb->posts WHERE MONTH(post_date) = ‘$thismonth’
        AND YEAR(post_date) = ‘$thisyear’
        AND post_type = ‘post’ AND post_status = ‘publish’
        AND post_date < ‘" . current_time(‘mysql’) . ‘\”, ARRAY_N);

    <変更後>

    $dayswithposts = $wpdb->get_results("SELECT DISTINCT DAYOFMONTH(post_date)
        FROM $wpdb->posts WHERE MONTH(post_date) = ‘$thismonth’
        AND YEAR(post_date) = ‘$thisyear’
        AND post_type = ‘post’ AND post_status = ‘publish’ ", ARRAY_N);

    参考にしたのは以下のページです。
    http://d7r.com/2010/12/%E6%9C%AA%E6%9D%A5%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%EF%BC%88%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%EF%BC%89%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/

    しかし、functions.phpからカレンダー部分を切り出してプラグイン化するようなことはおこなっておりません。

    ややこしいこととなっており恐縮ですが、何卒宜しくお願い致します。

    モデレーター gatespace

    (@gatespace)

    例)2012年3月にアクセスし、カレンダーの「NEXT」をクリックするとURLは「/2012/03/」から「/2012/04/」に変わるものの、出力される内容は3月と同様のものが表示されてしまう。

    この挙動でアーカイブページが表示されるのですが、

    個別ページ以外は「index.php」で出力させる仕様です。

    と言うことなので、トップページもアーカイブページも同じコードが書かれているindex.phpで表示されています。
    で、index.phpのquery_postsで
    query_posts($query_string . '&orderby=date&order=ASC&monthnum=' . date( 'n', current_time( 'timestamp' ) ) );
    と monthnum が固定されているので、日付アーカイブページでの表示がうまくいっていないように思えます。

    検証できないので申し訳ないのですが、

    1. 日付アーカイブ専用のテンプレート date.php を作ってしまう(その際query_postsの記述は削除してみてください)
      (参照:テンプレート階層
    2. index.php内で条件分岐を行いトップページの場合のみquery_postsの記述を行う
      (参照:条件分岐タグ

    のいずれかを試してみてください。

    あと、老婆心ながら、参照にされている書籍の内容はかなり古いと思われますので、お使いになっているWordPressのバージョンにあわせた書籍を参考にされた方が良いと思います。

    また、変更されたgeneral-template.phpはWordPressのコアファイルです。
    コアファイルを自分で書き換えてしまうと、WordPressのバージョンアップでその部分が元に戻ります。
    ですので、コアファイルの改変は行わないでください。

    トピック投稿者 hiroseek

    (@hiroseek)

    gatespaceさま

    こんばんは。hiroseekです。
    ご丁寧に解説ありがとうございました!

    だいぶ苦戦したのですが、おかげさまで無事、修正できました。
    方法としては、2.を試行錯誤してみたのですがどうしてもうまくいかなかったので、
    1.の方法で調整したら無事、出力されました。

    いろいろとソースを試行錯誤していじる中で無限ループにハマったりしましたが、
    そうやって試行錯誤することでどのように処理を並べていくと適切に処理がなされるのか、
    とかを身を以て経験できたのは貴重な経験でした。

    また、ご助言頂いた通り、Wordpressの本については最新版を本日購入しました。
    またまたエビスコムさんの最新版なんですが、これを熟読してより一層Wordpress、
    使い倒していきたいと思います。
    本当に助かりました。ありがとうございました!!!

    モデレーター gatespace

    (@gatespace)

    解決したらこのスレッドを「解決済み」にしておいてくださいね。
    (右上の方にあります)

    トピック投稿者 hiroseek

    (@hiroseek)

    gatespaceさま

    何から何までありがとうございます!
    本返信を以って解決済みフラグ立てたく思います。

    ありがとうございました!!

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「ユーザがアクセスした月の行事の投稿を出力したい」には新たに返信することはできません。