создание заказа Woocommerce с помощью позиции программно


Мне нужно было создать заказ Woocommerce программно, однако использование "старой" Woocommerce сделало эту процедуру очень грязной.

Мне пришлось вставлять все записи базы данных вручную, используя множество вызовов update_post_meta.

Ищу лучшее решение.

Author: Cœur, 2014-10-27

2 answers

С последней версией WooCommerce можно попробовать это как что-то вроде

$address = array(
            'first_name' => 'Fresher',
            'last_name'  => 'StAcK OvErFloW',
            'company'    => 'stackoverflow',
            'email'      => '[email protected]',
            '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, он работает только с 2.2 WooCommerce.

Надеюсь, это поможет

 39
Author: Vignesh Pichamani, 2015-10-15 14:55:58

С новым выпуском WC 2 все стало намного лучше.

Однако:

  • Я не хочу использовать REST API, потому что я делаю вызов напрямую из своего собственного плагина WP. Я не вижу смысла делать завиток на моем локальном хосте
  • 'Клиентская библиотека REST API WooCommerce' для меня бесполезна, потому что она ретранслируется в REST API и не поддерживает вызов создания заказа

Честно говоря, API-документы WooCom ограничены, возможно, они все еще находятся в ход его обновления. В настоящее время они не говорят мне, как создать новый заказ, какие параметры требуются и т.д.

В любом случае, я понял, как создать заказ с линейным заказом (ваш продукт), используя классы и функции, используемые API REST, и я хочу поделиться им!

Я создал свой собственный класс 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();
}
}

Важно:

  • Константа 'WOOCOMMERCE_API_DIR' указывает на '/woocommerce/включает/api/' в каталоге вашего плагина.
  • Заказ присваивается клиент, в моем случае текущий вошедший в систему пользователь. Убедитесь, что у вашего пользователя есть роль, которая позволяет читать, редактировать, создавать и удалять заказы. Моя роль выглядит так:

       $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.

Надеюсь, я вам помог, мне потребовалось некоторое время, чтобы это правильно.

 7
Author: Mattijs, 2014-10-27 09:33:21