在Woocommerce 3中使用WC_Cart add_to_cart()方法存储自定义数据

时间:2018-08-06 09:20:18

标签: php wordpress woocommerce cart woocommerce-subscriptions

我正在创建一个会员站点,并且为每个会员计划(只有3个计划)完全创建了静态页面。但是,我为每个计划添加了产品,当我按下“选择计划”按钮时,我重定向到一些自定义表单,在该表单中,我询问用户我们将用于实现该计划的信息范围(与sneakertub.com相同)。

我已经将代码写入PHP页面,该页面将处理表单的SUBMIT操作。这个PHP文件infopage.php将处理我通过POST调用发送的POST数据,并将所有这些数据存储到WC会话中。

$customer_name = $_POST["customer_name"];
$customer_email = $_POST["customer_email"];
$customer_sex = $_POST["customer_sex"];
$customer_age = $_POST["customer_age"];
$product_id = $_POST["product_id"];

global $wp_session;
$data = array(
       'customer_name' => $customer_name,
       'customer_email'   => $customer_email,
       'customer_sex'  => $customer_sex,
       'customer_age'     => $customer_age);
$wp_session['custom_SESSION_child']=$data;

WC()->session->set('custom_data_child', $data);

//Add product to WooCommerce cart.
WC()->cart->add_to_cart( $product_id )

但是,我认为上面的代码不起作用。由于我找不到上述任何一种技术的价值。我使用过wp_sessionWC()->session$_SESSION,但是没有任何方法可以解决。

我正在尝试通过这种方式将这些值访问functions.php

add_action( 'woocommerce_before_calculate_totals', 'twf_additional_price', 1, 3 );

function twf_additional_price( $cart_object ) {

    global $wpdb;

    global $wp_session;
    $session_data_2 =  $wp_session['custom_SESSION_child'];
    $session_data = WC()->session->get('custom_data_child');
    var_dump($session_data);
    var_dump($session_data2);

    foreach ( $cart_object->cart_contents as $key => $value ) {
        $extra_charge = 0;
        if(isset($value['twf_user_custom_datas'])){
            $extra_charge = 100;
        }

        $value['data']->set_price($value['data']->price + $extra_charge);
    }
}

现在,请忽略for循环。主要是

var_dump($session_data);
        var_dump($session_data2);

两者都只转储NULL

我的主要目标是将上述所有字段添加到Woocommerce结帐和订购页面中。

请让我知道这里出了什么问题。我知道我可能正在采用非常糟糕的方法,但是我希望“计划选择”的结帐过程与sneakertub.com相同。如果有关于此方法或适当方法的任何教程,请告诉我。我更喜欢在没有插件的情况下这样做,但我也准备使用插件。

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

已更新-您应该使用WC_Cart add_to_cart() method中的最后一个可用参数,而不是使用会话,这样您就可以添加任何自定义购物车项目数据

  

对于基于计算得出的购物车价格变化,最好先进行新的价格计算并将其设置在该自定义购物车数据中。

请尝试以下操作:

1)对于php页面中的代码:

$custom_data = array(); // Initializing

// Set the posted data as cart item custom data
if( isset($_POST['customer_name']) && ! empty($_POST['customer_name']) )
    $custom_data['custom_data']['name']  = sanitize_text_field( $_POST['customer_name'] );
if( isset($_POST['customer_email']) && ! empty($_POST['customer_email']) )
    $custom_data['custom_data']['email'] = sanitize_text_field( $_POST['customer_email'] );
if( isset($_POST['customer_sex']) && ! empty($_POST['customer_sex']) )
    $custom_data['custom_data']['sex']   = sanitize_text_field( $_POST['customer_sex'] );
if( isset($_POST['customer_age']) && ! empty($_POST['customer_age']) )
    $custom_data['custom_data']['age']   = sanitize_text_field( $_POST['customer_age'] );

// Set the calculated item price as custom cart item data
if( isset($custom_data['custom_data']) && sizeof($custom_data['custom_data']) > 0 && $product_id > 0 ) {
    // Get an instance of the WC_Product object
    $product = wc_get_product( $product_id );
    // Save the new calculated price as custom cart item data
    $custom_data['custom_data']['new_price'] = $product->get_price() + 100;
}

// Add product to cart with the custom cart item data
WC()->cart->add_to_cart( $product_id, '1', '0', array(), $custom_data );

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。


2)您重新访问的功能将更改购物车价格

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

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

    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset($cart_item['custom_data']['new_price']) )
            $cart_item['data']->set_price( $cart_item['custom_data']['new_price'] );
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。

  

所有其他自定义购物车项目数据都可以在购物车项目键'custom_data'下作为索引数组使用...因此,您可以轻松地从购物车对象中获取该数据,并将其保存在订单中。