web-dev-qa-db-fra.com

Comment filtrer une date jj/mm/aaaa d'un champ personnalisé dans une requête

J'essaie de créer une requête afin de trier certaines publications en fonction d'un champ personnalisé de date, où les dates sont formatées jj/mm/aaaa.

Cela fonctionne en interrogeant directement la base de données avec get_results comme dans cet exemple:

$querystr = "
    SELECT *
    FROM wp_posts, wp_postmeta
    WHERE wp_posts.ID = wp_postmeta.post_id
    AND wp_postmeta.meta_key = 'my_cutom_date'
    AND wp_posts.post_status = 'publish'
    AND wp_posts.post_type = 'post'
    ORDER BY STR_TO_DATE(wp_postmeta.meta_value, '%d/%m/%Y') ASC
";

Mais je voudrais transposer ce comportement à un WP_Query, en utilisant un filtre posts_where. Je suis allé aussi loin que ça:

$args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => 10,
    'meta_key' => 'my_custom_date'
); 

function filter_orderby( $orderby = '' ) {  
    global $wpdb;
    $orderby .= " ORDER BY STR_TO_DATE($wpdb->postmeta.meta_value, '%d/%m/%Y') ASC ";
    return $orderby;
}

add_filter( 'posts_orderby', 'filter_orderby' );

Mais cela ne semble rien renvoyer. Qu'est-ce que je rate ?

2
mike23

Le filtre sur posts_orderby devrait renvoyer une chaîne qui ne commence pas par ORDER BY; WordPress l'ajoutera lui-même .

Par défaut, WordPress filtrera par post_date. Si vous ne le souhaitez pas, vous devez écraser la clause order, sans l'ajouter. Donc, votre filtre devrait ressembler à ceci:

function filter_orderby( $orderby ) {  
    global $wpdb;
    return " STR_TO_DATE({$wpdb->postmeta}.meta_value, '%d/%m/%Y') ASC ";
}
4
Jan Fabry