Reputation: 806
I am creating an online shop with WooCommerce and I'm adding a function which will update the bonus point to my database into absract-wc-payment-gateway.php
.
Here is what I am doing:
place order
button and then the method will get the users bonus points and minus the bonus points with the get-total()
, and then update to the database and go to the thank you page.Here is my code. It will be ran when the user clicks 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";
} else {
echo "Error update record: <>" . mysqli_error($link);
}
Call the method when the user clicks 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: reducePoints()
lines 89 from abstract-WC-Payment-Gateway.php
The get_total()
doesn't work and it returns zero.
What I am doing wrong?
Upvotes: 6
Views: 2981
Reputation: 253824
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 track:
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...
Upvotes: 4