Changement du script d'un widget de booking

Fermé
Salah - 2 août 2022 à 20:20
jordane45 Messages postés 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 - 3 août 2022 à 21:39

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 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
2 août 2022 à 21:23

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

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 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
3 août 2022 à 00:46

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

0

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 38162 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 6 mai 2024 4 658
3 août 2022 à 21:39

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