如何检查WooCommerce订单号是否等于帖子ID?

时间:2018-09-18 作者:Pavel Janicek

我面临着一个挑战。我需要检查Woocommerce订单号是否等于Post ID。我知道90%的情况都是这样,但我需要防弹的方法来检查。请参见不正确且订单号和Post ID确实不同的示例:

woocommerce different order number and post ID

需要考虑的事项:

我的插件可能安装在Woocommerce尚未创建订单的时候,但我在wordpress multisite上发现了这种情况,但我知道也有用于顺序订单号的插件。而且有很多插件,所以我不能只检查是否存在一个或两个插件not 按订单ID(始终等于Post ID)

Edit: Expected business flow of my plugin

我开发的插件是用于银行账户支付的“离线支付”。因此,流程如下:

用户选择产品并决定通过“银行账户”支付网关(Woocommerce中的默认网关之一)支付产品number 要付款(在我的情况下是订单号84),用户将向给定的银行帐户汇款,指定订单号(在捷克语中,此字段称为“变量符号”)

  • 插件通过API连接到银行,并查询给定银行帐户上的所有交易我需要决定什么=是否收到订单号84的付款,这意味着订单ID 7257(见上图)已支付
  • 在大多数网站中,订单ID==订单号。然而,这里没有,我需要有逻辑来决定这一点。到目前为止,我只是想在插件中添加一个复选框。。。

    非常感谢你的建议

    2 个回复
    SO网友:Breus

    global $post;
    
    $order = wc_get_order($post->ID);    
    
    if(!empty($order) && $post->ID == $order->get_id()){
    //do things
    }
    
    这应该行得通。第一个检查是因为具有post ID的订单不必像您所说的那样存在。

    SO网友:Pavel Janicek

    我知道我有一个具体的问题,所以我在搜索了几天后才回答。

    Woocommerce拥有its own query 我决定重新使用:

    public function pending_orders(){
            $query = array(
            \'status\' => \'on-hold\',
            \'limit\'=>-1
            );
            $pending_orders = wc_get_orders( $query );
    
            $found_variables = array();
            foreach ($pending_orders as $order){
              $foundit = array(
                \'id\' =>  $order->id,
                \'number\' => trim( str_replace( \'#\', \'\', $order->get_order_number() ) )
               );
               array_push($found_variables,$foundit);
            }
            return $found_variables;
          }
    
    以上内容将向两者推送相同的数字\'id\'\'number\' “我的”列$found_variables 如果它应用订单号==订单ID。但我不在乎,因为如果订单号!=订单ID。

    稍后,插件将查询付款:

    public function search_haystack(){
    
            $pending_variables = $this->pending_orders();
            if (empty($pending_variables)){
                return;
            }
            $downloader = new Downloader($options[\'fio_token\']);
            $transactionList = $downloader->downloadSince(new \\DateTime(\'-1 week\'));
            $allTransactions = $transactionList->getTransactions();
            foreach ($allTransactions as $transaction) {
                if ($transaction->getAmount()>0){
                    if($key = array_search($transaction->getVariableSymbol(), array_column($pending_variables, \'number\'))){
                        $this->maybe_complete_payment($pending_variables[$key][\'id\'],$transaction->getAmount(),$transaction->getCurrency());
                    }
                }
            }
          }
    
    您猜到了,为了完成付款,我需要订单ID,我将其发送到函数:

    public function maybe_complete_payment($variable,$paid_amount,$currency){
            $order = new WC_Order($variable);
            if (($order->get_total() == $paid_amount) and ($currency == $order->get_currency())){
              $order -> payment_complete();
              $order -> add_order_note(\'Successfully paired via Bank Transfer\');
            }
          }
    
    所有的代码都还没有经过测试,但我觉得应该可以正常工作

    结束

    相关推荐

    列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

    这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在