Дополнительное поле цены в вариациях для переменных продуктов WooCommerce - PullRequest
1 голос
/ 30 марта 2019

Мне удалось собрать это для простых продуктов, но мне нужно работать и с переменными продуктами.Это создает настраиваемое поле продукта на странице продукта (бэкэнд WC), и текст сохраняется как «RRP / MSRP», что означает «Рекомендованная розничная цена / Рекомендуемая производителем розничная цена».

Цена будет отображаться надцена товара на странице товара.Моя проблема, как уже объяснялось, заключается в том, что это работает только для простых продуктов.Мне нужна помощь, чтобы он работал для всех типов продуктов, но самое главное - для переменных продуктов.

Код:

add_action( 'woocommerce_product_options_pricing', 'add_msrp' );
function add_msrp() {
    woocommerce_wp_text_input( array(
        'id' => 'msrp',
        'class' => 'short wc_input_price',
        'label' => __( 'RRP / MSRP', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')',
        'data_type' => 'price',
    ) );
}

add_action( 'save_post_product', 'save_msrp' );
function save_msrp( $product_id ) {
    global $pagenow, $typenow;

    if ( 'post.php' !== $pagenow || 'product' !== $typenow ) 
        return;

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;

    if ( isset( $_POST['msrp'] ) ) {
        if ( $_POST['msrp'] )
            update_post_meta( $product_id, 'msrp', $_POST['msrp'] );
    } else 
        delete_post_meta( $product_id, 'msrp' );
}

add_action( 'woocommerce_single_product_summary', 'display_msrp', 9 );
function display_msrp() {
    global $product;
    if ( $product->get_type() <> 'variable' && $msrp = get_post_meta( $product->get_id(), 'msrp', true ) ) {
        echo '<div class="woocommerce_msrp">';
        _e( 'RRP / MSRP: ', 'woocommerce' );
        echo '<span class="msrp-price">' . wc_price( $msrp ) . '</span>';
        echo '</div>';
    }
}

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 30 марта 2019

Ваш код несколько устарел со времен Woocommerce 3+ и некоторых других вещей, например, слагов meta_key, которые будут использоваться для настраиваемых полей (я пересмотрел его в конце) ...

Для обработки вариантов продукта из переменного продукта используйте следующее:

// Backend Variation - Add / Display MRSP Field
add_action( 'woocommerce_variation_options_pricing', 'add_variation_options_pricing_msrp', 10, 3 );
function add_variation_options_pricing_msrp( $loop, $variation_data, $variation ){

    woocommerce_wp_text_input( array(
        'id' => '_msrp_'.$loop,
        'wrapper_class' => 'form-row form-row-first',
        'class' => 'short wc_input_price',
        'label' => __( 'RRP / MSRP', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')',
        'value' => wc_format_localized_price( get_post_meta( $variation->ID, '_msrp', true ) ),
        'data_type' => 'price',
    ) );
}

// Backend Variation - Save MRSP Field value
add_action( 'woocommerce_save_product_variation','save_variation_options_pricing_msrp',10 ,2 );
function save_variation_options_pricing_msrp( $variation_id, $loop ){
    if( isset($_POST['_msrp_'.$loop]) )
        update_post_meta( $variation_id, '_msrp', wc_clean( wp_unslash( str_replace( ',', '.', $_POST['_msrp_'.$loop] ) ) ) );
}

// Frontend Variation - MRSP display
add_filter( 'woocommerce_available_variation', 'display_variation_msrp', 10, 3 );
function display_variation_msrp( $data, $product, $variation ) {

    if( $msrp = $variation->get_meta('_msrp') ) {
        $data['price_html'] = '<div class="woocommerce_msrp">' . __( 'RRP / MSRP: ', 'woocommerce' ) .
        '<span class="msrp-price">' . wc_price( $msrp ) . '</span></div>' . $data['price_html'];
    }

    return $data;
}

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

enter image description here

enter image description here


Для всех других продуктов.

Здесь ниже приведен ваш повторный код (метаключи продукта всегда должны начинаться с подчеркивания) :

// Backend Product - Add / Display MRSP Field
add_action( 'woocommerce_product_options_pricing', 'add_product_options_pricing_msrp' );
function add_product_options_pricing_msrp() {
    global $product_object;

    woocommerce_wp_text_input( array(
        'id' => '_msrp',
        'class' => 'short wc_input_price',
        'label' => __( 'RRP / MSRP', 'woocommerce' ) . ' (' . get_woocommerce_currency_symbol() . ')',
        'data_type' => 'price',
        'value'       => str_replace('.', ',', $product_object->get_meta('_msrp') ),
    ) );
}

// Backend Product - Save MRSP Field value (since Woocommerce 3)
add_action( 'woocommerce_admin_process_product_object', 'save_product_options_pricing_msrp', 10, 1 );
function save_product_options_pricing_msrp( $product ) {
    if ( isset( $_POST['_msrp'] ) )
        $product->update_meta_data( '_msrp', wc_clean( wp_unslash( str_replace( ',', '.', $_POST['_msrp'] ) ) ) );
}

// Frontend Product - MRSP display
add_action( 'woocommerce_single_product_summary', 'display_product_msrp', 9 );
function display_product_msrp() {
    global $product;

    if ( $msrp = $product->get_meta('_msrp') ) {
        echo '<div class="woocommerce_msrp">' . __( 'RRP / MSRP: ', 'woocommerce' );
        echo '<span class="msrp-price">' . wc_price( $msrp ) . '</span>
        </div>';
    }
}

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

Похожие: Включить оптовые цены в Woocommerce 3

...