如何将自定义价格传递到 WooCommerce 购物车并继续操作(如果存在)?

问题描述 投票:0回答:1

我想在 WooCommerce 中提供第三个价格:

  1. 正常价格
  2. 折扣价
  3. 超值促销价

到目前为止,我将其添加到管理区域和前端中以使其可见,但无论我尝试什么,我都无法使其与购物车一起使用,因为我需要它从 3 到 1 检查,例如:如果有选项 3 ( Super Sale PRice),则为该价格,如果有 2 个(折扣价),则为该价格,如果有 1 个(仅正价),则为该价格。 所有这些都不应与可变产品混淆,而仅适用于简单产品。

这是我的代码:

/**
 * Function to render UI in Admin Product add/edit page
 */
function show_custom_price_admin() {

    global $thepostid;

    woocommerce_wp_text_input(
        array(
            'id'    => 'custom_price',
            'name'  => '_custom_price',
            'value' => get_post_meta( $thepostid, '_custom_price', true ),
            'class' => 'wc_input_price short',
            'label' => __( 'Custom Price ($)', 'vg' ),
        )
    );
}
add_action( 'woocommerce_product_options_pricing', 'show_custom_price_admin' );

/**
 * Function to update custom price Admin Product add/edit page
 *
 * @param int $post_id Product's post id.
 */
function process_product_custom_data( $post_id ) {

    $product = wc_get_product( $post_id );

    $product->update_meta_data(
        '_custom_price',
        wc_clean( wp_unslash( filter_input( INPUT_POST, '_custom_price' ) ) )
    );
    $product->save();
}
add_action( 'woocommerce_process_product_meta', 'process_product_custom_data' );

/**
 * Function to show custom price front end page
 */
function show_custom_price_frontend() {
    global $post;

    $custom_price = get_post_meta( $post->ID, '_custom_price', true );

    if ( $custom_price ) {
        $custom_price = wc_price( $custom_price );

        printf( '<p class="price">%s</p>', $custom_price );
    }
}
add_action( 'woocommerce_before_add_to_cart_form', 'show_custom_price_frontend' );

到目前为止,我将其添加到管理区域和前端中以使其可见,但无论我尝试什么,我都无法使其与购物车一起使用,因为我需要它从 3 到 1 检查,例如:如果有选项 3 ( Super Sale PRice),则为该价格,如果有 2 个(折扣价),则为该价格,如果有 1 个(仅正价),则为该价格。 所有这些都不应与可变产品混淆,而仅适用于简单产品。

php wordpress woocommerce
1个回答
0
投票

您的代码有点过时,并且缺少一些内容,如果在后端定义了自定义价格(对于简单产品),则设置和显示自定义价格:

/**
 * Display custom price input field in Admin Product add/edit page
**/
 add_action( 'woocommerce_product_options_pricing', 'admin_product_custom_price_input_field' );
function admin_product_custom_price_input_field() {
    global $post, $product_object;

    echo '<div class="pricing show_if_simple hidden">'; // Only on simple product

    woocommerce_wp_text_input(  array(
        'id'        => 'custom_price',
        'value'     => $product_object->get_meta( '_custom_price' ),
        'class'     => 'wc_input_price short',
        'label'     => __( 'Custom Price', 'vg' ) . ' (' . get_woocommerce_currency_symbol() . ')',
        'data_type' => 'price',
    ) );

    echo '</div>';
}

/**
 * Save/update custom price Admin Product add/edit page
 *
 * @param object $product  WC_Product instance object
**/
function saves_product_custom_metadata( $product ) {
    $price_value = isset( $_POST['custom_price'] ) ? wc_clean( wp_unslash( $_POST['custom_price'] ) ) : null;
    $product->update_meta_data('_custom_price', $price_value );
}
add_action( 'woocommerce_admin_process_product_object', 'saves_product_custom_metadata' );

/**
 * Display formatted custom price on front end 
 * 
 * @param string $price_html  Formatted custom price html
 * @param object $product  WC_Product instance object
**/
function custom_get_price_html( $price_html, $product ) {
    if ( ! $product->is_type('simple') ) {
        return $price_html;
    }
    if ( $custom_price = $product->get_meta( '_custom_price' ) ) {
        return wc_price( wc_get_price_to_display( $product, array( 'price' => $custom_price ) ) ) 
            . $product->get_price_suffix();
    }
    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'custom_get_price_html', 100, 2 );

/**
 * Set custom cart item price
 *
 * @param object $cart  WC_Cart instance object
**/ 
function add_( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $item ) {
        $product = $item['data'];
        if ( $custom_price = $product->get_meta( '_custom_price' ) ) {
            $product->set_price( $custom_price );
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'cart_set_custom_price', 1000 );

/**
 * Display custom cart item price
 * 
 * @param object $cart  WC_Cart instance object
 * @param array $cart_item  cart item data
**/
function filter_cart_item_price( $price, $cart_item ) {

    if ( $custom_price = $cart_item['data']->get_meta( '_custom_price' ) ) {
        $args = array( 'price' => $custom_price );

        if ( WC()->cart->display_prices_including_tax() ) {
            $product_price = wc_get_price_including_tax( $cart_item['data'], $args );
        } else {
            $product_price = wc_get_price_excluding_tax( $cart_item['data'], $args );
        }
        return wc_price( $product_price );
    }
    return $price;
}
add_filter( 'woocommerce_cart_item_price', 'filter_cart_item_price', 100, 2 );

应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.