サポート » 使い方全般 » 投稿日時で絞り込みをしたい

  • 解決済 firth

    (@firth)


    大きなサイトに、記事を絞り込む方法として
    投稿日時が
    ・1か月以内
    ・1週間以内
    ・1日以内
    という方法で絞り込むことが出来る場合がありますが、

    このような絞り込みを
    ・検索する時
    ・category.php
    ・search.php
    で出来るようにしたいと考えています。

    コードでもプラグインでも助かるのですが、
    どちらも調べたり探したりでも見つけられなかったので、
    教えてほしいです。

    少しでもいいので、情報をください

15件の返信を表示中 - 1 - 15件目 (全27件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    手前味噌ですが、日付で絞りこんで検索する方法
    http://notnil-creative.com/blog/archives/1638

    トピック投稿者 firth

    (@firth)

    返信ありがとうございます。

    3番目に紹介されている方法を
    ぜひ使ってみたいのですが、
    具体的にどのようにすればいいのでしょうか?

    functions.phpへの貼り付けの後に
    どのようにするのかわからず、困っています・・・

    モデレーター Takuro Hishikawa

    (@hissy)

    参考例はstart_dateとend_dateの両方を指定して検索しないと動かない仕様なので、1週間以内だと、end_dateの方は指定しなくていいように変えたほうがいいですね。

    start_dateの渡し方については、ご要望の機能だと1週間前や1ヶ月前の日付を自動で生成しないといけないと思いますので、PHPの日付関連の関数を調べてみてください。

    トピック投稿者 firth

    (@firth)

    仮に指定して検索フォームで日時を指定して検索する場合は、
    本来の検索機能に加えて、別のテキスト入力欄を作成する、
    ということでしょうか?

    また、私がトピックの最初で要望した、
    一定期間内の記事だけを表示する、という場合は、
    日付の自動生成の機能を作って、
    start_dateをドロップダウンなどで
    表示する必要がある、
    ということでしょうか?

    モデレーター Takuro Hishikawa

    (@hissy)

    はいそうです、WordPressの検索フォームのform要素の中に適当に足す感じです。

    <select name="start_date">
    <option value="2013-5-27">1ヶ月以内</option>
    <option value="2013-6-20">1週間以内</option>
    </select>
    トピック投稿者 firth

    (@firth)

    hissyさんのヒントを参考にしながら、
    以下のようなコードを書いてみたのですが、
    ダメでした。

    なにかアドバイスをいただけませんでしょうか。

    <select name="start_date">
    <option value="<?php date("Ymd",strtotime("-1 day")); ?>">1日前</option>
    <option value="<?php date("Ymd",strtotime("-1 week")); ?>">1週間前</option>
    <option value="<?php date("Ymd",strtotime("-1 month")); ?>">1月前</option>
    <option value="<?php date("Ymd",strtotime("-1 year")); ?>">1年前</option>
    </select>

    また、以上のようなコードで、
    category.phpやauthor.phpなどでも日時の絞り込みが
    出来るものなのでしょうか。

    モデレーター Takuro Hishikawa

    (@hissy)

    <option value="<?php date("Ymd",strtotime("-1 day")); ?>">1日前</option>

    これだと、出力結果は

    <option value="">1日前</option>

    になると思います。

    <option value="<?php echo date("Y-m-d",strtotime("-1 day")); ?>">1日前</option>

    こう変更していただければと。echo 大事。

    あと、リンク先の記事の my_search_where 関数を見て欲しいのですが、if ( $query->is_search() ) {で、検索結果の時のみ(つまりsearch.phpのときのみ)start_date と end_date で絞り込んでいます。今回はend_dateは不要と思いますが、要は is_search のところの条件を追加して、 is_category や is_author でも有効にすれば良いということですね。

    トピック投稿者 firth

    (@firth)

    たびたびすいません。

    <select name="start_date">
    <option value="<?php echo date("Y-m-d",strtotime("-1 day")); ?>">1日前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 week")); ?>">1週間前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 month")); ?>">1月前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 year")); ?>">1年前</option>
    </select>

    以上のようなコードで、日付を選択した上で
    記事を検索したのですが、機能しませんでした。

    hissyさんに教えていただいたリンク先の記事は
    ただ貼り付けてある状態なのですが、
    リンク先のコードを意図的に改善していく必要のほうがあるのでしょうか?

    モデレーター Takuro Hishikawa

    (@hissy)

    リンク先のコードは start_date と end_date の両方がセットされている時のみ絞り込みを行なっていますので、end_date の方は無くても動くように変更しないといけないですね。

    トピック投稿者 firth

    (@firth)

    いろいろと理解できていないくて申し訳ないです。

    検索する時については、
    end_dateの方が無くても動くようにはなりました。
    ありがとうございます。

    ただ、category.phpなどで絞り込みが出来るように
    なるためにと思い、
    is_searchの部分をis_categoryに変更したところ、
    サイトに入れなくなってしまいました。

    また、category.phpの画面上で絞り込みをしようと思い、
    以下のようなコードにしてみたのですが、
    機能しませんでした。

    <select name="start_date" onChange="location.href=value;">
    <option value="<?php echo date("Y-m-d",strtotime("-1 day")); ?>">1日前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 week")); ?>">1週間前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 month")); ?>">1月前</option>
    <option value="<?php echo date("Y-m-d",strtotime("-1 year")); ?>">1年前</option>
    </select>

    このようなコードと、hissyさんが示してくださいましたコードとは
    関係があるのでしょうか?

    モデレーター Takuro Hishikawa

    (@hissy)

    サイトに入れなくなってしまいました、とは、どういう状態でしょうか?
    手間がかかってるようですので手持ちの環境でテストしてみましたが、カテゴリーアーカイブでも問題なく動きますね。

    function my_query_vars( $public_query_vars ) {
        $public_query_vars[] = 'start_date';
        return $public_query_vars;
    }
    function my_parse_query( $query ) {
        if ( $query->get('start_date') && !$query->is_category() ) {
            $query->is_search = true;
            $query->is_home = false;
        }
        return $query;
    }
    function my_search_where( $where, $query ) {
        if ( is_admin() || ! $query->is_main_query() )
            return $where;
    
        global $wpdb;
        if ( $query->is_search() || $query->is_category() ) {
            if ( $query->get('start_date') ) {
                $start_date = date('Y-m-d', strtotime($query->get('start_date')));
                $where .= " AND $wpdb->posts.post_date >= '$start_date'";
            }
        }
        return $where;
    }
    add_filter( 'query_vars', 'my_query_vars');
    add_filter( 'parse_query', 'my_parse_query');
    add_filter( 'posts_where', 'my_search_where', 10, 2 );
    トピック投稿者 firth

    (@firth)

    サイトに入れなくなってしまった、というのは
    画面が真っ白になってしまった状態です。
    説明不足で申し訳なかったです。

    hissyさんが教えてくださいましたコードを貼りつけ、
    私が1つ手前で記載したドロップダウンのコードを
    カテゴリーアーカイブに貼り付けて動かしてみたのですが、
    404ページになってしまいました。
    (検索のときの絞り込みでは問題が無かったのですが・・)

    hissyさんのコードと私のドロップダウンメニューは
    直接は関係ないものなのでしょうか。

    モデレーター Takuro Hishikawa

    (@hissy)

    ドロップダウンメニューのコードも問題あると思いますよ。
    まあ、要はこういうURLにアクセスすると動くようにしたのが上のコードです。

    http://example.com/?cat=1&start_date=2008-09-01
    http://example.com/?s=hogehoge&start_date=2008-09-01

    トピック投稿者 firth

    (@firth)

    hissyさん
    返信が遅くなってすいませんでした。

    いろいろと考えて、また別のトピックをたてて
    質問することにしてみます。

    お手数をかけました。
    ありがとうございました。

    モデレーター Takuro Hishikawa

    (@hissy)

    あれ、もう少しで出来そうだったと思うのですが…。location.href=value;だと、カテゴリーが引き継がれないところが問題でしょうね。先に投稿したカテゴリーアーカイブに対応させたコードをfunctions.phpに追加し、下記のように修正したコードをテンプレートに追加すれば、動くと思いますよ。

    <?php if(is_category()){
    	$cat_id = get_queried_object_id(); ?>
    	<form action="<?php echo home_url(); ?>" method="get">
    		<input type="hidden" name="cat" value="<?php echo $cat_id; ?>" />
    		<select name="start_date" onchange="submit(this.form)">
    		<option>絞り込み</option>
    		<option value="<?php echo date("Y-m-d",strtotime("-1 day")); ?>">1日前</option>
    		<option value="<?php echo date("Y-m-d",strtotime("-1 week")); ?>">1週間前</option>
    		<option value="<?php echo date("Y-m-d",strtotime("-1 month")); ?>">1月前</option>
    		<option value="<?php echo date("Y-m-d",strtotime("-1 year")); ?>">1年前</option>
    		</select>
    	</form>
    <?php } ?>
15件の返信を表示中 - 1 - 15件目 (全27件中)
  • トピック「投稿日時で絞り込みをしたい」には新たに返信することはできません。