2017-02-20 4 views
2

Я хочу указать дату окончания бронирования, а также дату начала. Теперь у меня есть следующее:Бронирование WooCommerce: добавление и переупорядочение данных элемента в корзине и оформление заказа

add_filter('woocommerce_get_item_data', 'display_booking_date', 10, 2); 
function display_booking_date($item_data, $cart_item){ 

    if (! empty($cart_item['booking'])) { 

     $date_format = apply_filters('woocommerce_bookings_date_format', wc_date_format()); 
     $end_date = apply_filters('woocommerce_bookings_get_end_date_with_time', date_i18n($date_format, $cart_item['booking']['_end_date'])); 

     $item_data[] = array(
      'key' => __('End Date', 'your-textdomain'), 
      'value' => $cart_item['booking']['_end_date'], 
      'display' => $end_date, 
     ); 
    } 
    return $item_data; 
} 

Это позволяет мне отображать дату окончания бронирования. Однако это происходит после любых других метаданных, которые я не хочу. Есть ли способ, что я мог бы либо:

1) Изменение, где дата окончания появляется так, что появляется после Даты начала и не после того, как все другие мета-данные

2) Еще лучше было бы иметь дату начала и окончания вместе как один бит метаданных.

Спасибо!

ответ

2

код слегка обновлен

Да, это возможно, но вы должны знать данные позиции key для «Дата начала» ... Вот я REORDER, что данные предметы.

Но невозможно иметь дату начала и окончания (потому что вы можете иметь только в массиве 1, 1 и 1 дисплее). То, что может быть возможно, заключается в объединении обоих значений и обоих дисплеев вместе.

При необходимости, чтобы отобразить исходные данные из $item_data аргумента можно использовать print_r($item_data); внутри вашей функции до return в конце.

Вот этот код:

add_filter('woocommerce_get_item_data', 'display_booking_date', 10, 2); 
function display_booking_date($item_data, $cart_item){ 

    if (! empty($cart_item['booking'])) { 

     // ==> HERE define your real START DATE 'name' 
     $item_data_start_date_name = __('Start Date', 'your-textdomain'); // or just 'Start Date' … 

     $date_format = apply_filters('woocommerce_bookings_date_format', wc_date_format()); 
     $end_date = apply_filters('woocommerce_bookings_get_end_date_with_time', date_i18n($date_format, $cart_item['booking']['_end_date'])); 

     $item_data_end_date_array = array(
      'key' => __('End Date', 'your-textdomain'), 
      'value' => $cart_item['booking']['_end_date'], 
      'display' => $end_date, 
     ); 

     $new_item_data = array(); 
     $count = 0; 

     //iteratting throug each item_data values 
     foreach($item_data as $key => $value){ 
      // If we find the "start date" we set just afer the "end date" 
      if($value['name'] == $item_data_start_date_name){ 
       $new_item_data[$count] = $value; 
       $count++; 
       $new_item_data[$count] = $item_data_end_date_array; 
       $count++; 
      } else { 
       $new_item_data[$count] = $value; 
       $count++; 
      } 
     } 
     return $new_item_data; 
    } else { 
     return $item_data; 
    } 
} 

код идет в function.php файле Вашего активного ребенка темы (или темы), или же в любом файле плагина.

Код проверен другими способами и должен работать на вас.

+0

Hi Loic, Спасибо за помощь. Я, кажется, получаю предупреждение, хотя он говорит следующее: Предупреждение: неверный аргумент, предоставленный foreach() в/home/jonath59/public_html/lashis/wp-content/plugins/woocommerce/includes/class-wc-cart. php on line 591 Любая идея, что может быть причиной этого? – DigM

+0

Hi Loic, ваш отредактированный ответ почти сработал. Кажется, я не возвращал ключи из моего item_data, и это вызывало предупреждение. Вместо этого я, казалось, получал ['name'], поэтому я изменил оператор if, чтобы сказать if ($ value ['name'] == $ item_data_start_date_key), который затем работал. – DigM

+0

Да, это так. Спасибо за вашу помощь! – DigM

Смежные вопросы