Changement du script d'un widget de booking

Salah -  
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je suis entrain de créer un site web de réservation en ligne. J'utilise wordpress, plus précisément un thème qui s'appelle Listeo.

Ce thème contient un widget qui permet de rechercher les produits non réservés entre une période X et Y. Cependant le widget est conçu de sorte à retourner les produits qui ne sont réservés pendant aucun jour entre la période X et Y (Similaire aux réservations des hôtels). Je souhaiterai changer le code du widget de sorte à retourner les produits qui ne sont pas réservés pendant au moins un jour entre la période X et Y. 

J'ai repéré le fichier .php et les lignes de code de ce widget. 

function listeo_date_range_filter( $where ) {
    
    global $wpdb;

    $date_range = get_query_var( 'date_range' );
    
    if(!empty($date_range)) : 
//TODO replace / with - if first is day - month- year
        $dates = explode(' - ',$date_range);
        //setcookie('listeo_date_range', $date_range, time()+31556926);
        $date_start = $dates[0];
        $date_end = $dates[1];
        
        $date_start_object = DateTime::createFromFormat('!'.listeo_date_time_wp_format_php(), $date_start);
        $date_end_object = DateTime::createFromFormat('!'.listeo_date_time_wp_format_php(), $date_end);
        
        $format_date_start     = esc_sql($date_start_object->format("Y-m-d H:i:s"));
        $format_date_end     = esc_sql($date_end_object->format("Y-m-d H:i:s"));

        // $format_date_start = esc_sql ( date( "Y-m-d H:i:s", strtotime( $wpdb->esc_like( $date_start ) ) ) );
        // $format_date_end = esc_sql ( date( "Y-m-d H:i:s", strtotime( $wpdb->esc_like( $date_end ) ) ) );
        // //    
        // $booking_hours = Listeo_Core_Bookings_Calendar::wpk_change_booking_hours( $date_start, $date_end );
  //       $date_start = $booking_hours[ 'date_start' ];
  //       $date_end = $booking_hours[ 'date_end' ];

         $table_name = $wpdb->prefix . 'bookings_calendar';
             
        $where .= $GLOBALS['wpdb']->prepare(  " AND {$wpdb->prefix}posts.ID ".
            'NOT IN ( '.
                'SELECT listing_id '.
                "FROM {$wpdb->prefix}bookings_calendar ".
                'WHERE 
                (( %s > date_start AND %s < date_end ) 
                OR 
                ( %s > date_start AND %s < date_end ) 
                OR 
                ( date_start >= %s AND date_end < %s ))
                AND type = "reservation" AND NOT status="cancelled" AND NOT status="expired"
                GROUP BY listing_id '.
            ' ) ', $format_date_start, $format_date_start, $format_date_end,  $format_date_end, $format_date_start, $format_date_end );
      
       //var_dump($where);
    endif;
    
    return $where;

Merci pour votre aide.


Windows / Chrome 103.0.0.0

A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Bonjour,

Ta question concerne d'avantage les requêtes SQL que le langage PHP ... (je la déplace donc dans le bon forum)

Et pour y répondre, il suffirait d'ajouter/modifier une condition dans le WHERE de ta requête

 en utilisant la fonction DATEDIFF() 

Un truc du genre

 OR  ( %s > date_start AND %s < date_end  AND DATEFIFF(date_end, date_start) >1 ) 

0
Salah
 

Bonjour,

Au temps pour moi.

Merci de ta réponse. Juste pour être sur le code devrait ressembler à ça :

 $where .= $GLOBALS['wpdb']->prepare(  " AND {$wpdb->prefix}posts.ID ".
            'NOT IN ( '.
                'SELECT listing_id '.
                "FROM {$wpdb->prefix}bookings_calendar ".
                'WHERE 
                (( %s > date_start AND %s < date_end ) 
                OR 
                ( %s > date_start AND %s < date_end AND DATEDIFF(date_end, date_start) >1)
                AND type = "reservation" AND NOT status="cancelled" AND NOT status="expired"
                GROUP BY listing_id '.
            ' ) ', $format_date_start, $format_date_start, $format_date_end,  $format_date_end, $format_date_start, $format_date_end );

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

À mon avis tu peux supprimer le début du where...

0
Salah
 

En mettant ce code, la fonction ne retourne plus rien (No result found) :

 $where .= $GLOBALS['wpdb']->prepare(  " AND {$wpdb->prefix}posts.ID ".
            'NOT IN ( '.
                'SELECT listing_id '.
                "FROM {$wpdb->prefix}bookings_calendar ".
                'WHERE 
                (( %s > date_start AND %s < date_end AND DATEDIFF(date_end, date_start) >1)
                AND type = "reservation" AND NOT status="cancelled" AND NOT status="expired"
                GROUP BY listing_id '.
            ' ) ', $format_date_start, $format_date_start, $format_date_end,  $format_date_end, $format_date_start, $format_date_end );

0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

Il faudrait faire un echo de la requête pour ensuite pouvoir la tester DIRECTEMENT dans ta bdd (via phpmyadmin)

Essaye un truc du genre

echo $GLOBALS['wpdb']->request;
0