woocommerce计算并保存价格

时间:2017-01-13 05:38:48

标签: php wordpress woocommerce hook-woocommerce price

我已使用此优秀教程http://www.remicorson.com/mastering-woocommerce-products-custom-fields/

将自定义字段添加到Woocommerce /添加产品/常规标签

自定义字段(高度,宽度,乘数)正在保存到数据库中。 我想根据自定义字段计算价格,并将价格作为常规价格保存到数据库中。 问题是价格没有得到保存 这是我的代码,来自我孩子主题中的functions.php:

/* CUSTOM FIELDS: Add custom fields to Product/General pane in Woocommerce
  from http://www.remicorson.com/mastering-woocommerce-products-custom-fields/ */

// Display Fields
add_action('woocommerce_product_options_general_product_data', 'woo_add_custom_general_fields');
// Save Fields
add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save');

function woo_add_custom_general_fields()
{
    global $woocommerce, $post;
    echo '<div class="options_group">';

    // Product Height
    woocommerce_wp_text_input(
        array(
            'id' => '_product_height',
            'label' => __('Product Height (inches)', 'woocommerce'),
            'placeholder' => '',
            'description' => __('Enter the product height in inches here.', 'woocommerce'),
            'type' => 'number',
            'custom_attributes' => array(
                'step' => 'any',
                'min' => '0'
            )
        )
    );

    // Product Width
    woocommerce_wp_text_input(
        array(
            'id' => '_product_width',
            'label' => __('Product Width (inches)', 'woocommerce'),
            'placeholder' => '',
            'description' => __('Enter the product width in inches here.', 'woocommerce'),
            'type' => 'number',
            'custom_attributes' => array(
                'step' => 'any',
                'min' => '0'
            )
        )
    );

    // Product Area Multiplier
    woocommerce_wp_text_input(
        array(
            'id' => '_product_area_mult',
            'label' => __('Product Area Multiplier', 'woocommerce'),
            'placeholder' => '',
            'description' => __('Enter Product Area Multiplier. ', 'woocommerce'),
            'type' => 'number',
            'custom_attributes' => array(
                'step' => 'any',
                'min' => '0'
            )
        )
    );

    // Product Area Price: added this field to check if this value is being calculated
    woocommerce_wp_text_input(
        array(
            'id' => '_product_area_price',
            'label' => __('Product Area Price', 'woocommerce'),
            'placeholder' => '',
            'description' => __('Product Area Price. Calculated automatically', 'woocommerce'),
            'type' => 'number',
            'custom_attributes' => array(
                'step' => 'any',
                'min' => '0'
            )
        )
    );

    echo '</div>';
}

function woo_add_custom_general_fields_save($post_id)
{
    $woocommerce_product_height = $_POST['_product_height'];
    $woocommerce_product_width = $_POST['_product_width'];
    $woocommerce_product_area_mult = $_POST['_product_area_mult'];
    $woocommerce_product_area_price = $_POST['_product_area_price'];

    // save height, width, multiplier
    if (!empty($woocommerce_product_height))
        update_post_meta($post_id, '_product_height', esc_attr($woocommerce_product_height));

    if (!empty($woocommerce_product_width))
        update_post_meta($post_id, '_product_width', esc_attr($woocommerce_product_width));

    if (!empty($woocommerce_product_area_mult))
        update_post_meta($post_id, '_product_area_mult', esc_attr($woocommerce_product_area_mult));


    // calculate and save _product_area_price, _regular_price, price as Height*Width*Mult
    if (!empty($woocommerce_product_height) && !empty($woocommerce_product_width) && !empty($woocommerce_product_area_mult))
        $woocommerce_product_area_price = $woocommerce_product_height * $woocommerce_product_width * $woocommerce_product_area_mult;

    if (!empty($woocommerce_product_area_price))
        update_post_meta($post_id, '_product_area_price', esc_attr($woocommerce_product_area_price));

    if (!empty($woocommerce_product_area_price))
    {
        update_post_meta($post_id, '_regular_price', esc_attr($woocommerce_product_area_price));
        update_post_meta($post_id, '_price', esc_attr($woocommerce_product_area_price));
    }
}

除了更新数据库中的价格字段外,一切正常。我的自定义字段使用相同的语法更新。我确认变量$woocommerce_product_area_price存在,并且它正在更新自定义字段,但相同的变量不会更新_regular_price_price字段。所以这些行不起作用,即使相同的变量将更新_product_area_price字段:

if (!empty($woocommerce_product_area_price))
{
    update_post_meta($post_id, '_regular_price', esc_attr($woocommerce_product_area_price));
    update_post_meta($post_id, '_price', esc_attr($woocommerce_product_area_price));
}

也许有一些语法或检查我缺少更新Woocommerce的价格?

1 个答案:

答案 0 :(得分:2)

我认为您在前端展示的Price存在问题。如果要在前端反映_price,则需要更新_regular_price密钥。

试试这段代码:

if (!empty($area_price)){
    update_post_meta($post_id, '_regular_price', esc_attr($area_price));
    update_post_meta($post_id, '_price', esc_attr($area_price)); //<-- Add this line.
}

<强>已更新

只需将更高优先级添加到woocommerce_process_product_meta动作挂钩,就可以了。

add_action('woocommerce_process_product_meta', 'woo_add_custom_general_fields_save', 99);

我已经测试过,它工作正常 希望这有帮助!