woocommerce_payment_complete 在已显示订单接收页面后触发

woocommerce_payment_complete fires after order received page is already shown

我正在尝试将会员卡集成到 WooCommerce 网上商店中。订单完成后,我调用他们的 API 来生成忠诚度积分,并将令牌存储在订单的元标记中。 在订单确认页面和电子邮件中,我想使用元标记中存储的令牌显示忠诚度积分的二维码。

一切正常,除了在生成令牌之前显示确认页面,因此无法显示二维码。

  1. 我使用 woocommerce_payment_complete 操作创建令牌。
add_action( 'woocommerce_payment_complete', 'get_loyalty_token');
function get_loyalty_token( $order_id ){

    $order = wc_get_order( $order_id );
  
    if ( $order ) {
        $total = $order->get_total();

        $loyalty= new Loyalty(); 
        $loyalty->create_code( $total, 'webshop-' . $order->get_id() );

        $token = $loyalty->get_token() ?: '';

        add_post_meta( $order->get_id(), 'meta_loyalty_token', $token );
    }
}
  1. order-details.php 模板中,我添加了此代码以加载和显示 QR 码(与确认电子邮件相同。
$token = get_post_meta( $order->get_id(), 'meta_loyalty_token', TRUE);

$loyalty= new Loyalty(); 
$loyalty->get_code($token);

echo $loyalty->html_block();

显示订单确认时,没有二维码,因为meta_loyalty_token还没有设置。如果我重新加载确认页面,则会显示二维码,因为到那时,令牌已生成并存储。

我应该使用其他操作来代替 woocommerce_payment_complete 吗?或者有没有办法只有在这个操作完成后才显示确认页面?

您可以改用 woocommerce_checkout_update_order_meta 挂钩。

所以你得到:

/**
 * Action hook fired after an order is created used to add custom meta to the order.
 *
 * @since 3.0.0
 */
function action_woocommerce_checkout_update_order_meta( $order_id, $data ) {
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Is a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Get total
        $total = $order->get_total();

        $loyalty = new Loyalty(); 
        $loyalty->create_code( $total, 'webshop-' . $order_id );

        $token = $loyalty->get_token();
        
        // Update meta
        update_post_meta( $order_id, 'meta_loyalty_token', $token );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'action_woocommerce_checkout_update_order_meta', 10, 2 );