Подтвердить что ты не робот

Создание заказа Woocommerce с программным обеспечением line_item

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

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

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

4b9b3361

Ответ 1

С последней версией 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.

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

Ответ 2

С новой версией WC 2 это намного лучше.

Однако:

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

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

В любом случае, я понял, как создать заказ с линейным заказом (вашим продуктом), используя классы и функции, используемые 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();
}
}

Важно:

  • Константа "WOOCOMMERCE_API_DIR" указывает на "/woocommerce/includes/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.

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