如何改写WooCommerce的order_pay函数添加未登录访问限制
限制未登录用户访问WooCommerce订单支付页面
要实现限制未登录用户访问order-pay页面(包含你列出的两种URL形式),需要修改WooCommerce核心文件中的指定私有静态函数,具体操作如下:
1. 定位目标文件与函数
打开路径 C:/xampp/htdocs/wordpress/wp-content/plugins/woocommerce/includes/shortcodes/class-wc-shortcode-checkout.php,找到 private static function order_pay() 方法。
2. 添加访问限制逻辑
在函数内获取并验证订单对象的代码段之后,插入未登录用户的检查逻辑。具体来说,在以下代码之后:
$order = wc_get_order( $order_id ); if ( ! $order || $order->get_order_key() !== $order_key ) { wc_get_template( 'checkout/error.php', array( 'messages' => array( __( 'Invalid order.', 'woocommerce' ) ) ) ); return; }
添加以下代码:
// 拦截未登录用户的支付页面访问,显示订单收据 if ( ! is_user_logged_in() ) { wc_get_template( 'checkout/order-receipt.php', array( 'order' => $order, 'order_key' => $order_key, ) ); return; }
3. 逻辑说明
- 当未登录用户访问任意
order-pay页面时,系统会直接加载指定的订单收据模板,替代原有的支付表单页面,从而限制未登录用户进行支付操作。 - 该逻辑同时覆盖你列出的两种URL形式:带
pay_for_order=true参数和不带该参数的支付页面。
注意:直接修改WooCommerce核心文件会在插件更新时被覆盖,若想长期保留该功能,建议通过自定义插件或主题
functions.php使用钩子实现相同逻辑,示例代码如下:add_action( 'woocommerce_before_checkout_form', 'restrict_order_pay_to_logged_in_users' ); function restrict_order_pay_to_logged_in_users() { if ( is_checkout_pay_page() && ! is_user_logged_in() ) { global $wp; $order_id = absint( $wp->query_vars['order-pay'] ); $order_key = wc_clean( $_GET['key'] ); $order = wc_get_order( $order_id ); if ( $order && $order->get_order_key() === $order_key ) { wc_get_template( 'checkout/order-receipt.php', array( 'order' => $order, 'order_key' => $order_key, ) ); exit; } } }
内容的提问来源于stack exchange,提问作者social.reza
相关产品推荐
相关产品推荐

