web-dev-qa-db-fra.com

Plage de dates complexe avec WP_Query et BETWEEN

Histoire

Nous avons toute une série d'événements dans un type de publication personnalisé events. Ils sont associés aux champs personnalisés suivants:

  • start_date
  • end_date

Sur le front-end, nous avons une barre latérale avec des filtres où l'utilisateur peut choisir comment il souhaite rechercher les événements (par exemple, diverses taxonomies, la date de début de son voyage en ville, la date de fin, etc.). Les entrées de recherche event_begin et event_end sont utilisées pour interroger la base de données.

Le problème

J'ai des problèmes, y compris un résultat vaguement interrogé. Les correspondances strictes apparaissent, mais la partie prenante du projet dit que la recherche est trop stricte. J'ai évoqué le concept d'abandon du champ event_end front-end dans les filtres de recherche de l'utilisateur, mais je ne suis pas tout à fait sûr que ce soit nécessaire à ce stade.

Si je recherche des événements, je peux structurer mon meta_query où:

  • les événements avec une date de début et une date de fin entre les deux dates choisies apparaîtront
  • les événements dont la date de début se situe entre les deux dates choisies apparaîtront
  • les événements dont la date de fin se situe entre les deux dates choisies apparaîtront

Mais qu'en est-il lorsque je recherche en face-à-face comme ceci:

  • event_begin 15/07/2016
  • event_end 15/07/2016

... mais avez un événement dans la base de données où ses champs personnalisés indiquent qu'il dure réellement une semaine. 7/11/2016 - 16/07/2016.

Cet événement ne reviendrait pas de ma requête, car aucune des réponses ci-dessus ne correspond. Mais techniquement, si je suis en ville le 15/07/2016 (aujourd'hui), je devrais être en mesure de voir (et éventuellement d'assister) à cet événement alors que j'étais en ville pour une journée de travail.

Pensées

En règle générale, nous ne stockons pas une plage d'événements sous forme de dates distinctes pour chaque jour de la série. Nous (en tant qu'êtres humains) stockons des plages de dates; donc je suis sûr qu'il y a un moyen logique d'aborder cela. Il suffit de ne rien trouver dans mes recherches ou mes recherches.

Merci pour votre aide et vos pensées!

1
Will Ashworth

Il est un peu difficile de penser en meta_query code pour des cas compliqués comme celui-ci et sans accès aux données. :)

Ce que vous travaillez peut être exprimé sous la forme de deux conditions suivantes:

  • start_date ENTRE event_begin et event_end
  • end_date ENTRE event_begin et event_end

Votre premier cas avec les deux entre les deux semble hors de propos, puisque ces deux vont l'attraper de toute façon.

Le défi que vous avez avec le reste est que vous voulez la logique inverse - event_begin ou event_end ENTRE start_date et end_date. Mais vous ne pouvez pas l'exprimer de la même manière car ils sont uniques à chaque événement.

Mais vous ne vous en souciez pas vraiment lorsque ils le sont, il suffit qu'ils soient proches des dates de recherche.

Donc, deux autres conditions peuvent être exprimées comme:

  • (start_date <= event_begin) AND (end_date> = event_begin) (dates de l'événement au début de la recherche ou autour de celle-ci)
  • (start_date <= event_end) AND (end_date> = event_end) (dates des événements à ou autour de la fin de la recherche)

Encore une fois, j’ai du mal à écrire cela comme méta-requête "en théorie", mais puisque les méta-requêtes peuvent être imbriquées, vous devriez être capable de ranger tout cela dans leur logique.

Les performances de PS peuvent devenir un élément à prendre en compte et nécessiter un ensemble de requêtes simples et multiples plutôt que simples.

2
Rarst