2016-01-20 2 views
1

У меня есть сайт Hotel-бронирований, который сделан в Wordpress с помощью следующей плагинов:Echo Корзина мета данные в WooCommerce (WooCommerce-бронирований)

  • WooCommerce Версия 2.4.12
  • WooCommerce-Заказ версии 1.9.3
  • Продукт-дополнения Версия 2.7.14

End Цель

Моя конечная цель: показать & Конец даты бронирования на моей странице Корзина/Оформить заказ & email.

В настоящее время я работаю над показом Конечной даты в корзине.

в Cart.php (расположен в WooCommerce-плагин) мета-данные отображаются с помощью следующего кода:

foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { 
    echo WC()->cart->get_item_data($cart_item); 
} 

Результат

Current Cart

Когда я делать var_dump() массива выше, используя следующий код:

echo '<pre>'; 

foreach(WC()->cart->get_cart() as $cart_item) { 
    var_dump($cart_item); 
} 

echo '</pre>'; 

Я могу видеть, что значение Дата окончания в этом массиве (как целое число, что странно?):

["booking"]=> 
    array(19) { 
    ["_year"]=> 
    int(2016) 
    ["_month"]=> 
    int(1) 
    ["_day"]=> 
    int(23) 
    ["_persons"]=> 
    array(1) { 
     [234]=> 
     int(1) 
    } 
    ["_date"]=> 
    string(9) "2016-1-23" 
    ["date"]=> 
    string(16) "January 23, 2016" 
    ["_time"]=> 
    string(0) "" 
    ["_qty"]=> 
    int(1) 
    ["Adults"]=> 
    int(1) 
    ["_duration_unit"]=> 
    string(3) "day" 
    ["_duration"]=> 
    int(3) 
    ["duration"]=> 
    string(8) "3 nights" 
    ["_start_date"]=> 
    int(1453507200) 
    **["_end_date"]=> 
    int(1453766399)** 
    ["_all_day"]=> 
    int(1) 
    ["_resource_id"]=> 
    int(223) 
    ["type"]=> 
    string(15) "Suite Saadienne" 
    ["_cost"]=> 
    int(360) 
    ["_booking_id"]=> 
    int(870) 
    } 

Полный код массива здесь: http://pastebin.com/1nmJHYMV

Вы можете видеть, что в конце дата присутствует, поэтому я попытался повторить его:

echo WC()->cart->get_item_data($cart_item ["booking"]["_end_date"]); 

Но это приводит: String (0) "";

Вопрос Как я могу показать конечную дату? И отформатируйте его так, чтобы он показывался как дата?

Исследование

Я нашел этот вопрос здесь, на StackOverflow: How to retrieve cart_item_data with WooCommerce? Но я не знаю, как реализовать это для моего случая?

Продукт-надстроек плагин правильно показывает свои мета-данные, чтобы я посмотрел на код, используемый, и плагин использует WooCommerce Крючки, , но я не понимаю, что эти 2 последние цифры означают?

function __construct() { 
// Add to cart 
add_filter('woocommerce_add_cart_item', array($this, 'add_cart_item'), 20, 1); 

// Load cart data per page load 
add_filter('woocommerce_get_cart_item_from_session', array($this, 'get_cart_item_from_session'), 20, 2); 

// Get item data to display 
add_filter('woocommerce_get_item_data', array($this, 'get_item_data'), 10, 2); 

// Add item data to the cart 
add_filter('woocommerce_add_cart_item_data', array($this, 'add_cart_item_data'), 10, 2); 

// Validate when adding to cart 
add_filter('woocommerce_add_to_cart_validation', array($this, 'validate_add_cart_item'), 999, 3); 

// Add meta to order 
add_action('woocommerce_add_order_item_meta', array($this, 'order_item_meta'), 10, 2); 

// order again functionality 
add_filter('woocommerce_order_again_cart_item_data', array($this, 're_add_cart_item_data'), 10, 3); 
} 

Я также нашел кусок кода, расположенный в шаблоне электронной почты, полученном администратор, который correclty показывает начало & Дату окончания. Дата окончания просто повторил, как это:

<tr> 
      <th style="text-align:left; border: 1px solid #eee;" scope="row"><?php _e('Booking End Date', 'woocommerce-bookings'); ?></th> 
      <td style="text-align:left; border: 1px solid #eee;"><?php echo $booking->get_end_date(); ?></td> 
     </tr> 

Использование $booking->get_end_date(); не работает, когда я использую его в cart.php (WooCommerce) Поскольку $booking объявлен в контроллере плагина WooCommerce Bookings как так:

public static function get_bookings_in_date_range($start_date, $end_date, $product_or_resource_id = '', $check_in_cart = true) { 
    $transient_name = 'book_dr_' . md5(http_build_query(array($start_date, $end_date, $product_or_resource_id, WC_Cache_Helper::get_transient_version('bookings')))); 

if (false === ($booking_ids = get_transient($transient_name))) { 
    $booking_ids = self::get_bookings_in_date_range_query($start_date, $end_date, $product_or_resource_id, $check_in_cart); 
    set_transient($transient_name, $booking_ids, DAY_IN_SECONDS * 30); 
} 

// Get objects 
$bookings = array(); 

foreach ($booking_ids as $booking_id) { 
    $bookings[] = get_wc_booking($booking_id); 
} 

return $bookings; 
} 
+0

+1 за очень хорошо документированный вопрос. Я предполагаю, что '$ booking-> get_end_date()' еще не работает, потому что у вас нет объекта '$ booking', и он не может определить его до окончания проверки (поэтому он должен иметь возможность использовать его на странице заказа и электронной почты, как только вы определяете '$ booking'). Но, похоже, данные находятся в тележке. Можете ли вы точно указать, где вы пытаетесь отобразить данные? – helgatheviking

+0

По этому вопросу я хочу отобразить данные в корзине покупок. Позже также на странице оформления и электронной почте заказа. $ booking я не могу использовать, потому что это переменная, сделанная в плагине для бронирования woocommerce. Но я хочу показать данные на странице из самого плагина woocommerce. Здесь переменная $ booking не объявлена, но, как вы можете видеть, конечная дата доступна в массиве $ cart_item. – Christophvh

+0

Но где в корзине? Где в порядке? Я прошу, чтобы я знал, к чему добавить код. – helgatheviking

ответ

2

Первый заказ бизнеса показывает дополнительную мета в корзине. Вы можете видеть, что фильтр woocommerce_get_item_data - это то, где вы можете добавить ключи/valules в список определений, который отображает информацию о вариации, или информацию о продукте, или дату заказа.

Я скопировал дату форматирования от даты начала и окончания методов бронирований с некоторыми незначительными упрощениями:

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

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

     $date_format = apply_filters('woocommerce_bookings_date_format', wc_date_format()); 
     $time_format = apply_filters('woocommerce_bookings_time_format', ', ' . wc_time_format()); 
     $end_date = apply_filters('woocommerce_bookings_get_end_date_with_time', date_i18n($date_format . $time_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; 
} 
+0

Отличный ответ! пару быстрых вопросов, что означают последние 2 числа в конце фильтра? ', 10, 2);' & i не нужно показанное время, поэтому я предполагаю, что есть фильтр с именем get_end_date (без времени?). & могу ли я выбрать позицию, указанную в корзине? теперь его на последней строке – Christophvh

+0

2 номера в конце - это «приоритет» и «количество переданных параметров». Вы можете больше узнать о ['add_filter()'] (https://codex.wordpress.org/Function_Reference/add_filter) и ['apply_filters()'] (https://codex.wordpress.org/Function_Reference/ apply_filters). 'woocommerce_bookings_get_end_date_with_time' * является * фильтром. Вы можете изменить положение, манипулируя массивом '$ item_data', пока вы его фильтруете. – helgatheviking

+0

большое спасибо! – Christophvh

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