WooCommerce售后跳转自定义页面插件开发问题求助
问题原因
woocommerce_payment_complete钩子仅在在线支付成功完成时触发,而货到付款(COD)属于离线支付方式,订单创建后直接进入「处理中」状态,不会触发该钩子。
解决方案
改用 woocommerce_thankyou 钩子——这个钩子会在用户完成结账、进入「感谢页面」时触发,适用于所有支付方式,包括COD。同时修正订单项获取产品ID的错误(原代码用get_id()获取的是订单项ID,而非产品ID)。
修正后的完整代码
<?php /* Plugin Name: Custom Redirect After Sale Description: Redirects customers to a custom page after a successful sale. */ // 注册产品自定义元框 add_action( 'add_meta_boxes', 'custom_redirect_meta_box' ); function custom_redirect_meta_box() { add_meta_box( 'custom_redirect_meta_box', '自定义跳转URL', 'custom_redirect_meta_box_callback', 'product', 'side' ); } function custom_redirect_meta_box_callback( $post ) { $value = get_post_meta( $post->ID, '_custom_redirect_url', true ); echo '<label for="custom_redirect_url">自定义跳转URL:</label>'; echo '<input type="text" id="custom_redirect_url" name="custom_redirect_url" value="' . esc_attr( $value ) . '" style="width:100%">'; } // 保存产品自定义元数据 add_action( 'save_post_product', 'save_custom_redirect_meta_box_data' ); function save_custom_redirect_meta_box_data( $post_id ) { // 验证权限与非自动保存 if ( !current_user_can( 'edit_post', $post_id ) || defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } if ( isset( $_POST['custom_redirect_url'] ) ) { update_post_meta( $post_id, '_custom_redirect_url', sanitize_text_field( $_POST['custom_redirect_url'] ) ); } } // 结账完成后跳转至自定义页面 add_action( 'woocommerce_thankyou', 'custom_redirect_after_sale' ); function custom_redirect_after_sale( $order_id ) { if ( !$order_id ) return; $order = wc_get_order( $order_id ); $items = $order->get_items(); // 获取订单中第一个产品 $order_item = reset( $items ); if ( !$order_item ) return; // 获取产品ID(注意:订单项用get_product_id()获取关联产品ID) $product_id = $order_item->get_product_id(); $redirect_url = get_post_meta( $product_id, '_custom_redirect_url', true ); if ( $redirect_url ) { wp_redirect( esc_url( $redirect_url ) ); exit; } }
额外优化说明
- 增加了权限验证与自动保存判断,避免不必要的元数据更新
- 对跳转URL使用
esc_url()进行安全过滤,符合WordPress安全规范 - 增加了空值判断,避免因订单无商品等异常情况导致报错
内容的提问来源于stack exchange,提问作者dtommy1979
相关产品推荐
相关产品推荐

