6

私は WooCommerce でオンライン ショップを作成しており、ボーナス ポイントをデータベースに更新する関数を に追加していますabsract-wc-payment-gateway.php

これが私がやっていることです:

  1. まず、チェックアウト ページで、ユーザーがplace orderボタンをクリックすると、メソッドはユーザーにボーナス ポイントを取得し、ボーナス ポイントを で差し引いてget-total()から、データベースを更新してサンキュー ページに移動します。

ここに画像の説明を入力

  1. 次に、サンキュー ページはデータベースからユーザーのボーナス ポイントを取得します。そして、ボーナス ポイントの値を 2000 に設定しました。したがって、この場合、ボーナス ポイントは合計ポイント ($50.00) でマイナスになるはずです。

ここに画像の説明を入力

これが私のコードです。ユーザーが注文ボタンをクリックすると実行されます。

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);
}

ユーザーが配置ボタンをクリックしたときにメソッドを呼び出します。

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 );
}

ソースコード: abstract-WC-Payment-Gateway.php のreducePoints()89 行目

get_total()機能せず、ゼロを返します。

私が間違っていることは何ですか?

4

1 に答える 1

4

$orderで使用するには、 のオブジェクトを作成する必要がありますget_total()。これを試して:

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:これは、内部データ エラーを解決するだけです。機能させるには を取得する必要があり$order_idます…</p>

注:は既に含まれているため、global $woocommerce;事前に削除できます。$order = new WC_Order($order_id);public function reducePoints( ){


Update2 - 良いトラック:

私のコードを削除してください:

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

次に、コードの 89 行目に次のように追加$orderします。

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

    // ...

これが機能するのは本当にうれしいです…長い検索でした…

于 2016-07-11T13:12:00.540 に答える