当前位置: 首页 > 知识库问答 >
问题:

WooCommerce在购物车和结账时使用自定义值覆盖产品价格

洪浩波
2023-03-14

我想知道是否有人对以下场景有经验。

我正在使用WooCommerce将我的产品上市,准备出售。一些产品(大约20个)有大量的变化,因此我决定将产品数据放在单独的表中,并通过SKU(获取数据的简单查询)将其加载到woocommerce中。到目前为止,一切都很顺利。这些产品很好用。它们的变体正在显示,用户可以选择它们,将它们添加到购物车中。

问题是,我已经将这20种产品设置为单一产品,并给它们一个$1的价格,只是为了显示添加到购物车按钮(.single_add_to_cart_按钮),但是当我选择我的变体(从外部表/表)时,产品会被很好地添加到购物车中,但在这种情况下,每种产品的价格都是$1,包括所有自定义字段(这很好)。据我所知,这些自定义字段来自会话)。下面是我在我的functions.php中使用的所有代码(不是我的,在网上找到的,修复后用于我的案例)

// Step 1: Add Data in a Custom Session, on ‘Add to Cart’ Button Click

add_action('wp_ajax_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback');
add_action('wp_ajax_nopriv_wdm_add_user_custom_data_options', 'wdm_add_user_custom_data_options_callback');

function wdm_add_user_custom_data_options_callback()
{

    $product_id = $_POST['id'];
    $product_category = $_POST['product_category'];

    $custom_data_1 = $_POST['custom_data_1'];
    $custom_data_2 = $_POST['custom_data_2'];
    $custom_data_3 = $_POST['custom_data_3'];
    $custom_data_4 = $_POST['custom_data_4'];
    $custom_data_5 = $_POST['custom_data_5'];
    session_start();

    $_SESSION['custom_data_1'] = $custom_data_1;
    $_SESSION['custom_data_2'] = $custom_data_2;
    $_SESSION['custom_data_3'] = $custom_data_3;
    $_SESSION['custom_data_4'] = $custom_data_4;
    $_SESSION['custom_data_5'] = $custom_data_5;

    die();
}

// Step 2: Add Custom Data in WooCommerce Session

add_filter('woocommerce_add_cart_item_data','wdm_add_item_data',1,2);

if(!function_exists('wdm_add_item_data'))
{

    function wdm_add_item_data($cart_item_data,$product_id)

    {
        global $woocommerce;
        session_start();
        $new_value = array();
        if (isset($_SESSION['custom_data_1'])) {
            $option1 = $_SESSION['custom_data_1'];
            $new_value['custom_data_1'] =  $option1;
        }
        if (isset($_SESSION['custom_data_2'])) {
            $option2 = $_SESSION['custom_data_2'];
            $new_value['custom_data_2'] =  $option2;
        }
        if (isset($_SESSION['custom_data_3'])) {
            $option3 = $_SESSION['custom_data_3'];
            $new_value['custom_data_3'] =  $option3;
        }
        if (isset($_SESSION['custom_data_4'])) {
            $option4 = $_SESSION['custom_data_4'];
            $new_value['custom_data_4'] =  $option4;
        }
        if (isset($_SESSION['custom_data_5'])) {
            $option5 = $_SESSION['custom_data_5'];
            $new_value['custom_data_5'] =  $option5;
        }

        if( empty($option1) && empty($option2) && empty($option3) && empty($option4) && empty($option5)  )
            return $cart_item_data;
        else
        {
            if(empty($cart_item_data))
                return $new_value;
            else
                return array_merge($cart_item_data,$new_value);
        }

        unset($_SESSION['custom_data_1']);
        unset($_SESSION['custom_data_2']);
        unset($_SESSION['custom_data_3']);
        unset($_SESSION['custom_data_4']);
        unset($_SESSION['custom_data_5']);

    }
}

// Step 3: Extract Custom Data from WooCommerce Session and Insert it into Cart Object

add_filter('woocommerce_get_cart_item_from_session', 'wdm_get_cart_items_from_session', 1, 3 );
if(!function_exists('wdm_get_cart_items_from_session'))
{
    function wdm_get_cart_items_from_session($item,$values,$key)
    {
        if (array_key_exists( 'custom_data_1', $values ) )
        {
            $item['custom_data_1'] = $values['custom_data_1'];
        }
        if (array_key_exists( 'custom_data_2', $values ) )
        {
            $item['custom_data_2'] = $values['custom_data_2'];
        }
        if (array_key_exists( 'custom_data_3', $values ) )
        {
            $item['custom_data_3'] = $values['custom_data_3'];
        }
        if (array_key_exists( 'custom_data_4', $values ) )
        {
            $item['custom_data_4'] = $values['custom_data_4'];
        }
        if (array_key_exists( 'custom_data_5', $values ) )
        {
            $item['custom_data_5'] = $values['custom_data_5'];
        }

        return $item;
    }
}

// Step 4: Display User Custom Data on Cart and Checkout page

add_filter('woocommerce_checkout_cart_item_quantity','wdm_add_user_custom_option_from_session_into_cart',1,3);
add_filter('woocommerce_cart_item_price','wdm_add_user_custom_option_from_session_into_cart',1,3);

if(!function_exists('wdm_add_user_custom_option_from_session_into_cart'))
{


    function wdm_add_user_custom_option_from_session_into_cart($product_name, $values, $cart_item_key )
    {

                        if(count($values['custom_data_1']) > 0)
                        {

                            $return_string = $product_name . "";
                            $return_string .= "";
                            $return_string .= "SKU : " . $values['custom_data_1'] . "

我试图包含以下代码

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );

    function add_custom_price( $cart_object ) {
        $custom_price = 999; // This is the custom price  
        foreach ( $cart_object->cart_contents as $key => $value ) {
            $value['data']->price = $custom_price;
        }
    }

它将价格更改为999,因为它是固定的,但在我的情况下,我无法包含该值

$custom_data_5 = $_POST['custom_data_5']; // thats my unit price which needs to replace the $1 value of the simple product value from the product

对我来说,任何帮助都将不胜感激,因为我现在已经没有选择了,这个解决方案似乎对我来说是正确的。

共有1个答案

蒋承教
2023-03-14

好吧,我想我完成了,当然是在stackoverflow.com搜索......

这是我所做的:

 function ipe_add_to_cart_link() {

        global $product;
        $custom_price = 30;

        echo sprintf( '%s',
                esc_url( $product->add_to_cart_url() ),
                esc_attr( isset( $quantity ) ? $quantity : 1 ),
                $myCustomPrice, // Thats the value im getting from my add_to_cart_button - hidden
                esc_attr( $product->id ),
                esc_attr( $product->get_sku() ),
                esc_attr( isset( $class ) ? $class : 'button' ),
                esc_html( $product->add_to_cart_text() )
        ); 
}

add_filter('woocommerce_loop_add_to_cart_link','ipe_add_to_cart_link');



function ipe_product_custom_price( $cart_item_data, $product_id ) {

     if( isset( $_POST['myCustomPrice'] ) && !empty($_POST['myCustomPrice'])) {     

         $cart_item_data[ "myCustomPrice" ] = $_POST['myCustomPrice'];     
     }
     return $cart_item_data;

 }

 add_filter( 'woocommerce_add_cart_item_data', 'ipe_product_custom_price', 99, 2 );


function ipe_apply_custom_price_to_cart_item( $cart_object ) {  
    if( !WC()->session->__isset( "reload_checkout" )) {

        foreach ( $cart_object->cart_contents as $key => $value ) {
            if( isset( $value["myCustomPrice"] ) ) {
                $value['data']->price = $value["myCustomPrice"];
            }
        }   
    }   
}

add_action( 'woocommerce_before_calculate_totals', 'ipe_apply_custom_price_to_cart_item', 99 );

并将所有内容都放在functions.php中—工作起来很有魅力。希望这个解决方案能帮助其他人。

 类似资料:
  • 我正在尝试获取WooCommerce产品的自定义字段值,以显示在商店系统的不同页面上。我成功地对单个产品页面执行了此操作,但相同的代码不适用于购物车。 对于单个产品,我在函数中使用了此代码。php,它可以很好地工作: 我为购物车尝试了相同的代码,但这次值没有显示在页面上。我还提到了这个线程(获取自定义属性),将$post更改为$product,但仍然没有输出。。。 有什么建议吗?

  • WooCommerce中,非Ajax情况下,点击加入购物车按钮后跳转到何处可以通过filter:add_to_cart_redirect修改,下面代码可以实现产品加入购物车后直接结账的功能,跳过购物车页面。 如果你希望Shop首页或分类页中的加入购物车按钮也具备这种效果,不要勾选Enable AJAX add to cart buttons on archives功能。否则该代码只在单个产品页面有

  • 问题在于当我的客户尝试从购物车中编辑一个产品时。因为所有产品都有相同的ID(我只有一个产品),所以添加到购物车的最后一个产品的元加载到文本字段中。我当前使用产品id检索中的元,但该id与购物车中的所有其他产品相同。有没有其他方法可以在不使用/(如或使用会话)的情况下检索元?

  • 我正在尝试更改购物车和结帐页面中的产品名称。 我有以下代码添加一些购物车元数据: 但是我也想改变产品的名称。 例如,如果产品名称是,自定义字段值是,我想得到。 我该如何实现这一点?

  • 我使用WooCommerce Wordpress中的以下代码,通过一个模板,使用add_to_cart($product_id)功能添加了许多产品。 现在,我希望通过此模板为每个产品添加自定义价格。现在购物车中的价格和数据库中的价格一样,但我想通过这一点添加我的自定义价格。有人能帮我做同样的事吗。谢谢

  • 我已经添加了一个自定义字段,其中有图片帧的额外价格,现在如果图片价格是10$和用户选择一个帧,它将加起来5$让说,总数将是15$。 现在,如果我添加另一个产品,它的选择定制框架价格应该得到添加。e、 g产品1的价格是:10美元,上面选择的框架是:frame1谁的价格是5美元,那么该产品的总价格将是15美元,如果产品2加上价格10美元,选择frame2的价格是6美元,那么该产品的总价格将是16美元,