17

プログラムで新しい注文を作成したい。

ワークフローは簡単です: 簡単なフォームを送信した後、ユーザーが作成され、それに伴って新しい注文が作成されます。

なんとか新しいユーザーを作成し、user_id が返されたので、新しい注文をすべて 1 つのステップで割り当てる必要があります。

どうすればこれを達成できますか?

4

8 に答える 8

6

WooCommerce 2.2 (または 100% 確信が持てない 2.1) の時点で、このために特別に設計された関数があります。

wc_create_order( $args = array() )

次のデフォルト引数を使用します。

$default_args = array(
    'status'        => '',
    'customer_id'   => null,
    'customer_note' => null,
    'order_id'      => 0
);

ファイル内の関数全体を確認できincludes/wc-core-functions.phpます。

于 2014-09-22T22:24:23.360 に答える
6

新しい注文を作成するにはWC_Order、 のオブジェクトを作成する必要があります。 WooCommerce 以外で作業している場合、または WooCommerce で作業している場合function.phpは、最初にグローバル$woocommerce変数を定義します。

したがって、コードは 2 行だけになります。

global $woocommerce;

$order = new WC_Order( $order_id );

願っています、それはあなたを助けるでしょう.

于 2013-06-18T13:02:09.910 に答える
6

を使用すると、はるかに簡単に実行できwc_create_order()ます。これは、配送と製品ラインアイテムも追加する例です。Woocommerce サブスクリプションも作成しますが、通常の製品の場合はその部分を無視できます。同じコードが機能します。

function create_test_sub() {

    $email = 'test@test.com';

    $start_date = '2015-01-01 00:00:00';

    $address = array(
        'first_name' => 'Jeremy',
        'last_name'  => 'Test',
        'company'    => '',
        'email'      => $email,
        'phone'      => '777-777-777-777',
        'address_1'  => '31 Main Street',
        'address_2'  => '', 
        'city'       => 'Auckland',
        'state'      => 'AKL',
        'postcode'   => '12345',
        'country'    => 'AU'
    );

    $default_password = wp_generate_password();

    if (!$user = get_user_by('login', $email)) $user = wp_create_user( $email, $default_password, $email );

    // I've used one product with multiple variations

    $parent_product = wc_get_product(22998);

    $args = array(
        'attribute_billing-period' => 'Yearly',
        'attribute_subscription-type' => 'Both'
    );

    $product_variation = $parent_product->get_matching_variation($args);

    $product = wc_get_product($product_variation);  

    // Each variation also has its own shipping class

    $shipping_class = get_term_by('slug', $product->get_shipping_class(), 'product_shipping_class');

    WC()->shipping->load_shipping_methods();
    $shipping_methods = WC()->shipping->get_shipping_methods();

    // I have some logic for selecting which shipping method to use; your use case will likely be different, so figure out the method you need and store it in $selected_shipping_method

    $selected_shipping_method = $shipping_methods['free_shipping'];

    $class_cost = $selected_shipping_method->get_option('class_cost_' . $shipping_class->term_id);

    $quantity = 1;

    // As far as I can see, you need to create the order first, then the sub

    $order = wc_create_order(array('customer_id' => $user->id));

    $order->add_product( $product, $quantity, $args);
    $order->set_address( $address, 'billing' );
    $order->set_address( $address, 'shipping' );

    $order->add_shipping((object)array (
        'id' => $selected_shipping_method->id,
        'label'    => $selected_shipping_method->title,
        'cost'     => (float)$class_cost,
        'taxes'    => array(),
        'calc_tax'  => 'per_order'
    ));

    $order->calculate_totals();

    $order->update_status("completed", 'Imported order', TRUE);

    // Order created, now create sub attached to it -- optional if you're not creating a subscription, obvs

    // Each variation has a different subscription period

    $period = WC_Subscriptions_Product::get_period( $product );
    $interval = WC_Subscriptions_Product::get_interval( $product );

    $sub = wcs_create_subscription(array('order_id' => $order->id, 'billing_period' => $period, 'billing_interval' => $interval, 'start_date' => $start_date));

    $sub->add_product( $product, $quantity, $args);
    $sub->set_address( $address, 'billing' );
    $sub->set_address( $address, 'shipping' );

    $sub->add_shipping((object)array (
        'id' => $selected_shipping_method->id,
        'label'    => $selected_shipping_method->title,
        'cost'     => (float)$class_cost,
        'taxes'    => array(),
        'calc_tax'  => 'per_order'
    ));

    $sub->calculate_totals();

    WC_Subscriptions_Manager::activate_subscriptions_for_order($order);

    print "<a href='/wp-admin/post.php?post=" . $sub->id . "&action=edit'>Sub created! Click here to edit</a>";
}
于 2016-02-09T23:10:53.553 に答える
0

残念ながら、これを行う簡単な方法はないと思います。

wp_insert_post();を使用して注文投稿を追加し、次に を使用してすべてのメタデータを追加する必要がありますupdate_post_meta()woocommerce_add_order_item()次に、 usingとを追加する必要がありwoocommerce_add_order_item_meta()ます。最後に、 を使用して注文ステータスを設定する必要がありますwp_set_object_terms()

それは非常に多くのステップと落とし穴です。データベースを注意深く確認し、処理に必要なすべてのデータとメタ データを追加して、注文を完了する必要があります。

于 2013-06-20T20:42:39.783 に答える
0

woocommerce WC_Checkout クラスには「create_order」メソッドがあります。WC_Checkout クラスのクローンを作成し、別の名前を付けて、目的に合わせてメソッドのコードを変更し、次のように呼び出すことができます

include 'path_to_Cloned_WC_Checkout';
$chk = new Cloned_WC_Checkout();
$chk->create_order();

フォームハンドラーで

于 2014-05-07T14:58:21.463 に答える
0

たぶんこの先..

    function insert_order_to_db($seller,$order_date){
        global $wpdb;
        $result   = $wpdb->query(
            "
            INSERT INTO `wp_posts`(`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`)

            VALUES (
            17188,
            $seller,
            '".date_format($order_date, 'Y-m-d H:i:s e')."',
            '".date_format($order_date, 'Y-m-d H:i:s e')."',
            'no',
            'Order &ndash;". date_format($order_date, 'F d, Y @ h:i A')."',
            'noxp',
            'wc-completed',
            'open',
            'close',
            '".uniqid( 'order_' )."',
            'order-". date_format($order_date, 'M-d-Y-hi-a')."',
            '',
            '',
            '2017-07-24',
            '2017-07-24',
            '',
            0,
            '',
            0,
            'shop_order',
            '',
            0)

            "
        );
        $order_id = $wpdb->insert_id;
        return $order_id;
    }
function proccess_order_meta(){
        $date     = date_create("2017-07-24");
        $order_id = insert_order_to_db(194816,$date);
        if( is_wp_error( $order_id ) ){
            $order->errors = $order_id;
        }
        else
        {
            $order_id = 17188;
            add_post_meta($order_id, '_payment_method_title', 'پرداخت آنلاین', true);
            add_post_meta($order_id, '_order_total', 30000, true);
            add_post_meta($order_id, '_customer_user',  194816, true);
            add_post_meta($order_id, '_completed_date', date_format( $date, 'Y-m-d H:i:s e'), true);
            add_post_meta($order_id, '_paid_date', date_format( $date, 'Y-m-d H:i:s e'), true);
            add_post_meta($order_id, '_billing_email', "mavaezi46@gmail.com", true);
            add_post_meta($order_id, '_billing_first_name', "علی", true);

        }

    }
    proccess_order_meta();
于 2017-08-25T07:14:02.013 に答える