php 添加并显示单价字段到WooCommerce产品变化

6tqwzwtp  于 5个月前  发布在  PHP
关注(0)|答案(1)|浏览(52)

在WooCommerce中,对于可变产品,我想添加一个字段,向用户显示产品的一个单位的价格。例如,我有一个产品,价格为1000美元,一包100,但我想添加一个字段向用户显示每件的价格因此,应该向用户显示为单价字段输入的价格,而不是变化价格,但在我的代码中,它没有在产品页面上显示价格。
下面是我的代码:

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

字符串

ghhaqwfi

ghhaqwfi1#

我已经完全修改了你的代码使用更新的代码和挂钩,取代所选的变化显示的价格,每单位的价格时设置:

// 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文件中(或插件中)。测试和工作。

**添加:

所选的单位变动价格将替换产品变动价格范围。**
你将把我前面代码中的最后一个函数替换为:

// Add the variation formatted price per unit to the form data
add_filter( 'woocommerce_available_variation', 'available_variation_formatted_price_per_unit', 10, 3 );
function available_variation_formatted_price_per_unit( $variation_data, $product, $variation ) {
    $price_per_unit = $variation->get_meta('_price_per_unit');
    
    if ( $price_per_unit != null ) {
        $variation_data['display_price_pu'] = wc_get_price_to_display( $variation, array( 'price' => floatval($price_per_unit) ) );
        $variation_data['price_pu_html']    = wc_price( $variation_data['display_price_pu'] );
    }
    return $variation_data;
}


然后,您还将添加以下代码:

add_action( 'woocommerce_after_variations_form', 'woocommerce_after_variations_form_js', 10 );
function woocommerce_after_variations_form_js() {
    global $product; ?>
    <script>
    jQuery( function($){
        const originalPrice = $('p.price').html()
        $('form.cart').on('show_variation', function(event, data) {
            if ( data.price_pu_html !== undefined ) {
                $('p.price').html( data.price_pu_html );
            } else {
                $('p.price').html( originalPrice );
            }
        }).on('hide_variation', function(){
            $('p.price').html( originalPrice );
        });
    });
    </script>
    <?php
}


测试和作品。


的数据

相关问题