Программно создавая новый порядок в Woocommerce
У меня сложнее всего программировать создание заказа в WooCommerce. Я использую приведенный ниже код и создаю заказ, но я не могу получить информацию о клиенте или товарные строки, добавленные в заказ. Новый заказ, который создается, просто как Гость без элементов, информации пользователя и т.д.
Проблема заключается в том, что после создания объекта заказа он не работает при попытке добавить данные в заказ.
function create_vip_order() {
global $woocommerce;
$address = array(
'first_name' => '111Joe',
'last_name' => 'Conlin',
'company' => 'Speed Society',
'email' => '[email protected]',
'phone' => '760-555-1212',
'address_1' => '123 Main st.',
'address_2' => '104',
'city' => 'San Diego',
'state' => 'Ca',
'postcode' => '92121',
'country' => 'US'
);
// Now we create the order
$order = wc_create_order();
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product( '275962' ), 1 ); // This is an existing SIMPLE product
$order->set_address( $address, 'billing' );
//
$order->calculate_totals();
$order->update_status("Completed", 'Imported order', TRUE);
}
add_action( 'woocommerce_init', 'create_vip_order' );
Вот ошибка, которую я получаю в своих журналах:
[19-Apr-2016 21:16:38 UTC] PHP Fatal error: Uncaught Error: Call to a member function add_product() on boolean in /Users/joe/Sites/speedsociety-2/wp-content/themes/ss/lib/contests/order.php:107
Stack trace:
#0 /Users/joe/Sites/speedsociety-2/wp-includes/plugin.php(525): create_vip_order('')
#1 /Users/joe/Sites/speedsociety-2/wp-content/plugins/woocommerce/woocommerce.php(330): do_action('woocommerce_ini...')
#2 /Users/joe/Sites/speedsociety-2/wp-includes/plugin.php(525): WooCommerce->init('')
#3 /Users/joe/Sites/speedsociety-2/wp-settings.php(392): do_action('init')
#4 /Users/joe/Sites/speedsociety-2/wp-config.php(67): require_once('/Users/joe/Site...')
#5 /Users/joe/Sites/speedsociety-2/wp-load.php(37): require_once('/Users/joe/Site...')
#6 /Users/joe/Sites/speedsociety-2/wp-admin/admin.php(31): require_once('/Users/joe/Site...')
#7 /Users/joe/Sites/speedsociety-2/wp-admin/edit.php(10): require_once('/Users/joe/Site...')
#8 {main}
thrown in /Users/joe/Sites/speedsociety-2/wp-content/themes/ss/lib/contests/order.php on line 107
Любая помощь по этому поводу была бы оценена MOST!
Ответы
Ответ 1
Проблема заключается в вашем действии. Используйте следующий крючок:
add_action('woocommerce_checkout_process', 'create_vip_order');
function create_vip_order() {
global $woocommerce;
$address = array(
'first_name' => '111Joe',
'last_name' => 'Conlin',
'company' => 'Speed Society',
'email' => '[email protected]',
'phone' => '760-555-1212',
'address_1' => '123 Main st.',
'address_2' => '104',
'city' => 'San Diego',
'state' => 'Ca',
'postcode' => '92121',
'country' => 'US'
);
// Now we create the order
$order = wc_create_order();
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product('275962'), 1); // This is an existing SIMPLE product
$order->set_address( $address, 'billing' );
//
$order->calculate_totals();
$order->update_status("Completed", 'Imported order', TRUE);
}
Убедитесь, что указанный идентификатор продукта существует в системе.
Ответ 2
Ну, вы можете сделать это без функции wc_create_order.
$order_data = array();
$order_data[ 'post_type' ] = 'shop_order';
$order_data[ 'post_status' ] = 'wc-' . apply_filters( 'woocommerce_default_order_status', 'pending' );
$order_data[ 'ping_status' ] = 'closed';
$order_data[ 'post_author' ] = 1;
$order_data[ 'post_password' ] = uniqid( 'order_' );
$order_data[ 'post_title' ] = sprintf( __( 'Order – %s', 'woocommerce' ), strftime( _x( '%b %d, %Y @ %I:%M %p', 'Order date parsed by strftime', 'woocommerce' ), strtotime( $post_date ) ) );
$order_data[ 'post_parent' ] = 12; // parent post id
$order_data[ 'post_content' ] = "";
$order_data[ 'comment_status' ] = "open";
$order_data[ 'post_name' ] = sanitize_title( sprintf( __( 'Order – %s', 'woocommerce' ), strftime( _x( '%b %d, %Y @ %I:%M %p', 'Order date parsed by strftime', 'woocommerce' ), strtotime( $post_date) ) ) );
$order_id = wp_insert_post( apply_filters( 'woocommerce_new_order_data', $order_data ), true );
Затем вы можете использовать этот $order_id для добавления других деталей, например...
$order = wc_get_order( $order_id );
$product_item_id = $order->add_product( wc_get_product( $product_id ));
wc_add_order_item_meta($product_item_id,"meta_key","meta_values");
$addressShipping = array(
'first_name' => $shippingName,
'email' => $user_email_id,
'phone' => $billingPhone,
'address_1' => $shippingAddress,
'address_2' => $shippingAddress2,
'city' => $shippingCity,
'state' => $shippingStateCode,
'postcode' => $shippingZip,
'country' => 'US');
$order->set_address( $addressShipping, 'shipping' );
$addressBilling = array(
'first_name' => $billingName,
'email' => $user_email_id,
'phone' => $billingPhone,
'address_1' => $billingAddress,
'address_2' => $billingAddress2,
'city' => $billingCity,
'state' => $billingStateCode,
'postcode' => $billingZip,
'country' => 'US');
$order->set_address( $addressBilling, 'billing' );
$order->calculate_totals();
Ответ 3
Я действительно не мог понять вашу проблему, но предоставил вам другую альтернативу, это может вам помочь.
Сначала я добавил продукты в $woocommerce->cart
, а затем назначил данные корзины новому порядку, созданному следующим образом:
//Для простого произведения
$woocommerce->cart->add_to_cart($product_id, $quantity);
//Для переменной продукции
$woocommerce->cart->add_to_cart($product_id, $quantity, $variationID, $attr_array);
$order_data = array(
'status' => apply_filters('woocommerce_default_order_status', 'processing'),
'customer_id' => $user_id
);
$new_order = wc_create_order($order_data);
foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) {
$item_id = $new_order->add_product(
$values['data'], $values['quantity'], array(
'variation' => $values['variation'],
'totals' => array(
'subtotal' => $values['line_subtotal'],
'subtotal_tax' => $values['line_subtotal_tax'],
'total' => $values['line_total'],
'tax' => $values['line_tax'],
'tax_data' => $values['line_tax_data'] // Since 2.2
)
)
);
}
$new_order->set_address($address, 'billing');
$new_order->set_address($address, 'shipping');
Ответ 4
у вас почти было это, add_action( 'woocommerce_init', 'create_vip_order' );
woocommerce_init слишком рано, вам нужно изменить свой крючок, по крайней мере, на init,
ваши ошибки
[19-Apr-2016 21:16:38 UTC] PHP Fatal error: Uncaught Error: Call to a member function add_product() on boolean in /Users/joe/Sites/speedsociety-2/wp-content/themes/ss/lib/contests/order.php:107
Stack trace:
#0 /Users/joe/Sites/speedsociety-2/wp-includes/plugin.php(525): create_vip_order('')
#1 /Users/joe/Sites/speedsociety-2/wp-content/plugins/woocommerce/woocommerce.php(330): do_action('woocommerce_ini...')
#2 /Users/joe/Sites/speedsociety-2/wp-includes/plugin.php(525): WooCommerce->init('')
#3 /Users/joe/Sites/speedsociety-2/wp-settings.php(392): do_action('init')
#4 /Users/joe/Sites/speedsociety-2/wp-config.php(67): require_once('/Users/joe/Site...')
#5 /Users/joe/Sites/speedsociety-2/wp-load.php(37): require_once('/Users/joe/Site...')
#6 /Users/joe/Sites/speedsociety-2/wp-admin/admin.php(31): require_once('/Users/joe/Site...')
#7 /Users/joe/Sites/speedsociety-2/wp-admin/edit.php(10): require_once('/Users/joe/Site...')
#8 {main}
thrown in /Users/joe/Sites/speedsociety-2/wp-content/themes/ss/lib/contests/order.php on line 107
показать, что это происходит с переменной $order, было возвращено false, и поэтому вы не можете использовать $order->add_product
здесь мой рабочий код
function create_vip_order() {
global $woocommerce;
$address = array(
'first_name' => '111Joe',
'last_name' => 'Conlin',
'company' => 'Speed Society',
'email' => '[email protected]',
'phone' => '760-555-1212',
'address_1' => '123 Main st.',
'address_2' => '104',
'city' => 'San Diego',
'state' => 'Ca',
'postcode' => '92121',
'country' => 'US'
);
// Now we create the order
$order = wc_create_order();
// The add_product() function below is located in /plugins/woocommerce/includes/abstracts/abstract_wc_order.php
$order->add_product( get_product( '129' ), 1 ); // This is an existing SIMPLE product
$order->set_address( $address, 'billing' );
//
$order->calculate_totals();
$order->update_status("Completed", 'Imported order', TRUE);
}
add_action( 'init', 'create_vip_order' );
Удачи и счастливого кодирования: D