web-dev-qa-db-ja.com

WP_QueryとBETWEENによる複雑な日付範囲

裏話

eventsカスタム投稿タイプにはたくさんのイベントがあります。それぞれに関連付けられた以下のカスタムフィールドがあります。

  • start_date
  • end_date

フロントエンドには、ユーザーがイベントの検索方法を選択できるフィルタ付きサイドバーがあります(つまり、さまざまな分類法、町への旅行の開始日、終了日など)。 event_beginevent_endの検索入力は、データベースへの問い合わせに使用するものです。

問題

私は大まかに質問された結果を含む問題を抱えています。厳密な一致が表示されますが、プロジェクトの利害関係者は、検索が厳しすぎると言っています。ユーザーの検索フィルターでフロントエンドのevent_endフィールドを放棄するという概念を提起しましたが、それが私にとってこの時点で必要なのかどうかはよくわかりません。

イベントを検索する場合は、次のようにmeta_queryを構造化できます。

  • 選択した2つの日付の間に開始日と終了日があるイベントが表示されます。
  • 開始日が選択した2つの日付の間に発生するイベントが表示されます
  • 選択した2つの日付の間に終了日が発生するイベントが表示されます。

しかし、私がこのようなフロントエンド検索をしたときはどうでしょうか。

  • event_begin 7/15/2016
  • event_end 7/15/2016

...ただし、データベースにカスタムフィールドのイベントが実際には1週間のイベントであることを示すイベントが2016年7月11日から2016年7月16日まであります。

上記のいずれも一致しないため、そのイベントは私のクエリから返されません。しかし技術的には、2016年7月15日(今日)に街にいる場合は、その日の営業中にそのイベントを見る(そしておそらく参加できる)はずです。

考え

通常、イベントの範囲をシリーズの各日に別々の日付として保存することはしません。私たちは(人間として)日付範囲を保存します。だから私はこれにアプローチするいくつかの論理的な方法があると確信しています。私の検索や研究で何も思いつかないのです。

ご協力ありがとうございます。

1
Will Ashworth

このような複雑なケースで、データにアクセスできない場合、meta_queryコードで考えるのは少し難しいです。 :)

持っているもの作業しているものは、次の2つの条件として表すことができます。

  • start_date BETWEEN event_beginevent_end
  • end_date BETWEEN event_beginevent_end

両方の間にあるあなたの最初のケースは関係ないようです、これら2つはとにかくそれを捕まえるので。

残りの部分で抱えている課題は、リバースロジックが必要なことです - event_beginまたはevent_end BETWEEN start_dateend_date。しかし、それらは各イベントに固有のものであるため、同じように表現することはできません。

しかし、の場合は、実際には気にしないでください。検索日の前後にあるだけです。

そのため、さらに2つの条件を次のように表すことができます。

  • start_date <= event_begin)AND(end_date> = event_begin)(イベント開始日またはその前後)
  • start_date <= event_end)AND(end_date> = event_end)(イベント終了日またはその前後)

繰り返しますが、私はこれを「理論上の」メタクエリとして書くのに苦労しますが、メタクエリは入れ子にすることができるのであなたはこれらすべてを論理に詰め込むことができるはずです。

PSパフォーマンスが考慮事項になる可能性があり、単一の複雑なクエリではなく複数の単純なクエリの集計が必要になります。

2
Rarst