簡體   English   中英

WooCommerce 產品變化價格基於自定義字段

[英]WooCommerce product variation price based on custom fields

我有可變產品,我向其中添加了如下自定義字段:

function ab_preorder_variation_fields( $loop, $variation_data, $variation ) {

    echo '<div class="options_group form-row form-row-full">';
    // Is Preordable
    woocommerce_wp_checkbox(
        array(
            'id'            => '_ab_preorder_checkbox[' . $variation->ID . ']',
            'wrapper_class' => 'show_if_simple',
            'label'         => __(' Disponible à la précommande', 'woocommerce' ),
            'description'   => __( 'Disponible à la précommande', 'woocommerce' ),
            'desc_tip'    => true,
            'value' => get_post_meta( $variation->ID, '_ab_preorder_checkbox', true )
        )
    );
    
    // Custom Preorder Price
    woocommerce_wp_text_input(
        array(
            'id'                => '_ab_preorder_custom_price[' . $variation->ID . ']',
            'label'             => __( 'Prix à la précommande', 'woocommerce' ),
            'placeholder'       => '',
            'desc_tip'          => true,
            'description'       => __( "Prix à la précommande", 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                    'step'  => 'any',
                    'min'   => '0'
                ),
            'value' => get_post_meta( $variation->ID, '_ab_preorder_custom_price', true )
        )
    );
    // Date de livraison estimée
    woocommerce_wp_text_input(
        array(
            'id'          => '_ab_preorder_estimated_date[' . $variation->ID . ']',
            'label'       => __( 'Date de livraison estimé', 'woocommerce' ),
            'placeholder' => '24/09/2021',
            'desc_tip'    => true,
            'description' => __( "Date de livraison estimé", "woocommerce" ),
            'value' => get_post_meta( $variation->ID, '_ab_preorder_estimated_date', true )
        )
    );


    echo '</div>';

}
add_action( 'woocommerce_product_after_variable_attributes', 'ab_preorder_variation_fields', 10, 3 ); // After all Variation fields
function ab_preorder_variation_fields_saving( $post_id ){

    // Is Preordable
    $woocommerce_text_field = $_POST['_ab_preorder_checkbox'][ $post_id ];
    update_post_meta( $post_id, '_ab_preorder_checkbox', esc_attr( $woocommerce_text_field ) );
    
    // Custom Preorder Price
    $woocommerce_text_field = $_POST['_ab_preorder_custom_price'][ $post_id ];
    update_post_meta( $post_id, '_ab_preorder_custom_price', esc_attr( $woocommerce_text_field ) );
    
    // Date de livraison estimée
    $woocommerce_text_field = $_POST['_ab_preorder_estimated_date'][ $post_id ];
    update_post_meta( $post_id, '_ab_preorder_estimated_date', esc_attr( $woocommerce_text_field ) );

}

這是 WP Admin 中的結果: 在此處輸入圖像描述

這是我想要做的:當客戶選擇變體時,我想:如果變體庫存數量為 0 並且選中了_ab_preorder_checkbox復選框,我想將產品價格設置為 100。

我嘗試使用下面的代碼,但它不起作用:/

function action_woocommerce_before_calculate_totals( $cart_object) { 
    $cart_items = $cart_object->cart_contents;

      if ( ! empty( $cart_items ) ) {
        $price = 100;
        foreach ( $cart_items as $key => $value ) {
            if($value['data']['_ab_preorder_checkbox']=="yes")
            $value['data']->set_price( $price );
          
        }
      }

}; 
add_action( 'woocommerce_before_calculate_totals', 'action_woocommerce_before_calculate_totals', 10, 2 ); 

誰能幫我解決這個問題?

問候,

由於 woocommerce 不允許購買零庫存產品,您需要為相關產品設置“允許延期交貨”選項。

我重新審視了你的代碼(特別是你的第二個函數)。

在您的情況下,鈎子woocommerce_before_calculate_totals並不方便。 最好在產品上設置延期交貨自定義價格。

以下將在啟用復選框時設置變體的延期交貨價格,並將其顯示在相關變體上以及預計交貨日期:

// Admin Variation custom fields
add_action( 'woocommerce_product_after_variable_attributes', 'ab_preorder_variation_fields', 10, 3 );
function ab_preorder_variation_fields( $loop, $variation_data, $variation ) {

    echo '<div class="options_group form-row form-row-full">';
    
    // Is Preordable
    woocommerce_wp_checkbox(
        array(
            'id'            => '_ab_preorder_checkbox['.$loop.']',
            'wrapper_class' => 'show_if_simple',
            'label'         => __(' Disponible à la précommande', 'woocommerce' ),
            'description'   => __( 'Disponible à la précommande', 'woocommerce' ),
            'desc_tip'    => true,
            'value' => get_post_meta( $variation->ID, '_ab_preorder_checkbox', true )
        )
    );

    // Custom Preorder Price
    woocommerce_wp_text_input(
        array(
            'id'                => '_ab_preorder_custom_price['.$loop.']',
            'label'             => __( 'Prix à la précommande', 'woocommerce' ),
            'placeholder'       => '',
            'desc_tip'          => true,
            'description'       => __( "Prix à la précommande", 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                    'step'  => 'any',
                    'min'   => '0'
                ),
            'value' => get_post_meta( $variation->ID, '_ab_preorder_custom_price', true )
        )
    );

    // Date de livraison estimée
    woocommerce_wp_text_input(
        array(
            'id'          => '_ab_preorder_estimated_date['.$loop.']',
            'label'       => __( 'Date de livraison estimé', 'woocommerce' ),
            'desc_tip'    => true,
            'description' => __( "Date de livraison estimé", "woocommerce" ),
            'type'        => 'date',
            'value' => get_post_meta( $variation->ID, '_ab_preorder_estimated_date', true )
        )
    );

    echo '</div>';
}

// Save admin Variations custom fields values
add_action( 'woocommerce_admin_process_variation_object', 'ab_preorder_variation_fields_saving', 10, 2 );
function ab_preorder_variation_fields_saving( $variation, $loop ) {
    if( isset($_POST['_ab_preorder_checkbox'][$loop]) ) {
        $variation->update_meta_data( '_ab_preorder_checkbox', esc_attr($_POST['_ab_preorder_checkbox'][$loop]) );
    }

    if( isset($_POST['_ab_preorder_custom_price'][$loop]) ) {
        $variation->update_meta_data( '_ab_preorder_custom_price', esc_attr($_POST['_ab_preorder_custom_price'][$loop]) );
    }

    if( isset($_POST['_ab_preorder_estimated_date'][$loop]) ) {
        $variation->update_meta_data( '_ab_preorder_estimated_date', esc_attr($_POST['_ab_preorder_estimated_date'][$loop]) );
    }
}

// Set the variation backorder price
add_filter('woocommerce_product_variation_get_regular_price', 'custom_price', 99, 2 );
add_filter('woocommerce_product_variation_get_price', 'custom_price', 99, 2 );
function custom_price( $price, $product ) {
    if ( $product->get_stock_quantity() == 0 && $product->get_meta('_ab_preorder_checkbox') === 'yes' ) {
        $backorder_price = $product->get_meta('_ab_preorder_custom_price');
        
        if( $backorder_price > 0 ) {
            $price = (float) $backorder_price;
        }
    }
    return $price;
}

// Display prefixed backorder price and estimated delivery on single product pages
add_filter( 'woocommerce_available_variation', 'ab_available_variation_custom_field', 10, 3 );
function ab_available_variation_custom_field( $variation_data, $product, $variation ) {
    if ( $variation->get_stock_quantity() == 0 && $variation->get_meta('_ab_preorder_checkbox') === 'yes' ) {
        if ( $estimated_delivery_date = $variation->get_meta('_ab_preorder_estimated_date') ) {
            // Display estimated delivery date
            $variation_data['availability_html'] .= sprintf( '<p class="stock date-precommande">%s : %s</p>',
            __("Date de livraison estimée (précommande)", "woocommerce"), $estimated_delivery_date );
        }
        
        // Displayed prefixed formatted price
        $variation_data['price_html'] = '<span class="price-prefix">'.__("Prix à la précommande", "") .'<span> : ' . wc_price( $variation_data['display_price'] );
    }
    return $variation_data;
}

// Display on estimated delivery date on cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_acf_on_cart_and_checkout', 10, 2 );
function display_acf_on_cart_and_checkout( $cart_data, $cart_item ) {
    if ( $cart_item['variation_id'] > 0 && $cart_item['data']->get_stock_quantity() == 0
    && $cart_item['data']->get_meta('_ab_preorder_checkbox') === 'yes' ) {
        if ( $estimated_delivery_date = $cart_item['data']->get_meta('_ab_preorder_estimated_date') ) {
            $custom_items[] = array( "name" => __("Date de livraison estimée", "woocommerce"),  "value" => $estimated_delivery_date );
        }
    }
    return $custom_items;
}

代碼進入活動子主題(或活動主題)的functions.php文件。 測試和工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM