【发布时间】: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->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()在哪里使用?$thisin$this->get_bitcoin_rate()暗示它是类的一部分,是吗?此功能是否正常工作?如果不是,我想它会返回 false,这对于 0 很容易混淆。 -
@PeterHvD 是正确的,首先尝试在
set_price_in_btc函数中直接打印wc_format_decimal( $value, 7 )来查看值是否给出正确的数字 -
嗨,请检查我的编辑,该功能正在运行@PeterHvD
标签: php wordpress woocommerce