在购物车和结账时显示 WooCommerce 自定义产品字段元数据 [英] Display WooCommerce custom product field meta data in Cart and on Checkout

查看:56
本文介绍了在购物车和结账时显示 WooCommerce 自定义产品字段元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我没有收到任何错误(调试在 wp-config 中打开),没有通知——没有.在购物车和结账时,未显示任何数据.

这是我的代码:

add_action('woocommerce_product_options_general_product_data', 'product_delivery_time');函数product_delivery_time(){全球 $woocommerce, $post;echo '

';woocommerce_wp_text_input(大批('id' =>'_shipping_field','占位符' =>'以天为单位的运输时间','标签' =>__('发货时间', 'woocommerce'),'desc_tip' =>'真的'));回声'</div>';}add_action('woocommerce_process_product_meta', 'product_delivery_time_save');功能 product_delivery_time_save( $post_id ) {如果(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 ) {如果(!空($_POST['_shipping_field'])){$cart_item_data['_shipping_field'] = sanitize_text_field( $_POST['_shipping_field'] );}返回 $cart_item_data;}add_filter( 'woocommerce_get_item_data', 'delivery_time_in_cart_display', 10, 2 );函数 delivery_time_in_cart_display( $item_data, $cart_item ) {如果(!空($cart_item['_shipping_field'])){$item_data[] = 数组('键' =>'_shipping_field','价值' =>$cart_item['_shipping_field'],'显示' =>'',);}返回 $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 ) {如果(!空($values['_shipping_field'])){$item->add_meta_data( '交货时间:', $values['_shipping_field'] );}}

解决方案

你有一些小错误,应该够了

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

所以你得到

//添加字段函数 product_delivery_time() {echo '

';woocommerce_wp_text_input(数组('id' =>'_shipping_field','占位符' =>'以天为单位的运输时间','标签' =>__('发货时间', 'woocommerce'),'desc_tip' =>'真的'));回声'</div>';}add_action('woocommerce_product_options_general_product_data', 'product_delivery_time', 10, 0);//保存字段函数 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);//在购物车上显示 &结帐页面函数 delivery_time_in_cart_display( $item_data, $cart_item ) {$shipping_field = $cart_item['data']->get_meta('_shipping_field');如果(!空($shipping_field)){$item_data[] = 数组('名称' =>__('航运领域', 'woocommerce'),'价值' =>$shipping_field,);}返回 $item_data;}add_filter( 'woocommerce_get_item_data', 'delivery_time_in_cart_display', 10, 2 );//在订单和电子邮件通知中随处显示商品数据function delivery_time_in_order_display( $item, $cart_item_key, $values, $order ) {$shipping_field = $values['data']->get_meta('_shipping_field');如果(!空($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);

I've created a custom product field (admin). The field works fine and it saves the data just fine.

What I am having problems with it is adding the meta data to the cart and checkout.

I get no errors (debug turned on in wp-config), no notices -- nothing. In the cart and on checkout, no data is shown.

This is my code:

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'] );
    }
}

解决方案

You have some minor mistakes, this should suffice

  • Note the use of woocommerce_admin_process_product_object to save instead of the outdated woocommerce_process_product_meta hook

So you get

// 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 ); 

这篇关于在购物车和结账时显示 WooCommerce 自定义产品字段元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆