2015-06-08 16 views
7

używam Woothemes booking na mojej stronie woocommerceZapytanie rezerwacja woocommerce według daty dostępności

Jak zbudować własny poszukiwania produktów, muszę sprawdzić dostępność Również tutaj jest jak ja powinien zarządzać wolne od BO Booking plugin B.O i jak wtyczki magazyny do bazy

a:8:{i:0;a:4:{s:4:"type";s:4:"days";s:8:"bookable";s:3:"yes";s:4:"from";s:1:"3";s:2:"to";s:1:"3";}i:1;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-09";s:2:"to";s:10:"2015-07-09";}i:2;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-08";s:2:"to";s:10:"2015-07-08";}i:3;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-10";s:2:"to";s:10:"2015-07-10";}i:4;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-15";s:2:"to";s:10:"2015-07-15";}i:5;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-16";s:2:"to";s:10:"2015-07-16";}i:6;a:4:{s:4:"type";s:6:"custom";s:8:"bookable";s:3:"yes";s:4:"from";s:10:"2015-07-17";s:2:"to";s:10:"2015-07-17";}i:7;a:4:{s:4:"type";s:6:"months";s:8:"bookable";s:2:"no";s:4:"from";s:1:"8";s:2:"to";s:1:"8";}} 

mogę pobrać te wartości z wordPress wbudowaną funkcję get_post_meta,

$avail = get_post_meta($product->id, '_wc_booking_availability'); 

, a wynik jest:

Array 
(
[0] => Array 
    (
     [type] => days 
     [bookable] => yes 
     [from] => 3 
     [to] => 3 
    ) 

[1] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-09 
     [to] => 2015-07-09 
    ) 

[2] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-08 
     [to] => 2015-07-08 
    ) 

[3] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-10 
     [to] => 2015-07-10 
    ) 

[4] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-15 
     [to] => 2015-07-15 
    ) 

[5] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-16 
     [to] => 2015-07-16 
    ) 

[6] => Array 
    (
     [type] => custom 
     [bookable] => yes 
     [from] => 2015-07-17 
     [to] => 2015-07-17 
    ) 

[7] => Array 
    (
     [type] => months 
     [bookable] => no 
     [from] => 8 
     [to] => 8 
    ) 

) 

Jak widać użytkownik jest w stanie określić, czy produkt jest bezpośrednio lub nie w przedziale od dnia lub miesiąca, więc moje pytanie brzmi: w jaki sposób mogę zrobić zapytania SQL w celu sprawdzenia, czy data zmienna jest dostępna dla tego produktu, myślę, że meta_query wykona zadanie (jak poniżej), ale jak mogę określić dla niedostępnej daty? Jak myślisz?

if($_GET['when']){ 

     /* checkIsAValidDate() >> check date format */ 
     if (checkIsAValidDate($_GET['when'])){ 
      $quand = $_GET['when']; 
      $available = array(
       "post_type" => "product", 
       "meta_query" => array(
        "relation" => "AND", 
        "key"  => '_wc_booking_availability', 
        "value"  => $when, 
        'compare' => 'IN' 
       ) 
      ); 

     } 
    } 

Odpowiedz

1

Ponieważ wartością meta jest tablica, it may not be possible to use WP_Meta_Query. Podczas gdy zgadzam się, że używanie WP_Meta_Query wydaje się być bardziej eleganckim sposobem, aby to zrobić, zawsze uważałem, że ta funkcja jest naprawdę myląca, a ponieważ można uzyskać tablicę obiektów do rezerwacji, wydaje się, że byłoby prostym napisanie funkcji takiej jak:

/** 
* Returns an array of bookable products according to supplied criteria 
* 
* @param int $pid  the $product->ID of the bookable object 
* @param mixed $when  a date in YYYY-MM-DD format or integer representing a day or month 
* @param string $type  a value of 'day', 'month', or 'custom' 
* @param string $bookable whether the bookable object is bookable or not ('yes' or 'no') 
* @return array   an array of bookable objects for the product 
*/ 
function getBookables($pid, $when, $type, $bookable = 'yes') { 
    $result = array(); 

    // is $when in the YYYY-MM-DD format? 
    if ('custom' == $type) { 
     // it's a custom date so convert $when to DateTime 
     $when = DateTime::createFromFormat('Y-m-d', $when); 
    } 

    $availability = get_post_meta($pid, '_wc_booking_availability'); 
    foreach ($availability as $a) { 
     if ($a[ 'bookable' ] == $bookable) { 
      // is it in the YYYY-MM-DD format? 
      if ($when instanceof DateTime) { 
       // it's a custom date so use date compare 
       $from = DateTime::createFromFormat('Y-m-d', $a[ 'from' ]); 
       $to = DateTime::createFromFormat('Y-m-d', $a[ 'to' ]); 
       if ($when >= $from && $when <= $to) { 
        $result[] = $a; 
       } 
      } else { 
       // it is an integer value (day or month) 
       if ($type == $a[ 'type' ] && ($when >= $from && $when <= $to)) { 
        $result[] = $a; 
       } 
      } 
     } 
    } 
    return $result; 
} 

Zauważ, że jest to prawdopodobnie konieczne do zabicia type do funkcji wyszukiwania, ponieważ mimo, że mogę odróżnić YYYY-MM-DD wartości od int wartości, nie ma łatwego sposobu, aby odróżnić month z day wartości. Jako takie można użyć powyższej funkcji:

if ($_GET[ 'when' ] && $_GET[ 'type' ]) { 
    $when = $_GET[ 'when' ]; 
    $type = $_GET[ 'type' ]; 
    $bookables = getBookables($product->ID, $when, $type); 
} 

Należy również zauważyć, że jeśli przejdą ciąg 'no' jako czwarty parametr do funkcji można uzyskać listę niedostępnych czasów.

Mam nadzieję, że to pomoże!