0

I have tried modifying the answer provided in //stackoverflow.com/a/59544491/19984414. I am not getting any errors when testing it, but also nothing really happens to my test order.

How can I test, why nothing happens when I make an order?

add_action( 'woocommerce_checkout_order_processed', 'action_woocommerce_checkout_order_processed', 10, 3 );

function action_woocommerce_checkout_order_processed( $order_id, $posted_data, $order ) {
// Initialize
$check_for_stock = false;
$taxonomy = 'product_tag';

// Loop through order items
foreach ( $order->get_items() as $item_key => $item ) {
    // Get product
    $product = $item->get_product();

    // Product has tag 'stock'
    if ( has_term( 'stock', $taxonomy, $product ) ) {
        // Will only be executed once if the order contains line items with tag "stock"
        if ( $check_for_stock == false ) {
            $check_for_stock = true;

            // Create new order with stock items
            $stock_order = wc_create_order();
        }

        // Add product to 'backorder' order
        $stock_order->add_product( $product, $item['quantity'] );
        $stock_order->save();

        // Delete item from original order
        $order->remove_item( $item->get_id() );
    }
}

// If current order contains line items with product tag "stock", retrieve the necessary data from the existing order and apply it in the new order
if ( $check_for_stock ) {
    // Recalculate and save original order
    $order->calculate_totals();
    $order->save();
    
    // Obtain necessary information
    // Get address
    $address = array(
        'first_name' => $order->get_billing_first_name(),
        'last_name'  => $order->get_billing_last_name(),
        'email'      => $order->get_billing_email(),
        'phone'      => $order->get_billing_phone(),
        'address_1'  => $order->get_billing_address_1(),
        'address_2'  => $order->get_billing_address_2(),
        'city'       => $order->get_billing_city(),
        'state'      => $order->get_billing_state(),
        'postcode'   => $order->get_billing_postcode(),
        'country'    => $order->get_billing_country()
    );

    // Get shipping
    $shipping = array(
        'first_name' => $order->get_shipping_first_name(),
        'last_name'  => $order->get_shipping_last_name(),
        'address_1'  => $order->get_shipping_address_1(),
        'address_2'  => $order->get_shipping_address_2(),
        'city'       => $order->get_shipping_city(),
        'state'      => $order->get_shipping_state(),
        'postcode'   => $order->get_shipping_postcode(),
        'country'    => $order->get_shipping_country()
    );
    
    // Get order currency
    $currency = $order->get_currency();

    // Get order payment method
    $payment_gateway = $order->get_payment_method();
    
    // Required information has been obtained, assign it to the 'backorder' order
    // Set address
    $stock_order->set_address( $address, 'billing' );
    $stock_order->set_address( $shipping, 'shipping' );

    // Set the correct currency and payment gateway
    $stock_order->set_currency( $currency );
    $stock_order->set_payment_method( $payment_gateway );

    // Calculate totals
    $stock_order->calculate_totals();

    // Set order note with original ID
    $stock_order->add_order_note( 'Automated "stock" order. Created from the original order ID: ' . $order_id );
    
    // Optional: give the new 'backorder' order the correct status
    $stock_order->update_status( 'on-hold' );
    
    $stock_order->save();

}
}

I am running the snippet from WPCodeBox with the following (default) settings:

How to run the snippet: Always (On Page Load)
Hook/Priority: Root (Default)
Snippet Order: 10
Where to run the snippet: Everywhere

  • _"I am running the snippet from WPCodeBox"_ - Keep it as simple as possible, why use extra plugins that end up doing more harm than good. || _"How can I test, why nothing happens when I make an order?"_ - [by debugging](https://stackoverflow.com/q/61740111/11987538), which should always be the first step when looking for the 'why isn't it working' – 7uc1f3r Sep 13 '22 at 10:44
  • "Keep it as simple as possible, why use extra plugins that end up doing more harm than good.", long story short, I cannot use functions.php and WPCodeBox catches most of my syntax errors etc. "by debugging" - Yes, you are correct of course, I have "wc_get_logger()->debug( 'test' );" inside the "if ( has_term(.." statement, but nothing is returned in the log, and I am 100% confident that the products I am testing with indeed does have the specific tag in question. – Cruiseback Sep 13 '22 at 13:21

0 Answers0