【问题标题】:Add custom function to WC_Order in WooCommerce在 WooCommerce 中向 WC_Order 添加自定义函数
【发布时间】:2018-12-28 12:08:27
【问题描述】:

我刚刚为 WooCommerce 创建了一个自定义插件,所以我可以添加一个新的手动支付方式,到目前为止我已经可以运行它了。但我现在面临的问题是我得到了一个 0 值。

我创建了一个扩展 WC_Order() 的类,这里是代码

class WC_Order_Extender extends WC_Order {

    public function __construct( $order_id ) {

        parent::__construct( $order_id );

        $this->data['price_in_btc'] = 0.0;

        print_r($this->data);
    }

    public function get_price_in_btc() {

        return $this->get_prop( 'price_in_btc' );
    }

    public function set_price_in_btc( $value ) {

        $this->set_prop( 'price_in_btc', wc_format_decimal( $value, 7 ) );
    }
}

这是调用函数的时间

public function process_payment( $order_id ) {

    //$order = new WC_Order( $order_id );
    $order_extended = new WC_Order_Extender( $order_id );

    // get_price_in_btc() always return 0 in thankyou.php page
    $order_extended->set_price_in_btc( $this->get_bitcoin_rate( $order_extended->get_total() ) );

    // Mark as On-Hold (We're waiting for the payment)
    $order_extended->update_status( 'on-hold', __( 'Awaiting for manual BTC payment ', 'wc-manual-btc-gateway' ) );

    // Reduce item stocks
    wc_reduce_stock_levels( $order_id );

    // Clean up the cart
    WC()->cart->empty_cart();

    // Return thank you redirect
    return array(
        'result'    => 'success',
        'redirect'  => $this->get_return_url( $order_extended )
    );
}

这是在thankyou.php页面中调用price_in_btc值的代码

$extended_order = new WC_Order_Extender( $order->get_id() );

echo $extended_order->get_price_in_btc(); // Always return 0

一开始我以为是因为它返回0.00*****硬币,所以它四舍五入到0,所以我认为这是小数的问题,所以我在设置道具时添加了wc_format_decimal,但它仍然返回为0 ,甚至实际回报比特币价格是0.0004***。

请帮忙,我在代码中犯的错误在哪里?

编辑

存储在扩展$order中的数据

编辑 2

证明price_in_btc()函数正在返回一个值console.log()

这是代码

public function get_bitcoin_rate( $total_price ) {

    $cUrl = curl_init();

    curl_setopt_array( $cUrl, array(
        CURLOPT_URL => 'https://api.coindesk.com/v1/bpi/currentprice/IDR.json',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache"    
        )
    ) );

    $data = json_decode( curl_exec( $cUrl ), true );

    $err = curl_error( $cUrl );

    curl_close( $cUrl );

    echo "<script>console.log( '" . wc_format_decimal( $total_price / $data['bpi']['IDR']['rate_float'], 7 ) . "' );</script>";

    return $total_price / $data['bpi']['IDR']['rate_float'];
}

这里是wc_format_decimal()

编辑 3

我在set_price_in_btc()下方添加$order_extended-&gt;save();

$order_extended->set_price_in_btc( $this->get_bitcoin_rate( $order_extended->get_total() ) );
$order_extended->save();

但它仍然返回 0 值。请帮助我不知道该怎么办。

【问题讨论】:

  • 第二个参数是“要使用的小数点数”,你可以试试wc_format_decimal( $value,7 )
  • @SudharshanNair 我只是添加了小数点,但仍然返回 0 值,但谢谢:D
  • 你确定它的其余部分都在工作,而不是四舍五入是问题吗?例如,函数process_payment() 在哪里使用? $this in $this-&gt;get_bitcoin_rate() 暗示它是类的一部分,是吗?此功能是否正常工作?如果不是,我想它会返回 false,这对于 0 很容易混淆。
  • @PeterHvD 是正确的,首先尝试在set_price_in_btc 函数中直接打印wc_format_decimal( $value, 7 ) 来查看值是否给出正确的数字
  • 嗨,请检查我的编辑,该功能正在运行@PeterHvD

标签: php wordpress woocommerce


【解决方案1】:

在谷歌上转了一圈,找到了一些答案,最后我有点放弃我现在的编码,删除order extender然后创建一个非常非常简单的代码,我不知道这样可以吗与否。

对于和我有同样问题但没有找到答案的人,请使用以下代码:

add_action( 'woocommerce_checkout_create_order', 'wc_add_custom_meta_order', 20, 2 );

function wc_add_custom_meta_order( $order, $data ) {

    $order->update_meta_data( '_price_in_btc', $data );
}

用于插入新的自定义元数据

$price_in_btc = number_format( $this->get_bitcoin_rate( $order->get_total() ), 5 );

before_checkout_create_order( $order, $price_in_btc );

这很好地解决了我的问题,尽管这样做有点愚蠢,并且在thankyou.php页面中我只需要使用get_post_meta( $order-&gt;get_id(), '_price_in_btc', true )直接调用元数据

希望这个答案对你有用!干杯! :D

【讨论】:

    【解决方案2】:

    您是否也尝试将wc_format_decimal 替换为number_format

    public function set_price_in_btc( $value ) {
    
            $this->set_prop( 'price_in_btc', number_format( $value, 7 ) );
        }
    

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 2019-07-29
      • 1970-01-01
      • 2019-02-22
      • 2020-12-30
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多