【问题标题】:Display WooCommerce custom product field meta data in cart, checkout, orders and email notifications在购物车、结帐、订单和电子邮件通知中显示 WooCommerce 自定义产品字段元数据
【发布时间】:2020-07-13 07:09:20
【问题描述】:

我创建了一个自定义产品字段(管理员)。该字段可以正常工作,并且可以很好地保存数据。

我遇到的问题是将元数据添加到购物车和结帐。

我没有收到任何错误(在wp-config 中打开了调试),没有任何通知——什么都没有。在购物车和结帐时,不显示任何数据。

这是我的代码:

add_action( 'woocommerce_product_options_general_product_data', 'product_delivery_time' );
function product_delivery_time(){

    global $woocommerce, $post;

    echo '<div class="product_custom_field">';
        woocommerce_wp_text_input(
        array(
        'id' => '_shipping_field',
        'placeholder' => 'shipping time in days',
        'label' => __('Shipping Time', 'woocommerce'),
        'desc_tip' => 'true'
        )
    );

    echo '</div>';
}

add_action( 'woocommerce_process_product_meta', 'product_delivery_time_save' );
function product_delivery_time_save( $post_id ) {

    if (isset($_POST['_shipping_field'] ) )
    update_post_meta( $post_id, '_shipping_field', esc_attr( $_POST['_shipping_field'] ) );
}

add_filter( 'woocommerce_add_cart_item_data', 'delivery_time_in_cart', 10, 3 ); 
function delivery_time_in_cart( $cart_item_data, $product_id, $variation_id ) {

    if (! empty( $_POST['_shipping_field'] ) ) {

        $cart_item_data['_shipping_field'] = sanitize_text_field( $_POST['_shipping_field'] );
    }
    
    return $cart_item_data;
}

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

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

        $item_data[] = array(
        'key' => '_shipping_field',
        'value' => $cart_item['_shipping_field'],
        'display' => '',
        );
    }
    
    return $item_data;
}

add_action( 'woocommerce_checkout_create_order_line_item', 'delivery_time_in_order_display', 10, 4 ); 
function delivery_time_in_order_display( $item, $cart_item_key, $values, $order ) {

    if (! empty($values['_shipping_field'] ) ) {

        $item->add_meta_data( 'Delivery time:', $values['_shipping_field'] );
    }
}

【问题讨论】:

    标签: wordpress woocommerce cart orders email-notifications


    【解决方案1】:

    你有一些小错误,这就足够了

    • 注意使用woocommerce_admin_process_product_object保存而不是过时的woocommerce_process_product_meta钩子

    所以你得到

    // Add field
    function product_delivery_time() {
        echo '<div class="product_custom_field">';
            woocommerce_wp_text_input( array(
                'id' => '_shipping_field',
                'placeholder' => 'shipping time in days',
                'label' => __('Shipping Time', 'woocommerce'),
                'desc_tip' => 'true'
            )
        );
    
        echo '</div>';
    }
    add_action( 'woocommerce_product_options_general_product_data', 'product_delivery_time', 10, 0 );
    
    // Save Field
    function woo_add_custom_general_fields_supplier_save( $product ) {
        if( isset($_POST['_shipping_field']) ) {
            $product->update_meta_data( '_shipping_field', esc_html( $_POST['_shipping_field'] ) );
        }
    }
    add_action( 'woocommerce_admin_process_product_object', 'woo_add_custom_general_fields_supplier_save', 10, 1 );
    
    // Display on cart & checkout pages
    function delivery_time_in_cart_display( $item_data, $cart_item ) {
        $shipping_field = $cart_item['data']->get_meta('_shipping_field');
        
        if ( ! empty( $shipping_field ) ) {
            $item_data[] = array(
                'name' => __('Shipping field', 'woocommerce'),
                'value' => $shipping_field,
            );
        }
        
        return $item_data;
    }
    add_filter( 'woocommerce_get_item_data', 'delivery_time_in_cart_display', 10, 2 );
    
    // Display item data everywhere on orders and email notifications 
    function delivery_time_in_order_display( $item, $cart_item_key, $values, $order ) {
        $shipping_field = $values['data']->get_meta('_shipping_field');
    
        if ( ! empty( $shipping_field ) ) {
            $item->update_meta_data( __( 'Shipping field', 'woocommerce'), $shipping_field );
        }
    }
    add_action( 'woocommerce_checkout_create_order_line_item', 'delivery_time_in_order_display', 10, 4 ); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 2019-08-15
      • 2020-12-07
      • 2019-07-21
      • 2017-01-10
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多