好吧,我有一个问题,我想知道我如何才能创建额外的输入以上的"数量的项目"和"添加到购物车"部分,以便客户可以个性化他们的产品为自己.我希望能够在我的主题没有插件,除非任何真正满足这些目标.

我想知道是否一个好的 Select 是使用'woocommerce_before_add_to_cart_button'挂钩?我以后如何将这些输入值添加到这个产品中,以便能够在订单摘要中显示它们?

目前,我有一个代码添加字段本身.

不幸的是,这些字段不会显示在购物车,订单摘要或ACP中的订单.我做错了什么?这条路对吗?

function my_personalization_field() {
    $html = '<div class="personalization-field">';
        $html .= '<label for="personalization">Personalization:</label>';
        $html .= '<input type="text" id="personalization" name="my_personalization" />';
    $html .= '</div>';

    echo $html;
}
add_action('woocommerce_before_add_to_cart_button', 'my_personalization_field');


function my_adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
    if ( isset($values['my_personalization']) ) {
        $custom_value = $values['my_personalization'];
        wc_add_order_item_meta($item_id, 'my_personalization', $custom_value );
    }
}
add_action('woocommerce_add_order_item_meta','my_adding_custom_data_in_order_items_meta', 10, 3 );

function my_display_personalization_data_in_cart($product_name, $cart_item, $cart_item_key) {
    if(isset($cart_item['my_personalization'])) {
        $product_name .= '<br><small>Personalization: ' . esc_html($cart_item['my_personalization']) . '</small>';
    }

    return $product_name;
}
add_filter('woocommerce_cart_item_name', 'my_display_personalization_data_in_cart', 10, 3);

推荐答案

您的代码有点过时和不完整.try 使用以下替换代码在购物车、结帐、订单和邮箱通知中显示自定义字段值:

add_action('woocommerce_before_add_to_cart_button', 'single_product_custom_field_display');
function single_product_custom_field_display() {
    echo '<div class="personalization-field">
    <label for="personalization">'.__('Personalization:').'</label>
    <input type="text" id="personalization" name="personalization" />
    </div>';
}

// Save custom fields as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 20, 2 );
function add_custom_cart_item_data( $cart_item_data, $product_id ) {
    if ( isset($_POST['personalization']) ) {
        $cart_item_data['personalization'] = sanitize_text_field($_POST['personalization']);
    }
    return $cart_item_data;
}

// Display custom fields in Cart and Checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 20, 2 );
function display_custom_cart_item_data( $cart_data, $cart_item ) {
    if( isset($cart_item['personalization']) ) {
        $cart_data[] = array(
            'key'   => __('Personalization'),
            'value' => $cart_item['personalization'],
        );
    }
    return $cart_data;
}

// Save and display custom fields (custom order item metadata)
add_action( 'woocommerce_checkout_create_order_line_item', 'save_order_item_custom_meta_data6', 10, 4 );
function save_order_item_custom_meta_data6( $item, $cart_item_key, $values, $order ) {
    if( isset($values['personalization']) ) {
        $item->update_meta_data('personalization', $values['personalization']); 
    }
}

// Add readable "meta key" label name replacement
add_filter('woocommerce_order_item_display_meta_key', 'filter_wc_order_item_display_meta_key6', 10, 3 );
function filter_wc_order_item_display_meta_key6( $display_key, $meta, $item ) {
    if( $item->get_type() === 'line_item' ) {
        if( $meta->key === 'personalization' ) {
            $display_key = __('Personalization');
        }
    }
    return $display_key;
}

代码将在子主题的functions.php文件中(或插件中).测试和工作.

You will get:

在购物车和结帐页面:

enter image description here

在客户订单页面上:

enter image description here

关于邮箱通知:

enter image description here

在管理订单页面:

enter image description here

Php相关问答推荐

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

PHP DOMDocument忽略第一个表S结束标记

Laravel 10 -扩展现有的artisan命令?

如何修复条带元素中的错误&&客户端_机密&

如何在函数中定位WooCommerce产品循环

PHP从响应应用程序json获取文件代码和URL

在带有livewire 3的laravel中使用规则方法时,无法进行实时验证

如何在WordPress REST API中判断应用程序密码

PHP按另一个二维数组的排序顺序对二维数组进行排序

shell_exec运行大型数据处理

未定义的类型';PDF';在Laravel 8

如何在codeigniter中将order_by RAND与下面的代码一起使用

服务器升级到新的mysql版本8.0.34后查询错误

致命错误:未捕获 Google_Exception:客户端机密 JSON 文件无效.在 /somepath/lib/vendor/google/apiclient/src/Google/Client.php

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

symfony/notifier + twig/inky-extra 在 dunglas/symfony-docker 中缺少 ext-xsl.

在WooCommerce中显示 checkout 的高级自定义字段(Advanced Custom Fields)并保存其值

是否有适用于 Windows 的真正 64 位版本的 PHP 5.6?

NetBeans 不显示中文内容

服务器发送的事件:EventSource 抛出 MIME 错误