php - 根据 Woocommerce 中的自定义购物车商品数据更改购物车商品价格

标签 php wordpress woocommerce cart custom-fields

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

我在

中创建了这个表单

woocommerce->single-product->add-to-cart->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>

修改后的形式为

<form class="cart" method="post" enctype='multipart/form-data'>
    <p>width  <input type="text" name="new-width" class="new-width"></p>
    <p>Height <input type="text" name="new-height" class="new-height"></p>
        <?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>

在此之后,我使用了以下代码,为了测试目的,我将值设置为 30 。但它不起作用。我错过了什么?

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;

}

请指教。我的目标是根据用户输入的宽度和高度更改产品价格。

最佳答案

您需要使用 2 个不同的钩子(Hook):

  • 第一个和你的一样,没有试图改变它的价格。
  • 第二个,您将在其中更改购物车商品价格

代码:

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 文件中或任何插件文件中。

已测试并有效

关于php - 根据 Woocommerce 中的自定义购物车商品数据更改购物车商品价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47646781/

相关文章:

php - 登录PHP和Mysql

php - 使用 woocommerce_checkout_process 防止下订单

php - 在 Woocommerce 结帐中添加弹出窗口和基于国家/地区的自定义消息

php - 在自定义 WooCommerce 字段上设置值

php - 检查YouTube视频是否有效?代码修复

php - 使用 PHP/MySQL 替换表中的多个字符串

javascript - 使用 ajax 发布错误信息

php - WordPress 导航菜单子(monad)页面

wordpress - 如何按预定的时间间隔自动运行函数?

php - Wordpress:获取按帖子计数排序的用户列表