【问题标题】:Wordpress + Woocommerce custom payment gatewayWordpress + Woocommerce 自定义支付网关
【发布时间】:2023-03-03 09:07:20
【问题描述】:

关于 Woocommerce 支付网关的问题。

我已经定制了一个支付网关来接收采购订单,它可以从插件中正确加载,并以 id 喜欢的方式显示在结帐页面上;我认为这是一个很好的开始。

无论如何,我有一个非标准的表单条目(采购订单号),我希望人们填写它,但我不知道如何将它附加到我的自定义支付网关,以便它出现在生成的管理端页。

这一切都很好:

function payment_fields(){
    if ( $description = $this->get_description() )
        echo wpautop( wptexturize( $description ) );
    global $woocommerce;
    ?>
<form class="form-horizontal" role="form" id="bv-form">
<fieldset>
<!-- Form Name -->
  <legend>Purchase Order</legend>
  <!-- Text input-->
    <div class="form-group">
      <label class="control-label" for="po_no">PO Number</label>  
      <div class="">
      <input id="po_no" name="po_no" type="text" placeholder="" class="form-control input-md">
      </div>
    </div>
...

但是当我到达这里时,我不知道如何修改process_payment( $order_id )(或添加到functions.php 的内容)以从支付字段中获取表单值。我看到有$order-&gt;billingAddress1等,我将如何提交额外的几个表单字段以及订单,其次,我如何访问它以从新创建的po_no中获取WC_Order

  • WP:3.9.2
  • WC:2.1.11

感谢您的帮助!

【问题讨论】:

    标签: wordpress woocommerce payment-gateway


    【解决方案1】:

    如果您要创建自定义支付网关,那么您应该在其中实现process_payment()。此代码将可以访问付款表单提交的$_POST 变量,因此您可以将其称为:

    $po_number = ( isset( $_POST['po_no'] ) )? $_POST['po_no'] : 0;
    

    也就是说,从您的问题来看,您可能实际上并未编写自定义网关,而是尝试将自定义字段附加到订单中。如果您想连接到另一个网关(如 PayPal、Authorize.net 等),那么您应该使用被称为 WC_Order.payment_complete() 的一部分的 WooCommerce 操作钩子,这是网关在收取付款后调用的内容。操作是woocommerce_pre_payment_complete,它在任何其他操作之前运行并将订单ID 作为参数,而woocommerce_payment_complete 在设置stock/statuses/etc 之后。

    add_action( 'woocommerce_payment_complete', 'my_woocommerce_payment_complete');
    function my_woocommerce_payment_complete( $order_id ){
        $po_number = ( isset( $_POST['po_no'] ) )? $_POST['po_no'] : 0;
        update_post_meta( $order_id, 'po_number', $po_number );
    }
    

    然后,您可以通过添加元框在“订单编辑”页面上显示此自定义字段。如果要使其可编辑,您需要连接到 save_post 并将 po_number 更改为输入。

    add_action( 'add_meta_boxes',  'po_number_metabox' );
    function add_po_number_metabox(){
        global $post;
        if ( $post->post_type = 'shop_order' ){
                add_meta_box( 'po-number', 'Title',  'po_number_metabox', 'shop_order', 'side', 'default');
        }
    }
    function po_number_metabox(){
        global $post;
        $po_number = get_post_meta( $post->ID, 'po_number', true);
        echo "PO:> {$po_number}";
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 2017-08-05
      • 2014-06-06
      • 2016-08-20
      • 2017-04-04
      • 2020-11-20
      • 2014-03-31
      • 2014-03-10
      相关资源
      最近更新 更多