Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在WooCommerce中向WC_订单添加自定义功能_Php_Wordpress_Woocommerce - Fatal编程技术网

Php 在WooCommerce中向WC_订单添加自定义功能

Php 在WooCommerce中向WC_订单添加自定义功能,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我刚刚为WooCommerce创建了一个自定义插件,所以我可以添加一个新的手动支付方法,到目前为止,我已经可以让它运行了。但我现在面临的问题是我得到了一个0值 我创建了一个扩展WC\u Order()的类,下面是代码 class WC_Order_Extender extends WC_Order { public function __construct( $order_id ) { parent::__construct( $order_id );

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

我创建了一个扩展
WC\u 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 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'];
}
这里是调用函数的时间

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\u的代码

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

echo $extended_order->get_price_in_btc(); // Always return 0
起初我认为因为它返回
0.00***
硬币,所以它四舍五入到
0
,所以我认为这是十进制的问题,所以我在设置道具时添加了
wc\u format\u decimal
,但它仍然返回为0,即使实际返回的比特币价格是0.0004***

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

编辑

存储在扩展的
$order

编辑2

函数中的proof The
price\u正在console.log()中返回一个值

这是代码

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 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'];
}

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

您是否也尝试过将
wc\u格式\u十进制
替换为
number\u格式

public function set_price_in_btc( $value ) {

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

在谷歌上四处游荡,寻找一些答案后,我终于放弃了目前的编码,删除了
orderextender
,然后创建了一个非常简单的代码,我不知道这是否可行

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

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\u post\u meta($order->get\u id(),“\u price\u in_btc”,true)”直接调用meta即可。


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

第二个参数是“要使用的小数点的数量”,因此您可以尝试使用
wc\u格式\u decimal($value,7)
@SudharshanNair我只添加小数点,但仍然返回0值,但谢谢:您敢肯定它的其余部分工作正常,而不是四舍五入的问题吗?例如,正在使用的函数
process\u payment()
在哪里
$this
中的$this->get\u bitcoin\u rate()
表明它是类的一部分,是吗?此功能是否正常工作?如果不是,我想它会返回false,这很容易被0混淆。@PeterHvD是正确的,首先尝试直接在
set\u price\u in_btc
函数中打印
wc\u format\u decimal($value,7)
,查看该值是否给出了正确的数字。请检查我的编辑,该函数正在@PeterHvD工作