Capslock10 Capslock10 - 1 year ago 86
PHP Question

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?


Answer Source

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

Update: 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( ){

Somme tracks:

  1. Try to add $order_id at line 89 in: public function reducePoints( $order_id ){ and see if with this you get something this time.

  2. Try to remove my code: $order = new WC_Order($order_id); and add $order to public function reducePoints( $order ){ and see with this the if you get something without the error.

Otherwise I don't really know where or how you can get this $order_id. I will try to ask tomorrow The WooCommerce goddess in StackOverFlow…