Place a WooCommerce order 'On Hold' if billing and shipping address do not match

Viewed 126

I need to reduce fraud on my WooCommerce site. Most of the time someone writes a robot which uses different stolen credit cards over and over again and will use the person's billing info, but ship the products purchased with the stolen money to somewhere else. So, I want to place all orders On Hold if the billing information does not match the shipping information.

Here is the function I have so far inside my functions.php file that is not working. Can anyone point out where I am going wrong?

add_action( 'woocommerce_thankyou', 'woocommerce_billing_shipping_address_match', 10, 1);
function woocommerce_billing_shipping_address_match( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    // Get an instance of the WC_Customer Object from the user ID
    $customer = new WC_Customer( $user_id );

    // Customer billing information details (from account)
    // if this doesn't work, try removing the 2nd equals sign in each line below
    $billing_first_name == $customer->get_billing_first_name();
    $billing_last_name  == $customer->get_billing_last_name();
    $billing_company    == $customer->get_billing_company();
    $billing_address_1  == $customer->get_billing_address_1();
    $billing_address_2  == $customer->get_billing_address_2();
    $billing_city       == $customer->get_billing_city();
    $billing_state      == $customer->get_billing_state();
    $billing_postcode   == $customer->get_billing_postcode();
    $billing_country    == $customer->get_billing_country();

    // Customer shipping information details (from account)
    $shipping_first_name == $customer->get_shipping_first_name();
    $shipping_last_name  == $customer->get_shipping_last_name();
    $shipping_company    == $customer->get_shipping_company();
    $shipping_address_1  == $customer->get_shipping_address_1();
    $shipping_address_2  == $customer->get_shipping_address_2();
    $shipping_city       == $customer->get_shipping_city();
    $shipping_state      == $customer->get_shipping_state();
    $shipping_postcode   == $customer->get_shipping_postcode();
    $shipping_country    == $customer->get_shipping_country();

    $order = wc_get_order( $order_id );

    // The text for the note
    $note_1 = __("This was a test order");

    // Add the note
    $order->add_order_note( $note_1 );

    // check if all the billing info matches all of the shipping info and place on hold if not
    if( $billing_first_name !== $shipping_first_name || 
        $billing_last_name  !== $shipping_last_name  || 
        $billing_address_1  !== $shipping_address_1  || 
        $billing_address_2  !== $shipping_address_2  || 
        $billing_city       !== $shipping_city       || 
        $billing_state      !== $shipping_state      || 
        $billing_postcode   !== $shipping_postcode   || 
        $billing_country    !== $shipping_country) {

            // The text for the note
            $note_2 = __("The billing and shipping info did not match");

            // Add the note
            $order->add_order_note( $note_2 );

            // Place the order on hold
            $order->update_status( 'on-hold' );
    }
}
1 Answers

You did two things wrong here. #1, the $order variable should be above the variables that grab the billing and shipping info. #2, you are grabbing from $customer in the variables that store the address data, but that is unnecessary. You can just grab from $order there too. The $customer variable is not needed. In total, your functions.php code should look like this:

/* PLACE ORDERS ON HOLD WHEN BILLING & SHIPPING INFO DO NOT MATCH */
add_action( 'woocommerce_thankyou', 'woocommerce_billing_shipping_address_match', 10, 1);
function woocommerce_billing_shipping_address_match( $order_id ) {
    if ( ! $order_id ) {
        return;
    }
    // Get the order id
    $order = wc_get_order( $order_id );

    // Customer billing information details
    $billing_first_name = $order->get_billing_first_name();
    $billing_last_name = $order->get_billing_last_name();
    $billing_company = $order->get_billing_company();
    $billing_address_1 = $order->get_billing_address_1();
    $billing_address_2 = $order->get_billing_address_2();
    $billing_city = $order->get_billing_city();
    $billing_state = $order->get_billing_state();
    $billing_postcode = $order->get_billing_postcode();
    $billing_country = $order->get_billing_country();

    // Customer shipping information details (from account)
    $shipping_first_name = $order->get_shipping_first_name();
    $shipping_last_name  = $order->get_shipping_last_name();
    $shipping_company    = $order->get_shipping_company();
    $shipping_address_1  = $order->get_shipping_address_1();
    $shipping_address_2  = $order->get_shipping_address_2();
    $shipping_city       = $order->get_shipping_city();
    $shipping_state      = $order->get_shipping_state();
    $shipping_postcode   = $order->get_shipping_postcode();
    $shipping_country    = $order->get_shipping_country();

    // check if any the billing info does not match the shipping info and place on hold if not
    if($billing_first_name !== $shipping_first_name || $billing_last_name !== $shipping_last_name || $billing_address_1 !== $shipping_address_1 || $billing_address_2 !== $shipping_address_2 || $billing_city !== $shipping_city || $billing_state !== $shipping_state || $billing_postcode !== $shipping_postcode || $billing_country !== $shipping_country) {
            // Place the order on hold
            $order->update_status( 'on-hold' );
    }
}
Related