web-dev-qa-db-fra.com

Comment rechercher des événements entre deux dates définies dans WP?

Je construis un site WP avec une fonctionnalité d’événements. La page des événements a été créée avec des types de publication personnalisés.

Je veux permettre aux gens de rechercher/filtrer les événements par dates. Par exemple, ils peuvent rechercher tous les événements se déroulant entre le 2 décembre 2011 et le 1er mars 2012 et obtenir des résultats d'événements dont la date est comprise entre les mois de décembre et mars (c'est-à-dire décembre, janvier, février et mars).

Je veux savoir la meilleure façon de s'y prendre. Des idées?

Vous pouvez voir un exemple de ce que je veux réaliser en consultant la fonctionnalité "Rechercher des événements par date" sur cette page http://www.londontown.com/events

Si cela ne sera pas possible, puis-je les amener à rechercher des événements se produisant entre certains mois, par exemple décembre et février (à l'exclusion des jours)?

Merci d'avance.

3

Il y a deux choses que vous devez faire pour y arriver:

1) Créer des métadonnées pour les données de chaque événement

2) Requête pour les publications en utilisant meta_query

Pour # 1, vous devez ajouter une metabox qui permet à l'utilisateur d'ajouter une date pour l'événement. Ces données doivent être stockées sous forme de métadonnées à l'aide de add_post_meta ou update_post_meta. Je vous encourage à lire sur l'ajout de métadonnées si vous ne savez pas comment le faire:

http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/

Pour # 2, en supposant que vous ayez sauvegardé les valeurs de date de manière ordonnée (par exemple, AAAA-MM-JJ), vous pouvez utiliser le paramètre meta_query de dans une nouvelle instance de WP_Query pour obtenir la plage de dates appropriée. Cette méthode suppose que votre meta_key est "_my-datetime-from". Par exemple, vous pouvez obtenir les publications en octobre et novembre 2011 avec les éléments suivants:

// Set arguments for events
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
    'post_type' => 'my-event-type',
    'posts_per_page' => -1,
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => '_my-datetime-from',
    'meta_query' => array(
        array(
            'key' => '_my-datetime-from',
            'value' => array($start, $end),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        )
    )
);
// Make the query
$events_query = new WP_query();
$events_query->query($args);
8
tollmanz

Comment stockez-vous la date de l'événement: en utilisant le champ par défaut post_date de la publication ou un champ méta personnalisé?

Si vous utilisez le post_date par défaut, vous pouvez utiliser le filtre posts_where pour ajouter des conditions de recherche, comme ceci:

// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
    // posts for March 1 to March 15, 2010
    $where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
    return $where;
}

add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );

Pour plus d'exemples, veuillez consulter le Codex .

En cas d'utilisation d'un champ personnalisé, je suppose que vous devez écrire vos propres requêtes MySQL personnalisées. C'est un peu plus compliqué. Voici un exemple:

global $wpdb;
$post_ids = $wpdb->get_col( "
    SELECT ID FROM {$wpdb->posts}
    JOIN {$wpdb->postmeta}
    WHERE ID=post_id
    AND meta_key='your_custom_meta_key'
    AND meta_value >= '2010-03-01'
    AND meta_value < '2010-03-16'
" );

foreach ( $post_ids as $post_id ) {
    $post = get_post( $post_id );
    // Do something
}
wp_reset_postdata();
2
Anh Tran