You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何改写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:15:44