在WooCommerce中,对于可变产品,我想添加一个字段,向用户显示一单位产品的价格.例如,我有一个产品,每包100个,定价为1000美元,但我想添加一个字段来向用户显示每件(一个单位)的价格.因此,在单价字段中输入的价格应该显示给用户,而不是差异价格,但在我的代码中,它不会在产品页面上显示价格.

以下是我的代码:

// Add custom field to product variations
function add_price_per_unit_field_variation($loop, $variation_data, $variation) {
    woocommerce_wp_text_input(array(
        'id'          => '_price_per_unit[' . $variation->ID . ']',
        'label'       => __('Price per unit for Variation ' . $loop, 'woocommerce'),
        'placeholder' => '',
        'desc_tip'    => 'true',
        'description' => __('Enter the price per unit for this variation.', 'woocommerce'),
        'value'       => get_post_meta($variation->ID, '_price_per_unit', true),
    ));
}
add_action('woocommerce_variation_options_pricing', 'add_price_per_unit_field_variation', 10, 3);

// Save custom field for product variations
function save_price_per_unit_field_variation($variation_id, $i) {
    $price_per_unit = $_POST['_price_per_unit'][$variation_id];
    update_post_meta($variation_id, '_price_per_unit', esc_attr($price_per_unit));
}
add_action('woocommerce_save_product_variation', 'save_price_per_unit_field_variation', 10, 2);

// Replace variation price with price per unit on product page
function display_price_per_unit_single($price, $product) {
    if ($product->is_type('variable')) {
        $price_per_unit = get_post_meta($product->get_id(), '_price_per_unit', true);

        if (!empty($price_per_unit)) {
            return wc_price($price_per_unit) . ' per unit';
        }
    }
    return $price;
}
add_filter('woocommerce_variable_sale_price_html', 'display_price_per_unit_single', 10, 2);
add_filter('woocommerce_variable_price_html', 'display_price_per_unit_single', 10, 2);

推荐答案

我已经使用更新的代码和挂钩完全修改了您的代码,将所选变体上显示的价格替换为设置后的单位价格:

// Display custom field on product variations options pricing
add_action('woocommerce_variation_options_pricing', 'display_variation_price_per_unit_field', 10, 3);
function display_variation_price_per_unit_field($loop, $variation_data, $variation) {
    $variation_object = wc_get_product($variation->ID);

    woocommerce_wp_text_input( array(
        'id'            => "_price_per_unit[{$loop}]",
        'label'         => sprintf( __('Price per unit (%s)', 'woocommerce'), get_woocommerce_currency_symbol() ),
        'wrapper_class' => 'form-row form-row-first',
        'placeholder'   => '',
        'desc_tip'      => 'true',
        'description'   => __('Enter the price per unit for this variation.', 'woocommerce'),
        'value'         => wc_format_localized_price( $variation_object->get_meta( '_price_per_unit' ) ),
    ) );
}

// Save custom field value from product variations options pricing
add_action( 'woocommerce_admin_process_variation_object', 'save_variation_price_per_unit_value', 20, 2 );
function save_variation_price_per_unit_value( $variation, $i ) {
    $price_per_unit = isset($_POST['_price_per_unit'][$i]) ? wc_clean( wp_unslash($_POST['_price_per_unit'][$i])) : null;
    
    $variation->update_meta_data('_price_per_unit', $price_per_unit);
}

// Display the formatted price per unit on selected variation
add_filter( 'woocommerce_available_variation', 'display_selected_variation_price_per_unit', 10, 3 );
function display_selected_variation_price_per_unit( $variation_data, $product, $variation ) {
    $price_per_unit = $variation->get_meta('_price_per_unit');
    
    if ( $price_per_unit != null ) {
        $price_to_display = wc_get_price_to_display( $variation, array( 'price' => floatval($price_per_unit) ) );
        $variation_data['price_html'] = wc_price( $price_to_display );
    }
    return $variation_data;
}

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

Php相关问答推荐

将一个数字分配到一系列因素中(就像贪婪算法)

如果活动订阅者的购物车中有订阅项目,则在WooCommerce签出中显示通知

PHP:PHP手册-Manual

Laveel Livewire Get Groupby姓名列表

在指定的约束内使用随机量填充数据集

上传WordPress模板中的翻译文件(.mo和.po)

在php中,方法之间的属性链接是如何工作的

在Laravel中创建辅助函数时的约定

Laravel处理belongToMany和额外字段

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

使用简码在 WooCommerce 我的帐户中显示一些用户数据

用户注册表单中的 HTTP 错误 405

htaccess 重定向子域错误的 url

AWS S3:当对象名称包含 % 时复制对象失败并出现错误 - 无效的复制源编码

PHP 在数组中搜索值

WooCommerce – 在新订单邮箱通知中显示产品分类计数

在 PHP 中验证签名

带有 nginx 的 Symfony 不提供 .js 和 .css 文件

如何在不解压缩/重新压缩的情况下连接(连接)两个缩小的值

标头内容类型:image/jpeg 无效