Woocommerce 将 ACF 字段保存在订单元数据中,并将其显示在购物车、订单和电子邮件中

问题描述 投票:0回答:1

我是 Woocommerce、Snippets 和 ACF 字段的新手,我在产品中创建了元字段,我想在购物车项目中获取 ACF 字段,并将它们保存在订单表中,但不起作用,我已经检查了大页面,但仍然我找不到我的需求的答案,你能帮助我吗?预先感谢。

我尝试了帖子中的代码将产品自定义字段添加到购物车并在 WooCommerce 中的任何位置显示它们

add_action( 'woocommerce_get_cart_item_from_session',  'cart_item_from_session' , 99, 2 );

function cart_item_from_session( $item_id, $data ) {
    $calories = $item_id->get_meta('acf-calories');
    $delivery_date = $item_id->get_meta('acf-delivery_date');
}

add_filter( 'woocommerce_add_order_item_meta', 'add_item_meta_order', 10, 3 );

function add_item_meta_order( $item_id, $data ) {
        wc_add_order_item_meta( $item_id, 'acf-calories', "$calories", 'acf-delivery_date', "$delivery_date");
    }

// Display on product page
add_action( 'woocommerce_before_add_to_cart_button', 'display_acf_single_product_pages', 1 );
function display_acf_single_product_pages() {
    global $product;

    $calories = get_field( 'acf-calories',  $product->get_id() );
   
    $delivery_date = get_field( 'acf-delivery_date', $product->get_id() );
   
}

// Add as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'save_acf_as_cart_item_data', 10, 2 );
function save_acf_as_cart_item_data( $cart_item_data, $cart_item ) {
    $calories = $item_id->get_meta('acf-calories');
    $delivery_date = $item_id->get_meta('acf-delivery_date');
       
        $cart_item_data['unique_key'] = md5( microtime().rand() );
}    
    return $cart_item_data;


// Display on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
    $calories = $item_id->get_meta('acf-calories');
    $delivery_date = $item_id->get_meta('acf-delivery_date');
    
    //I don't know if here I have to add some return?
}

// Display on orders and email notifications (save as custom order item meta data)
add_action( 'woocommerce_checkout_create_order_line_item', 'display_acf_on_orders_and_emails', 10, 4 );
function display_acf_on_orders_and_emails( $item, $cart_item_key, $values, $order ) {
    $calories = get_field( 'acf-calories', $values['product_id'] );
    $delivery_date = get_field( 'acf-delivery_date', $values['product_id'] );
    }


// Change displayed label for specific custom order item meta keys
add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key', 10, 3 );
function filter_wc_order_item_display_meta_key( $display_key, $meta, $item ) {

    // Change displayed label for specific order item meta key
    if( is_admin() && $item->get_type() === 'line_item' ) {
        if( $meta->key === 'acf-calories' ) {
            $display_key = __("Calories", "woocommerce");
        }
        if( $meta->key === 'acf-delivery_date' ) {
            $display_key = __("Delivery Date", "woocommerce");
        }
    }
    return $display_key;
}





woocommerce advanced-custom-fields cart orders
1个回答
0
投票

要在 WordPress、WooCommerce 和 Dokan 中为 Dokan 供应商和管理员添加自定义产品维度字段,您需要使用挂钩和过滤器。以下是代码和添加位置的说明:

将自定义字段添加到产品编辑页面: 您需要在供应商和管理员的产品编辑页面上添加产品维度的自定义字段。

// Add custom product dimensions fields
function add_product_dimensions_fields() {
?>
<div class="product_dimensions">
    <p class="form-field dimensions_length_field">
        <label for="dimensions_length"><?php _e('Length', 'your-text-domain');>
    </label>
        <input type="text" id="dimensions_length" name="_dimensions_length" class="short" value="<?php echo esc_attr(get_post_meta(get_the_ID(), '_dimensions_length', true)); ?>">
    </p>
    <p class="form-field dimensions_width_field">
        <label for="dimensions_width"><?php _e('Width', 'your-text-domain'); ?></label>
        <input type="text" id="dimensions_width" name="_dimensions_width" class="short" value="<?php echo esc_attr(get_post_meta(get_the_ID(), '_dimensions_width', true)); ?>">
    </p>
    <p class="form-field dimensions_height_field">
        <label for="dimensions_height"><?php _e('Height', 'your-text-domain'); ?></label>
        <input type="text" id="dimensions_height" name="_dimensions_height" class="short" value="<?php echo esc_attr(get_post_meta(get_the_ID(), '_dimensions_height', true)); ?>">
    </p>
</div>
<?php
}

 add_action('woocommerce_product_options_dimensions', 'add_product_dimensions_fields');
 add_action('dokan_product_edit_after_product_tags', 'add_product_dimensions_fields');

在产品更新时保存自定义字段: 当产品更新或添加时,您需要保存自定义字段。

// Save custom product dimensions fields
function save_product_dimensions_fields($post_id) {
$dimensions_length = isset($_POST['_dimensions_length']) ? wc_clean($_POST['_dimensions_length']) : '';
$dimensions_width = isset($_POST['_dimensions_width']) ? wc_clean($_POST['_dimensions_width']) : '';
$dimensions_height = isset($_POST['_dimensions_height']) ? wc_clean($_POST['_dimensions_height']) : '';

update_post_meta($post_id, '_dimensions_length', $dimensions_length);
update_post_meta($post_id, '_dimensions_width', $dimensions_width);
update_post_meta($post_id, '_dimensions_height', $dimensions_height);
}

add_action('woocommerce_process_product_meta', 'save_product_dimensions_fields');
add_action('dokan_new_product_added', 'save_product_dimensions_fields');
add_action('dokan_product_updated', 'save_product_dimensions_fields');

在前端向供应商和管理员显示字段: 要在供应商和管理前端显示自定义字段,您可以使用类似的代码。

对于 Dokan 供应商前端:

// Display custom product dimensions fields to vendors on frontend
function display_product_dimensions_on_vendor_frontend($post) {
?>
<div class="product_dimensions">
    <p><strong><?php _e('Product Dimensions:', 'your-text-domain'); ?></strong></p>
    <p><?php _e('Length:', 'your-text-domain'); ?> <?php echo esc_html(get_post_meta($post->ID, '_dimensions_length', true)); ?></p>
    <p><?php _e('Width:', 'your-text-domain'); ?> <?php echo esc_html(get_post_meta($post->ID, '_dimensions_width', true)); ?></p>
    <p><?php _e('Height:', 'your-text-domain'); ?> <?php echo esc_html(get_post_meta($post->ID, '_dimensions_height', true)); ?></p>
</div>
<?php
}
add_action('dokan_product_edit_after_main', 'display_product_dimensions_on_vendor_frontend');

对于管理前端,您可以创建自定义仪表板小部件或修改产品列表以显示维度。

在产品列表中显示产品尺寸: 用于在管理后端的产品列表中显示产品尺寸:

// Add custom columns to product list table
function add_product_dimensions_columns($columns) {
$columns['_dimensions_length'] = __('Length', 'your-text-domain');
$columns['_dimensions_width'] = __('Width', 'your-text-domain');
$columns['_dimensions_height'] = __('Height', 'your-text-domain');
return $columns;}

add_filter('manage_product_posts_columns', 'add_product_dimensions_columns');

// Display custom column data in product list table
function display_product_dimensions_columns($column, $post_id) {
if ($column === '_dimensions_length' || $column === '_dimensions_width' || $column === '_dimensions_height') {
    echo esc_html(get_post_meta($post_id, $column, true));
 }
}
add_action('manage_product_posts_custom_column', 'display_product_dimensions_columns', 10, 2);

添加代码的位置: 您应该将代码添加到主题的functions.php 文件或自定义插件中。确保将“your-text-domain”替换为您的实际文本域。

请记住首先在开发网站上测试此代码,并确保在对实时网站进行更改之前备份数据。 在哪里可以对管理产品>产品数据>运输尺寸下的运输进行罚款

© www.soinside.com 2019 - 2024. All rights reserved.