Расчет обычной цены товара на основе 2 пользовательских полей в Woocommerce 3 - PullRequest
0 голосов
/ 09 октября 2018

В Woocommerce я установил 2 пользовательских поля в админке в разделе цен в полях цен по умолчанию Woocommerce: ставка маржи и цена покупки.

enter image description here

Я пытаюсь выяснить, как я могу автоматически обновлять цену продукта (поле обычной цены) на основе следующих расчетов:

 $product_price = $rate_margin * $purchase_price;

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны добавить всегда добавить код, который используется для дополнительных полей цены в вашем вопросе.

Код ниже:

  1. отображение исохранение 2 настраиваемых полей: ставка маржи и цена покупки.
  2. сохранение цены нового продукта, рассчитанной по значениям этих 2 настраиваемых полей.

Перед этим вам нужно будет удалить свойкод, который генерирует эти 2 пользовательских поля (как это будет заменено моим) .

// Adding and displaying additional product pricing custom fields
add_action( 'woocommerce_product_options_pricing', 'additional_product_pricing_option_fields', 50 );
function additional_product_pricing_option_fields() {
    $domain = "woocommerce";
    global $post;

    echo '</div><div class="options_group pricing show_if_simple show_if_external show_if_composite">';

    woocommerce_wp_text_input( array(
        'id'            => '_rate_margin',
        'label'         => __("Rate margin", $domain ),
        'placeholder'   => '',
        'description'   => __("Rate margin explanation goes here…", $domain ),
        'desc_tip'      => true,
    ) );


    woocommerce_wp_text_input( array(
        'id'            => '_purchase_price',
        'label'         => __("Purchase price", $domain ) . ' ('. get_woocommerce_currency_symbol() . ')',
        'placeholder'   => '',
        'description'   => __("Rate margin explanation goes here…", $domain ),
        'desc_tip'      => true,
    ) );

    echo '<input type="hidden" name="_custom_price_nonce" value="' . wp_create_nonce() . '">';

}

// Utility function that save "Rate margin" and "Purchase_price" custom fields values
function saving_rate_margin_and_purchase_price( $product ) {
    // Security check
    if ( isset($_POST['_custom_price_nonce']) && ! wp_verify_nonce($_POST['_custom_price_nonce']) ) {
        return;
    }

    // Save "Rate margin" and "Purchase_price" custom fields values
    if( isset($_POST['_rate_margin']) && isset($_POST['_purchase_price']) ) {
        $product->update_meta_data('_rate_margin', sanitize_text_field( (float) $_POST['_rate_margin'] ) );
        $product->update_meta_data('_purchase_price', sanitize_text_field( (float) $_POST['_purchase_price'] ) );
    }
}

// Utility function: Calculate and save product price from the "Rate margin" and the "Purchase price" custom fields
function calculate_and_save_new_product_price( $product ) {
    // Disable when product is on sale
    if( isset($_POST['_sale_price']) && $_POST['_sale_price'] > 0 ){
        return;
    }

    // Calculate and save the new price
    if( isset($_POST['_rate_margin']) && isset($_POST['_purchase_price'])
    && $_POST['_rate_margin'] > 0 && $_POST['_purchase_price'] > 0 ) {

        // Catch the pricing data
        $rate_margin    = (float) $_POST['_rate_margin'];
        $purchase_price = (float) $_POST['_purchase_price'];
        $active_price   = (float) $product->get_price();

        // Calculating new price
        $new_price = $rate_margin * $purchase_price;

        // If the active price is different from the calculated new price
        if( $new_price !== $active_price ) {
            // Update regular price and active price with new calculated price
            $product->set_price( $new_price );
            $product->set_regular_price( $new_price );
        }
    }
}

// Saving and calculating prices
add_action( 'woocommerce_admin_process_product_object', 'update_product_meta_data', 100, 1 );
function update_product_meta_data( $product ) {

    // Saving "Rate margin" and "Purchase_price" custom fields values
    saving_rate_margin_and_purchase_price( $product ); // <== To be removed if not used with the first function

    // Calculate and save product price from the "Rate margin" and the "Purchase price" custom fields
    calculate_and_save_new_product_price( $product );
}

Код помещается в файл function.php вашего активного ребенкатема (активная тема). Проверено и работает.

...