サポート » 使い方全般 » カスタムフィールドで入力した日付によるソートとそのボタン

  • 解決済 tamakana

    (@tamakana)


    お世話になります。

    以前同様の質問をさせていただいたのですが、誤って「【重要】お読みください」フォーラムのスレッドでたててしまいましたので、こちらで再度質問させてください。

    カスタムフィールドで入力した日付をもとに、イベントの「開催日」順と「開催中」で並べ替えられるボタンを設置したいと考えています。

    https://ja.forums.wordpress.org/topic/12718?replies=2
    https://ja.forums.wordpress.org/topic/13868?replies=4

    上記のフォーラムなど参考にしましたがうまく動作せず困っております。
    ご存知の方いらっしゃいましたら、どうかご教示いただけませんでしょうか。

    カスタムフィールドには以下のように設定しております。

    [t_date]
    label = 開催日
    type = textfield
    size = 35
    date=true
    dateFormat = yyyy.mm.dd
    startDate = '2000.01.01'
    dateFirstDayOfWeek = 0
    
    [e_date]
    label =  終了日
    type = textfield
    size = 35
    date=true
    dateFormat = yyyy.mm.dd
    startDate = '2000.01.01'
    dateFirstDayOfWeek = 0
12件の返信を表示中 - 1 - 12件目 (全12件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    どこで並び替えるのですか?管理画面?検索結果?アーカイブ?

    スレッド開始 tamakana

    (@tamakana)

    Takuro Hishikawa さま

    コメントありがとうございます。
    説明不足で申し訳ございません。

    index.php、category.phpに記事一覧のリストを表示させているのですが、
    そこに「開催日順」「開催中」のボタンをつけて並び替えが可能な状態にしたいと考えております。

    見た目としては
    https://ja.forums.wordpress.org/topic/7943?replies=7
    こちらのような形にしたいのですが、
    これをカスタムフィールドの値で並び替える方法と、
    カスタムフィールドの二つの値(開催日・終了日)から開催期間中の記事を抽出する方法が どうにも理解できず、苦戦している状態です。

    モデレーター Takuro Hishikawa

    (@hissy)

    「開催日順」の仕様は開催日の降順?

    「開催中」は期間の話なので、並び順の話じゃないですよね?

    スレッド開始 tamakana

    (@tamakana)

    >「開催日順」の仕様は開催日の降順?

    仰る通りです。

    >「開催中」は期間の話なので、並び順の話じゃないですよね?

    またも説明不足で申し訳ございません。
    今日開催しているイベントだけを表示させたいということでした。
    例として、今日(1/22)にサイトを見て開催中ボタンを押すと、

    開催日1/22 終了日1/24の記事
    開催日1/19 終了日1/23の記事
    開催日1/17 終了日1/22の記事

    という記事たちのみを表示させたいです。
    その際の並び順は開催日の降順で表示させられればと思っております。

    上記の説明でご理解いただけますでしょうか。
    もしまだ足りない点がありましたらお教えくださると助かります。

    モデレーター Takuro Hishikawa

    (@hissy)

    ようやく仕様についてははっきりしましたね。それでは、次に「うまく動作せず」の内容を教えてください。エラーが出ているのか?動作するが、意図した挙動と違うのか?それとも、過去のフォーラムとは関係なく、上記の仕様を実装する方法が知りたいのか?そこまで書いていただかないと、何もワカラナイに等しい状態です。

    スレッド開始 tamakana

    (@tamakana)

    何度もすみません、きちんと整理しますね…。

    <ul>
    <?php
    $url = sprintf( 'http://%1$s%2$s', $_SERVER["HTTP_HOST"], $_SERVER["REDIRECT_URL"] );
    printf( '<li><a href="%s?orderby=comment_count&order=DESC">コメントの多い順</a></li>', $url );
    printf( '<li><a href="%s?orderby=comment_count&order=ASC">コメントの少ない順</a></li>', $url );
    printf( '<li><a href="%s?orderby=post_date&order=DESC">日付の新しい順</a></li>', $url );
    printf( '<li><a href="%s?orderby=post_date&order=ASC">日付の古い順</a></li>', $url );
    ?>
    </ul>

    過去のカスタムフィールドによる並び替えを参考に、
    上記のコードをアレンジすれば希望の動作ができるかと思ったのですが、どのように書けば良いのか自分なりに調べても理解ができず、そもそも一旦上記のコードそのままのものを使用してみても投稿日付順にすらならず…

    結局のところ、「過去のフォーラムとは関係なく、上記の仕様を実装する方法が知りたい」というのが一番近いです。
    ゼロから考えてほしいという質問はあまりにあつまかしいと思い、せめて過去のフォーラムからアレンジできる方法を伝授してほしいと考えていたのですが、それがかえって混乱をまねいてしまっていますので、別のやり方でも実装可能な方法をご存知でしたらお教えいただけると幸いです…

    モデレーター Takuro Hishikawa

    (@hissy)

    なるほど、ではイチから考えることにしましょう。

    > カスタムフィールドには以下のように設定しております。

    この設定は、WordPressコアにこのような機能はありませんので、おそらく何かプラグインを使っておられますよね。何を使用されていますか?プラグインによって、カスタムフィールドへのデータの保存方法は違います。使用しているプラグインとWordPressコアのバージョンも、質問の際には提供していただいた方が良いでしょう。

    スレッド開始 tamakana

    (@tamakana)

    仰る通りですね、申し上げず失礼いたしました。
    カスタムフィールドはCustom Field Templateプラグインを利用しています。

    また、WordPressコアのバージョンというのはWordPressのバージョンという認識でよろしかったでしょうか?そちらで間違いなければ、4.1となります。

    モデレーター Takuro Hishikawa

    (@hissy)

    ■開催日順の表示

    下記のようにURLにパラメーターをつければ、開催日順になるようにしてみましょう。

    http://www.example.com/?orderby=meta_value&order=DESC&meta_key=t_date

    この場合、問題になるのは meta_key パラメーターで、WordPressはこのパラメーターをURLでうけつけません。それ以外の orderbyorder は、WordPressのデフォルト機能でURLパラメーターを受け付けます。そこで、下記のコードをテーマのfunctions.phpに追加すれば meta_key パラメーターが受け付けられるようになり、指定したカスタムフィールドでソートが可能になります。

    add_filter('query_vars', function($public_query_vars) {
        $public_query_vars[] = 'meta_key';
        return $public_query_vars;
    });

    ■ 開催中の投稿の表示

    こちらは、過去にブログにその通りの記事を書いたので参考にしてください。

    http://notnil-creative.com/blog/archives/1638

    スレッド開始 tamakana

    (@tamakana)

    返信が遅くなり申し訳ありません。

    ■開催日順の表示
    希望通りの動きにすることができました!ありがとうございます!

    ■ 開催中の投稿の表示
    こちらについて、すみませんがまだ理解ができません。

    まず、ブログに記載の以下のコードをfunctions.phpに記入しました。

    function my_query_vars( $public_query_vars ) {
        $public_query_vars[] = 'start_date';
        $public_query_vars[] = 'end_date';
        return $public_query_vars;
    }
    function my_parse_query( $query ) {
        if ( $query->get('start_date') && $query->get('end_date') ) {
            $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() ) {
            if ( $query->get('start_date') && $query->get('end_date') ) {
                $start_date = date('Y-m-d', strtotime($query->get('start_date')));
                $end_date = date('Y-m-d', strtotime($query->get('end_date')));
                $where .= " AND $wpdb->posts.post_date >= '$start_date' AND $wpdb->posts.post_date <= '$end_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 );

    これを、自分のカスタムフィールドの名前にあわせて’start_date’と’end_date’をそれぞれ’t_date’、’e_date’ に変更しました。
    ここまであっていますでしょうか?見当違いでしたらすみません。

    また、開催期間中の投稿のみ絞り込むためのURLですが、
    http://example.com/?s=hoge&start_date=2013-01-01&end_date=2013-12-31
    ここのs=hogeをどのように変更すればよろしいでしょうか。

    お時間あるときにお教えいただければ幸いです。

    モデレーター Takuro Hishikawa

    (@hissy)

    ああ、すみません。「その通り」と書きつつ、ブログで紹介しているのは投稿の公開日で絞り込む方法ですので、カスタムフィールドではありませんね。その辺りは、適当に調整してください。カスタムフィールドなので、meta_queryを使ってもう少し簡単に書けそうですね。

    スレッド開始 tamakana

    (@tamakana)

    いろいろ試行錯誤してなんとか思い通りの動きができました。
    丁寧にアドバイスしていただき本当にありがとうございました!

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「カスタムフィールドで入力した日付によるソートとそのボタン」には新たに返信することはできません。