我需要以编程方式创建一个Woocommerce订单,但是使用“旧”Woocommerce使这成为一个非常肮脏的过程。我不得不手动插入所有类型的数据库记录,使用许多update_post_ meta调用。寻找更好的解决方案。
btxsgosb1#
随着WooCommerce的最新版本是可能的尝试这是像
$address = array( 'first_name' => 'Fresher', 'last_name' => 'StAcK OvErFloW', 'company' => 'stackoverflow', 'email' => 'test@test.com', 'phone' => '777-777-777-777', 'address_1' => '31 Main Street', 'address_2' => '', 'city' => 'Chennai', 'state' => 'TN', 'postcode' => '12345', 'country' => 'IN' ); $order = wc_create_order(); $order->add_product( get_product( '12' ), 2 ); //(get_product with id and next is for quantity) $order->set_address( $address, 'billing' ); $order->set_address( $address, 'shipping' ); $order->add_coupon('Fresher','10','2'); // accepted param $couponcode, $couponamount,$coupon_tax $order->calculate_totals();
用你的函数调用上面的代码,它就会相应地工作。
**请注意,它不适用于旧版本的WooCommerce,如2.1.12,它只适用于WooCommerce的2.2。
希望有帮助
s3fp2yjn2#
2017-2023适用于WooCommerce 3及以上版本
Woocommerce 3引入了CRUD对象,订单项有很多变化。此外,一些WC_Order方法现在也被弃用,如add_coupon()。下面是一个函数,允许以编程方式创建一个订单,其中包含所有必需的数据,包括税收:
WC_Order
add_coupon()
function create_wc_order( $data ){ $gateways = WC()->payment_gateways->get_available_payment_gateways(); $order = new WC_Order(); // Set Billing and Shipping adresses foreach( array('billing_', 'shipping_') as $type ) { foreach ( $data['address'] as $key => $value ) { if( $type === 'shipping_' && in_array( $key, array( 'email', 'phone' ) ) ) continue; $type_key = $type.$key; if ( is_callable( array( $order, "set_{$type_key}" ) ) ) { $order->{"set_{$type_key}"}( $value ); } } } // Set other details $order->set_created_via( 'programatically' ); $order->set_customer_id( $data['user_id'] ); $order->set_currency( get_woocommerce_currency() ); $order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ); $order->set_customer_note( isset( $data['order_comments'] ) ? $data['order_comments'] : '' ); $order->set_payment_method( isset( $gateways[ $data['payment_method'] ] ) ? $gateways[ $data['payment_method'] ] : $data['payment_method'] ); $calculate_taxes_for = array( 'country' => $data['address']['country'], 'state' => $data['address']['state'], 'postcode' => $data['address']['postcode'], 'city' => $data['address']['city'] ); // Line items foreach( $data['line_items'] as $line_item ) { $args = $line_item['args']; $product = wc_get_product( isset($args['variation_id']) && $args['variation_id'] > 0 ? $$args['variation_id'] : $args['product_id'] ); $item_id = $order->add_product( $product, $line_item['quantity'], $line_item['args'] ); $item = $order->get_item( $item_id, false ); $item->calculate_taxes($calculate_taxes_for); $item->save(); } // Coupon items if( isset($data['coupon_items'])){ foreach( $data['coupon_items'] as $coupon_item ) { $order->apply_coupon(sanitize_title($coupon_item['code'])); } } // Fee items if( isset($data['fee_items'])){ foreach( $data['fee_items'] as $fee_item ) { $item = new WC_Order_Item_Fee(); $item->set_name( $fee_item['name'] ); $item->set_total( $fee_item['total'] ); $tax_class = isset($fee_item['tax_class']) && $fee_item['tax_class'] != 0 ? $fee_item['tax_class'] : 0; $item->set_tax_class( $tax_class ); // O if not taxable $item->calculate_taxes($calculate_taxes_for); $item->save(); $order->add_item( $item ); } } // Set calculated totals $order->calculate_totals(); if( isset($data['order_status']) ) { // Update order status from pending to your defined status and save data $order->update_status($data['order_status']['status'], $data['order_status']['note']); $order_id = $order->get_id(); } else { // Save order to database (returns the order ID) $order_id = $order->save(); } // Returns the order ID return $order_id; }
代码放在活动子主题(或活动主题)的function.php文件或插件文件中。
用法示例来自数据数组:
create_wc_order( array( 'address' => array( 'first_name' => 'Fresher', 'last_name' => 'StAcK OvErFloW', 'company' => 'stackoverflow', 'email' => 'test1@testoo.com', 'phone' => '777-777-777-777', 'address_1' => '31 Main Street', 'address_2' => '', 'city' => 'Chennai', 'state' => 'TN', 'postcode' => '12345', 'country' => 'IN', ), 'user_id' => '', 'order_comments' => '', 'payment_method' => 'bacs', 'order_status' => array( 'status' => 'on-hold', 'note' => '', ), 'line_items' => array( array( 'quantity' => 1, 'args' => array( 'product_id' => 37, 'variation_id' => '', 'variation' => array(), ) ), ), 'coupon_items' => array( array( 'code' => 'summer', ), ), 'fee_items' => array( array( 'name' => 'Delivery', 'total' => 5, 'tax_class' => 0, // Not taxable ), ), ) );
ix0qys7i3#
随着新发布的WC 2,它的好多了.不过:
老实说,WooCom的API Docs是有限的,也许他们仍然在更新它的过程中。他们目前不告诉我如何创建一个新的订单,哪些参数是必需的等。无论如何,我已经找到了如何使用REST API使用的类和函数来创建一个带有行订单(您的产品)的订单,我想分享一下!我创建了自己的PHP类:
class WP_MyPlugin_woocommerce { public static function init() { // required classes to create an order require_once WOOCOMMERCE_API_DIR . 'class-wc-api-exception.php'; require_once WOOCOMMERCE_API_DIR . 'class-wc-api-server.php'; require_once WOOCOMMERCE_API_DIR . 'class-wc-api-resource.php'; require_once WOOCOMMERCE_API_DIR . 'interface-wc-api-handler.php'; require_once WOOCOMMERCE_API_DIR . 'class-wc-api-json-handler.php'; require_once WOOCOMMERCE_API_DIR . 'class-wc-api-orders.php'; } public static function create_order() { global $wp; // create order $server = new WC_API_Server( $wp->query_vars['wc-api-route'] ); $order = new WC_API_Orders( $server ); $order_id = $order->create_order( array ( 'order' => array ( 'status' => 'processing' , 'customer_id' => get_current_user_id() // , 'order_meta' => array // ( // 'some order meta' => 'a value // , some more order meta' => 1 // ) , 'shipping_address' => array ( 'first_name' => $firstname , 'last_name' => $lastname , 'address_1' => $address , 'address_2' => $address2 , 'city' => $city , 'postcode' => $postcode , 'state' => $state , 'country' => $country ) , 'billing_address' => array(..can be same as shipping ) , 'line_items' => array ( array ( 'product_id' => 258 , 'quantity' => 1 ) ) ) ) ); var_dump($order_id); die(); } }
重要事项:
$result = add_role( 'customer' , __( 'Customer' ) , array ( 'read' => true // , 'read_private_posts' => true // , 'read_private_products' => true , 'read_private_shop_orders' => true , 'edit_private_shop_orders' => true , 'delete_private_shop_orders' => true , 'publish_shop_orders' => true // , 'read_private_shop_coupons' => true , 'edit_posts' => false , 'delete_posts' => false , 'show_admin_bar_front' => false ) );
var_dump(get_option('wp_user_roles'));我的create_order函数很好地创建了一个订单,其中的行项在order_items表中。希望我能帮到你,我花了一段时间才把它弄对。
k2arahey4#
很多答案你展示了最好的过滤器(钩子)使用。我搜索了好几天,因为当我使用“init”时,它不断发出更多的订单。在两分钟内,我收到了30份订单。无论如何使用此代码和1秩序将被创建。另外,将$product = wc_get_product('1001')更改为您的产品ID。参考在第144行:https://github.com/dipolukarov/wordpress/blob/master/wp-content/plugins/woocommerce/classes/class-wc-checkout.php
function my_init2() { $order = wc_create_order(); $order_id = $order->get_id(); $product = wc_get_product( '10001' ); $address = array( 'first_name' => 'John2', 'last_name' => 'Smith1', 'email' => 'johnsmith1@gmail.com', ); //$order->date_created(2020-07-21 ); $order->add_product( $product, 1 ); $order->set_address( $address, 'billing' ); $order->set_created_via( 'programatically' ); $order->calculate_totals(); $order->set_total( $product->get_price() ); $order->update_status( 'wc-completed' ); error_log( '$order_id: ' . $order_id ); } //add_action('admin_init','my_init2'); function my_run_only_once() { if ( get_option( 'my_run_only_once_20' ) != 'completed' ) { my_init2(); update_option( 'my_run_only_once_20', 'completed' ); } } add_action( 'admin_init', 'my_run_only_once' );
4条答案
按热度按时间btxsgosb1#
随着WooCommerce的最新版本是可能的尝试这是像
用你的函数调用上面的代码,它就会相应地工作。
**请注意,它不适用于旧版本的WooCommerce,如2.1.12,它只适用于WooCommerce的2.2。
希望有帮助
s3fp2yjn2#
2017-2023适用于WooCommerce 3及以上版本
Woocommerce 3引入了CRUD对象,订单项有很多变化。此外,一些
WC_Order
方法现在也被弃用,如add_coupon()
。下面是一个函数,允许以编程方式创建一个订单,其中包含所有必需的数据,包括税收:
代码放在活动子主题(或活动主题)的function.php文件或插件文件中。
用法示例来自数据数组:
ix0qys7i3#
随着新发布的WC 2,它的好多了.
不过:
老实说,WooCom的API Docs是有限的,也许他们仍然在更新它的过程中。他们目前不告诉我如何创建一个新的订单,哪些参数是必需的等。
无论如何,我已经找到了如何使用REST API使用的类和函数来创建一个带有行订单(您的产品)的订单,我想分享一下!
我创建了自己的PHP类:
重要事项:
var_dump(get_option('wp_user_roles'));
我的create_order函数很好地创建了一个订单,其中的行项在order_items表中。
希望我能帮到你,我花了一段时间才把它弄对。
k2arahey4#
很多答案你展示了最好的过滤器(钩子)使用。我搜索了好几天,因为当我使用“init”时,它不断发出更多的订单。在两分钟内,我收到了30份订单。无论如何使用此代码和1秩序将被创建。另外,将$product = wc_get_product('1001')更改为您的产品ID。参考在第144行:https://github.com/dipolukarov/wordpress/blob/master/wp-content/plugins/woocommerce/classes/class-wc-checkout.php