结帐时Woocommerce定制产品领域

时间:2017-09-08 12:29:51

标签: php wordpress woocommerce

我有一个看似简单的任务,在我的生活中,我似乎无法理解。

我的Woocommerce产品的管理页面上有一个自定义字段。我只需要在此设置的值显示在Woocommerce Checkout页面和电子邮件中。

我已设法使用以下代码在产品页面上显示该字段:

add_action( 'woocommerce_product_options_general_product_data', 'create_shipdate_custom_field' );
function create_shipdate_custom_field() {
woocommerce_wp_text_input( array(
'id'            => '_shipdate',
'type'          => 'text',
'label'         => __('Shipping Date', 'woocommerce' ),
'description'   => '',
'desc_tip'      => 'true',
'placeholder'   =>  __('i.e. 16 December 2017', 'woocommerce' ),
) );
}

// save the data value from this custom field on product admin tab
add_action( 'woocommerce_process_product_meta', 'save_shipdate_custom_field' );
function save_shipdate_custom_field( $post_id ) {
$wc_text_field = $_POST['_shipdate'];
if ( !empty($wc_text_field) ) {
update_post_meta( $post_id, '_shipdate', esc_attr( $wc_text_field ) );
}
}

function product_date() {
echo get_post_meta( get_the_ID(), '_shipdate', true );
}

add_action('woocommerce_single_product_summary', 'product_date', 30);

我可以使用以下代码在结帐页面上显示静态文本,但它不适用于我的自定义字段:

function emaildate() { echo "This will display fine"; } 

add_action('woocommerce_order_item_meta_start', 'emaildate', 10, 1);

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您缺少几个步骤,可以在购物车/结帐页面上显示自定义值,即将自定义字段存储在购物车中,并按顺序存储为元数据。以下是应该按预期工作的完整代码:

 // create the custom field on product admin tab
add_action( 'woocommerce_product_options_general_product_data', 'create_shipping_custom_field' );
function create_shipping_custom_field() {
    // Create a custom text field
    woocommerce_wp_text_input( array(
        'id'            => '_shipdate',
        'type'          => 'text',
        'label'         => __('Shipping Date', 'woocommerce' ),
        'description'   => '',
        'desc_tip'      => 'true',
        'placeholder'   =>  __('i.e. 16 December 2017', 'woocommerce' ),
    ) );
}

// save the data value from this custom field on product admin tab
add_action( 'woocommerce_process_product_meta', 'save_shipping_custom_field' );
function save_shipping_custom_field( $post_id ) {
    $wc_text_field = $_POST['_shipdate'];
    if ( !empty($wc_text_field) ) {
        update_post_meta( $post_id, '_shipdate', esc_attr( $wc_text_field ) );
    }
}

// Store custom field in Cart
add_action( 'woocommerce_add_cart_item_data', 'store_shipping_custom_field', 10, 2 );
function store_shipping_custom_field( $cart_item_data, $product_id ) {
    $ship_date = get_post_meta( $product_id , '_shipdate', true );
    if( !empty($ship_date) ) {
        $cart_item_data[ '_shipdate' ] = $ship_date;

        $cart_item_data['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'date_shipping', $ship_date );
    }
    return $cart_item_data;
}


// Render meta on cart and checkout
add_filter( 'woocommerce_get_item_data', 'rendering_meta_field_on_cart_and_checkout', 10, 2 );
function rendering_meta_field_on_cart_and_checkout( $cart_data, $cart_item ) {
    $custom_items = array();
    // Woo 2.4.2 updates
    if( !empty( $cart_data ) ) {
        $custom_items = $cart_data;
    }
    if( isset( $cart_item['_shipdate'] ) ) {
        $custom_items[] = array( "name" => __( "Shipping Date", "woocommerce" ), "value" => $cart_item['_shipdate'] );
    }
    return $custom_items;
}

// Add the information in the order as meta data
add_action('woocommerce_add_order_item_meta','add_shipping_to_order_item_meta', 1, 3 );
function add_shipping_to_order_item_meta( $item_id, $values, $cart_item_key ) {
    $prod_id = wc_get_order_item_meta( $item_id, '_product_id', true );
    $shipdate = get_post_meta( $prod_id, '_shipdate', true );
    wc_add_order_item_meta( $item_id, 'Shipping Date', $shipdate, true );
}