web-dev-qa-db-fra.com

Comment utiliser query_posts () avec un filtre de date sur un champ personnalisé?

J'ai défini un type de message personnalisé qui utilise un champ méta pour stocker les dates.

Dans mon functions.php j'ai le code suivant qui enregistre la date de début. Le format de la date envoyée dans le paramètre de formulaire startdate est 2010/12/01 9:00 AM

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", $_POST["startdate"]);
}

J'essaie de sortir une liste de tous les événements avec un startdate plus tard que l'heure actuelle.

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.date("Y/m/d h:i A"),
    'meta_compare=>'
));

Ceci liste tous les événements indépendamment de leur date de début. Qu'est-ce que je fais mal?

RESOLU:

Pour une raison quelconque, après avoir changé mon code à la suivante, cela fonctionne.

$args = array(
    'post_type' => array('seminar'),
    'showposts' => 3,
    'meta_key' => 'startdate',
    'meta_value' => date("Y/m/d h:i A"),
    'meta_compare' => '>',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

$seminars = get_posts($args);

Je vais sélectionner la réponse de @Rarst comme réponse acceptée, car j’ai eu de multiples problèmes à régler ici, mais il a mieux abordé la question du titre.

@ sorich87 avait un bon point sur la manière dont j'aurais dû stocker les dates sous forme d'horodatages, mais à la fin, @Rarst avait raison de dire que si je spécifiais un argument de format pour la fonction date() qui correspond au format utilisé lors du stockage des données dans le répertoire. base de données, alors je devrais être en mesure de comparer les données.

Merci pour votre aide.

2
jessegavin

Vous stockez la date en tant que chaîne formatée, mais la fonction time() que vous utilisez pour la comparaison renvoie un horodatage numérique. Vous essayez donc de faire la comparaison entre des formats trop différents et il est peu probable que WP soit assez intelligent pour l'obtenir.

2
Rarst

Je voudrais convertir la date en un horodatage avant de la stocker:

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"]));
}

Et utilisez l'horodatage actuel pour faire la comparaison:

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.time(),
    'meta_compare=>'
));
3
sorich87

Peut-être que cela ferait l'affaire?

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key' => 'startdate',
    'orderby'=> 'meta_value',
    'order' => 'ASC'
));
1
Emrikol
  1. Enregistrer la valeur dans la base de données comme:

    'enddate'   =>  date('Y-m-d');
    
  2. Générer une méta requête comme:

Une condition :

$conArr[0]  =    array
(
'key'=> 'enddate',
'value' => date('Y-m-d'),
'compare' => '>=',
);

B. Requête:

$args = array(
    'meta_query'=>$conArr ,
    'post_type'=>'tournament',
    'orderby' => 'meta_value_num', 
)

Important 'orderby' => 'meta_value_num', et format de date sont importants.

0
user2823361