Capslock10 Capslock10 - 3 months ago 13x
PHP Question

[Solved]WooCommerce - get_order() doesn't work and it returns zero

I am creating a online shop with WooCommerce, and I am adding a function which will update the bonus point to my database into


Here is what I am doing:

  1. Firstly, on the checkout page, the users will click the
    place order
    button and then the method will get the users bonus points and minus the bonus points with the
    , and then update to the database and go to the thankyou page.
    enter image description here

  2. Then, the thank you page will get the user's bonus points from the database. And I set the bonus points value to 2000. So in this case, the bonus points should be minus by total Points($50.00)

enter image description here

Here is my code. It will be ran when the user click the place order button:

global $woocommerce;
$order = new WC_Order($order_id);
$total = $order->get_total();
$bonusPoint -= (int)$total; //minus total price and calculate the latest bonus point

$updateSql = "UPDATE userdata02 SET bonusPoint ='" .$bonusPoint. "' WHERE userID = 2147483647";

mysqli_query($link, $updateSql);// update to an int column

if(mysqli_query($link, $updateSql)){
echo "Record updated successfully";
echo "Error update record: <>" . mysqli_error($link);

Call the method when the user click place button:

public function get_return_url( $order = null ) {

if ( $order ) {

//$message = "wrong answer";
//echo "<script type='text/javascript'>alert('$message');</script>";
$return_url = $order->get_checkout_order_received_url();
} else {
$return_url = wc_get_endpoint_url( 'order-received', '', wc_get_page_permalink( 'checkout' ) );

if ( is_ssl() || get_option('woocommerce_force_ssl_checkout') == 'yes' ) {
$return_url = str_replace( 'http:', 'https:', $return_url );
self::reducePoints(); //Call reducePoints();
return apply_filters( 'woocommerce_get_return_url', $return_url, $order );

The source code:
lines 89

doesn't not work, it will return zero.

What I am doing wrong?



You need to create an object for $order to use it with get_total(). Try this:

global $woocommerce;
$order = new WC_Order($order_id);
$total = $order->get_total(); //Get the total price of the order.
$bonusPoints -= (int)$total; //calculate the new bonusPoints

Update1: This is just solving the internal data error. We need to get the $order_id to get it work…

Note: You can remove global $woocommerce;before $order = new WC_Order($order_id); because is already included in public function reducePoints( ){

Update2 - The good tracks:

Remove my code:

global $woocommerce;
$order = new WC_Order($order_id); 

Then at line 89 of your code just add $order in:

public function reducePoints( $order ){
    global $woocommerce;

    // ...

Really happy that this works… It was a long search...