Php 根据Woocommerce中的自定义购物车项目数据更改购物车项目价格

Php 根据Woocommerce中的自定义购物车项目数据更改购物车项目价格,php,wordpress,woocommerce,cart,custom-fields,Php,Wordpress,Woocommerce,Cart,Custom Fields,目前,我在产品单页中创建了一个表单,以便客户可以输入产品的高度和宽度。因此,产品价格根据输入的高度和宽度而变化 我在年创建了这个表单 woocommerce->单一产品->添加到购物车->simple.php 在修改之前,表格是 <form class="cart" method="post" enctype='multipart/form-data'> <?php /** * @since 2.1.0. */

目前,我在产品单页中创建了一个表单,以便客户可以输入产品的高度和宽度。因此,产品价格根据输入的高度和宽度而变化

我在年创建了这个表单

woocommerce->单一产品->添加到购物车->simple.php

在修改之前,表格是

<form class="cart" method="post" enctype='multipart/form-data'>
    <?php
        /**
         * @since 2.1.0.
         */
        do_action( 'woocommerce_before_add_to_cart_button' );

        /**
         * @since 3.0.0.
         */
        do_action( 'woocommerce_before_add_to_cart_quantity' );

        woocommerce_quantity_input( array(
            'min_value'   => apply_filters( 'woocommerce_quantity_input_min', $product->get_min_purchase_quantity(), $product ),
            'max_value'   => apply_filters( 'woocommerce_quantity_input_max', $product->get_max_purchase_quantity(), $product ),
            'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : $product->get_min_purchase_quantity(),
        ) );

        /**
         * @since 3.0.0.
         */
        do_action( 'woocommerce_after_add_to_cart_quantity' );
    ?>

    <button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>

    <?php
        /**
         * @since 2.1.0.
         */
        do_action( 'woocommerce_after_add_to_cart_button' );
    ?>
</form>

请给我一些建议。我的目标是根据用户输入的宽度和高度更改产品价格。

您需要使用两种不同的挂钩:

  • 第一个和你的一样,不改变价格
  • 第二个,您将更改购物车项目价格
守则:

add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $cart_item ) {

    if( isset( $_POST['new-width'] ) )
        $cart_item_data['new-width'] = $_POST['new-width'];
    if(isset( $_POST['new-height'] ) )
       $cart_item_data['new-height'] = $_POST['new-height'];

    return $cart_item_data;
}


add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_price', 20, 1 );
function set_custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // First loop to check if product 11 is in cart
    foreach ( $cart->get_cart() as $cart_item ){
        if( isset($cart_item['new-width']) && isset($cart_item['new-height']) 
        && ! empty($cart_item['new-width']) && ! empty($cart_item['new-height']) )
            $cart_item['data']->set_price( '30' );
    }
}
代码位于活动子主题(或主题)的function.php文件或任何插件文件中


已测试并运行

(1)(2)(3)请检查所有这些图像。@迷你购物车是另一回事,也是另一个问题,因为它是Ajax驱动的,需要使用相关的更新购物车片段才能正确刷新。这也取决于你的主题和定制。所以这要复杂得多…在这里我只是回答这个问题,我有你的代码工作,还是没有?它是100%的工作朋友。谢谢你的支持。我将检查此woocommerce\u get\u cart\u item\u from_session@abilasher我还没用过这个钩子…
add_filter( 'woocommerce_add_cart_item' , 'set_woo_prices');

function set_woo_prices( $woo_data ) {

  if(isset( $_POST['new-width']))  { $woo_data['new-width'] =$_POST['new-width']; }
  if(isset( $_POST['new-height'])) { $woo_data['new-height'] =$_POST['new-height']; }
  if( $_POST['new-width'] !=="" && $_POST['new-height']!=="" ){

     $woo_data['data']->set_price( "30" ); 
    }
     return $woo_data;

}
add_filter( 'woocommerce_add_cart_item', 'add_custom_cart_item_data', 10, 2 );
function add_custom_cart_item_data( $cart_item_data, $cart_item ) {

    if( isset( $_POST['new-width'] ) )
        $cart_item_data['new-width'] = $_POST['new-width'];
    if(isset( $_POST['new-height'] ) )
       $cart_item_data['new-height'] = $_POST['new-height'];

    return $cart_item_data;
}


add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_price', 20, 1 );
function set_custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // First loop to check if product 11 is in cart
    foreach ( $cart->get_cart() as $cart_item ){
        if( isset($cart_item['new-width']) && isset($cart_item['new-height']) 
        && ! empty($cart_item['new-width']) && ! empty($cart_item['new-height']) )
            $cart_item['data']->set_price( '30' );
    }
}