【问题标题】:Woocommerce Booking Add custom order item meta dataWoocommerce Booking 添加自定义订单商品元数据
【发布时间】:2021-02-08 22:52:37
【问题描述】:

寻求帮助, 目的是在客户结账时捕获几位数据,并将这些数据存储为自定义订单商品元数据。

我想抓拍

  • 开始日期
  • 开始时间
  • 结束日期
  • 结束时间

对于当前使用 WooCommerce 预订的每个订单,此数据直接进入预订区域,不会显示为自定义订单项目元数据。

我在尝试自己创建代码时找到了挂钩和过滤器的列表,但是我认为我在此过程中遗漏了一些内容:

我尝试创建此代码以将这些商品添加到自定义订单商品元数据中,但没有多大成功。

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $fields['woocommerce_bookings_after_booking_base_cost'] ) ) {
        update_post_meta( $order_id, 'woocommerce_bookings_after_booking_base_cost', sanitize_text_field( $_POST['woocommerce_bookings_after_booking_base_cost'] ) );
    }
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('woocommerce_bookings_after_booking_base_cost').':</strong> <br/>' . get_post_meta( $order->get_id(), 'woocommerce_bookings_after_booking_base_cost', true ) . '</p>';
}

我希望有人以前遇到过这个问题并且可以分享他们的知识,或者有人可以为我指明正确的方向或帮助我进行编码,很高兴承认我不是最擅长编码但如果有人可以帮助打破让我知道我在哪里做错了,我做错了什么,也许我做对了,所以我可以理解如何改进。

有什么帮助吗?

我也找到了这段代码,但是没有设置自定义订单元数据,

WOE_Bookings{
    function __construct() {
        add_filter('woe_get_order_product_fields',array($this,'add_product_fields') );
        add_filter('woe_get_order_product_item',array($this,'fetch_booking') );
        
        //set global filters
        add_filter('woe_get_order_product_value_booking_status', array($this,'get_booking_field_status'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_start_date', array($this,'get_booking_field_start_date'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_start_time', array($this,'get_booking_field_start_time'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_end_date', array($this,'get_booking_field_end_date'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_end_time', array($this,'get_booking_field_end_time'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_resource', array($this,'get_booking_field_resource'), 10, 5 );
        add_filter('woe_get_order_product_value_booking_persons_total', array($this,'get_booking_field_persons_total'), 10, 5 );
        
        // add function for person types 
        if( class_exists("WC_Product_Booking_Data_Store_CPT") AND method_exists("WC_Product_Booking_Data_Store_CPT", "get_person_types_ids") ) {
            $person_types_ids = WC_Product_Booking_Data_Store_CPT::get_person_types_ids();
            foreach($person_types_ids as $type_id) {
                add_filter('woe_get_order_product_value_booking_person_type_'.$type_id, function($value,$order, $item, $product, $item_meta) use ($type_id){
                    if (!$this->booking) 
                        return $value;
                    $counters = $this->booking->get_person_counts();
                    return isset($counters[$type_id]) ? $counters[$type_id] : 0;
                }, 10, 5 );
            }   
        }
    }   
    
    function add_product_fields($fields) {
        $fields['booking_status'] = array('label'=>'Booking Status','colname'=>'Booking Status','checked'=>1);
        $fields['booking_start_date'] = array('label'=>'Booking Start Date','colname'=>'Booking Start Date','checked'=>1);
        $fields['booking_start_time'] = array('label'=>'Booking Start Time','colname'=>'Booking Start Time','checked'=>1);
        $fields['booking_end_date'] = array('label'=>'Booking End Date','colname'=>'Booking End Date','checked'=>1);
        $fields['booking_end_time'] = array('label'=>'Booking End Time','colname'=>'Booking End Time','checked'=>1);
        $fields['booking_resource'] = array('label'=>'Booking Resource','colname'=>'Booking Resource','checked'=>1);
        $fields['booking_persons_total'] = array('label'=>'Booking # of Persons','colname'=>'Booking Persons Total','checked'=>1,'segment'=>'cart');
        
        // add person types as columns 
        if( class_exists("WC_Product_Booking_Data_Store_CPT") AND method_exists("WC_Product_Booking_Data_Store_CPT", "get_person_types_ids") ) {
            $person_types_ids = WC_Product_Booking_Data_Store_CPT::get_person_types_ids();
            foreach($person_types_ids as $type_id) {
                $post = get_post($type_id);
                if( $post  )
                    $fields['booking_person_type_'.$type_id] = array('label'=>'Booking Persons - ' .$post->post_title,'colname'=>'Booking Persons - ' .$post->post_title,'checked'=>1);
            }   
        }
        return $fields;
    }
    
    // booking for item 
    function fetch_booking($item) {
        global $wpdb;
        $this->booking = false;
        $booking_id = $wpdb->get_var( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key= '_booking_order_item_id' AND meta_value=" . intval( $item->get_id() ) );
        if( $booking_id ) {
            $this->booking =  new WC_Booking($booking_id);
        }
        return $item;
    }
    
    function get_booking_field_status($value,$order, $item, $product, $item_meta) {
        return $this->booking ? $this->booking->get_status() : $value;
    }       
    function get_booking_field_start_date($value,$order, $item, $product, $item_meta) {
        return $this->booking ? date_i18n( wc_date_format(), $this->booking->start) : $value;
    }       
    function get_booking_field_start_time($value,$order, $item, $product, $item_meta) {
        return $this->booking ? date_i18n( wc_time_format(), $this->booking->start) : $value;
    }       
    function get_booking_field_end_date($value,$order, $item, $product, $item_meta) {
        return $this->booking ? date_i18n( wc_date_format(), $this->booking->end) : $value;
    }       
    function get_booking_field_end_time($value,$order, $item, $product, $item_meta) {
        return $this->booking ? date_i18n( wc_time_format(), $this->booking->end) : $value;
    }       
    function get_booking_field_resource($value,$order, $item, $product, $item_meta) {
        if (!$this->booking) 
            return $value;
        $resource = $this->booking->get_resource();
        return $resource ? $resource->get_name() : $value;
    }       
    function get_booking_field_persons_total($value,$order, $item, $product,$item_meta) {
        return $this->booking ? $this->booking->get_persons_total() : $value;
    }       
}   
new WOE_Bookings();






add_action( 'woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 2);
function add_order_item_meta ( $item_id, $values ) {
    if ( isset( $values [ 'booking_start_date' ] ) ) {
        $custom_data  = $values [ 'booking_start_date' ];
        wc_add_order_item_meta( $item_id, ‘date',           
        $custom_data['booking_start_date'] );
    }
}

【问题讨论】:

    标签: php wordpress woocommerce metadata woocommerce-bookings


    【解决方案1】:

    您无需向订单添加任何自定义元数据,因为您可以轻松检索它(正如您所期望的那样)。

    您将在以下代码示例中看到,该示例在送货地址下方的管理单笔订单中显示开始日期、开始时间、结束日期和结束时间:

    add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_some_booking_data_to_admin_orders', 10, 1 );
    function display_some_booking_data_to_admin_orders( $order ){
        // Retreive the booking Ids that belong to an order
        $bookings_ids = get_posts( array(
            'posts_per_page' => -1,
            'post_type'      => 'wc_booking', // booking post type
            'post_parent'    => $order->get_id(),
            'post_status'    => 'all',
            'fields'         => 'ids',
        ) );
    
        if( ! empty($bookings_ids) ) {
            echo '<div class="booking-items">';
    
            // Loop through Bookings for the current order
            foreach ( $bookings_ids as $booking_id ) {
                // Get an instance of the WC_Booking Object
                $booking = new WC_Booking( $booking_id );
    
                // Get the related instance of the order Item Object
                $item = $order->get_item($booking->order_item_id);
    
                $name = $item->get_name(); // Get product name
    
                // Start date and time
                $start_datetime = $booking->get_start_date();
                $start_dt_array = explode(', ', $start_datetime);
                $start_date     = reset($start_dt_array); // Start date
                $start_time     = end($start_dt_array); // Start time
    
                // End date and time
                $end_datetime   = $booking->get_end_date();
                $end_dt_array   = explode(', ', $end_datetime);
                $end_date       = reset($end_dt_array); // End date
                $end_time       = end($end_dt_array); // End time
    
                echo '<table style="border:solid 1px #eee; margin-bottom:12px;">
                    <thead style="background-color: #eee;">
                        <tr><td><strong>' . __("Booking") . ':</strong></td><td> ' . $name . ' <em><small>(' . $booking_id . ')</small></em></td></tr>
                    </thead>
                    <tbody>
                        <tr><td><strong>' . __("Start date") . ':</strong></td><td>' . $start_datetime . '</td></tr>
                        <tr><td><strong>' . __("End date")   . ':</strong></td><td>' . $end_datetime   . '</td></tr>
                    </tbody>
                </table>';
            }
            echo '</div>';
        }
    }
    

    代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


    导出订单数据的补充

    将预订数据保存为自定义订单元数据(仅处理一个预订):

    add_action( 'woocommerce_checkout_create_order', 'display_some_booking_data_to_admin_orders', 10, 1 );
    function display_some_booking_data_to_admin_orders( $order ){
        $cart_items = WC()->cart->get_cart(); // Get cart items
        $cart_item  = reset($cart_item); // First cart item
    
        if( isset($cart_item['booking']) && ! empty($cart_item['booking']) ) {
            $booking_id = $cart_item['booking']['_booking_id'];
    
            $order->update_meta_data( '_booking_id', $booking_id ); // Save booking Id
    
            // Get an instance of the WC_Booking Object
            $booking = new WC_Booking( $cart_item['booking']['_booking_id'] );
    
            // Start date and time
            $start_datetime = $booking->get_start_date();
            $start_dt_array = explode(', ', $start_datetime);
    
            $order->update_meta_data( 'booking_start_datetime', $start_datetime ); // Save start date and time
            $order->update_meta_data( 'booking_start_date', reset($start_dt_array) ); // Save start date
            $order->update_meta_data( 'booking_start_time', end($start_dt_array) ); // Save start time
    
            // End date and time
            $end_datetime   = $booking->get_end_date();
            $end_dt_array   = explode(', ', $end_datetime);
    
            $order->update_meta_data( 'booking_end_datetime', $end_datetime ); // Save end date and time
            $order->update_meta_data( 'booking_end_date', reset($end_dt_array) ); // Save end date
            $order->update_meta_data( 'booking_end_time', end($end_dt_array) ); // Save end time
    
            // Cost and quantiity
            $order->update_meta_data( 'booking_cost', $cart_item['booking']['_cost'] ); // Save cost
            $order->update_meta_data( 'booking_qty', $cart_item['booking']['_qty'] ); // Save quantity
        }
    }
    

    代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    这将允许您使用插件导出预订数据。

    【讨论】:

    • 他,谢谢你的帮助,但我真的需要它进入自定义元数据,这是因为我使用插件 Advanced Order Export For WooCommerce (Pro),我需要这些数据进入元数据字段,以便我可以使用它来过滤订单。例如,我希望能够导出只有今天开始日期等的订单。我希望现在更有意义
    • 嗨,老实说,我不确定我是否完全理解您的评论。我知道它应该设置为订单项元数据。是的,插件处理订单项目元数据,这就是为什么我需要创建它,以便导出插件能够处理和识别它,所以当我们导出时,它会正确输出。我不确定哪种类型的代码最诚实,因为代码需要知道订单中可能有 2 个日期,并且喜欢这些日期和正确产品的开始/结束时间。有点乱,谢谢你的帮助,我真的很感激
    • 好的,谢谢,然后我可以单独添加它们,并给它一个概述,以便其他有问题的人可以看到每个问题的优缺点。我真的很感谢你的帮助。再次感谢您
    • @AlasdairMacEwan 我添加了一个附加代码,将一个预订数据保存为自定义订单元数据 5 测试并有效)。如果这个答案回答了你的问题,你可以请accept回答,如果你喜欢/想要你也可以请upvote回答,谢谢。
    • 嗨,再次感谢您的帮助,为了进一步了解这一点,我可以将其放入一个循环中,如果有两个预订,它将添加到自定义字段订单元数据,因此,例如,如果订单包含 2 个预订,则它的预订 1 开始日期,然后将其与开始时间 1 和结束日期 1 和结束时间 1、1 相关联,它是该订单中的第一个预订,那么它将为预订 2 创建另一个元数据字段,为其开始时间,然后为第二个预订开始日期、结束日期等创建另一个字段。
    【解决方案2】:

    请使用此解决方案按开始日期过滤 https://wordpress.org/support/topic/filter-by-bookings-start-date/#post-12908495

    如果您仍然需要帮助 - 请提交工单至https://algolplus.freshdesk.com/

    谢谢,亚历克斯 (支持 WooCommerce 的高级订单导出)

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2021-06-15
      • 2019-05-10
      • 2013-04-20
      • 2018-01-03
      • 2021-04-05
      • 2021-06-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多