どこで並び替えるのですか?管理画面?検索結果?アーカイブ?
Takuro Hishikawa さま
コメントありがとうございます。
説明不足で申し訳ございません。
index.php、category.phpに記事一覧のリストを表示させているのですが、
そこに「開催日順」「開催中」のボタンをつけて並び替えが可能な状態にしたいと考えております。
見た目としては
https://ja.forums.wordpress.org/topic/7943?replies=7
こちらのような形にしたいのですが、
これをカスタムフィールドの値で並び替える方法と、
カスタムフィールドの二つの値(開催日・終了日)から開催期間中の記事を抽出する方法が どうにも理解できず、苦戦している状態です。
「開催日順」の仕様は開催日の降順?
「開催中」は期間の話なので、並び順の話じゃないですよね?
>「開催日順」の仕様は開催日の降順?
仰る通りです。
>「開催中」は期間の話なので、並び順の話じゃないですよね?
またも説明不足で申し訳ございません。
今日開催しているイベントだけを表示させたいということでした。
例として、今日(1/22)にサイトを見て開催中ボタンを押すと、
開催日1/22 終了日1/24の記事
開催日1/19 終了日1/23の記事
開催日1/17 終了日1/22の記事
という記事たちのみを表示させたいです。
その際の並び順は開催日の降順で表示させられればと思っております。
上記の説明でご理解いただけますでしょうか。
もしまだ足りない点がありましたらお教えくださると助かります。
ようやく仕様についてははっきりしましたね。それでは、次に「うまく動作せず」の内容を教えてください。エラーが出ているのか?動作するが、意図した挙動と違うのか?それとも、過去のフォーラムとは関係なく、上記の仕様を実装する方法が知りたいのか?そこまで書いていただかないと、何もワカラナイに等しい状態です。
何度もすみません、きちんと整理しますね…。
<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>
過去のカスタムフィールドによる並び替えを参考に、
上記のコードをアレンジすれば希望の動作ができるかと思ったのですが、どのように書けば良いのか自分なりに調べても理解ができず、そもそも一旦上記のコードそのままのものを使用してみても投稿日付順にすらならず…
結局のところ、「過去のフォーラムとは関係なく、上記の仕様を実装する方法が知りたい」というのが一番近いです。
ゼロから考えてほしいという質問はあまりにあつまかしいと思い、せめて過去のフォーラムからアレンジできる方法を伝授してほしいと考えていたのですが、それがかえって混乱をまねいてしまっていますので、別のやり方でも実装可能な方法をご存知でしたらお教えいただけると幸いです…
なるほど、ではイチから考えることにしましょう。
> カスタムフィールドには以下のように設定しております。
この設定は、WordPressコアにこのような機能はありませんので、おそらく何かプラグインを使っておられますよね。何を使用されていますか?プラグインによって、カスタムフィールドへのデータの保存方法は違います。使用しているプラグインとWordPressコアのバージョンも、質問の際には提供していただいた方が良いでしょう。
仰る通りですね、申し上げず失礼いたしました。
カスタムフィールドはCustom Field Templateプラグインを利用しています。
また、WordPressコアのバージョンというのはWordPressのバージョンという認識でよろしかったでしょうか?そちらで間違いなければ、4.1となります。
■開催日順の表示
下記のようにURLにパラメーターをつければ、開催日順になるようにしてみましょう。
http://www.example.com/?orderby=meta_value&order=DESC&meta_key=t_date
この場合、問題になるのは meta_key
パラメーターで、WordPressはこのパラメーターをURLでうけつけません。それ以外の orderby
と order
は、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
返信が遅くなり申し訳ありません。
■開催日順の表示
希望通りの動きにすることができました!ありがとうございます!
■ 開催中の投稿の表示
こちらについて、すみませんがまだ理解ができません。
まず、ブログに記載の以下のコードを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をどのように変更すればよろしいでしょうか。
お時間あるときにお教えいただければ幸いです。
ああ、すみません。「その通り」と書きつつ、ブログで紹介しているのは投稿の公開日で絞り込む方法ですので、カスタムフィールドではありませんね。その辺りは、適当に調整してください。カスタムフィールドなので、meta_queryを使ってもう少し簡単に書けそうですね。
いろいろ試行錯誤してなんとか思い通りの動きができました。
丁寧にアドバイスしていただき本当にありがとうございました!