讲师中心 微信公众号
AI工具推荐 视频效率加速

WooCommerce:安全重定向未登录用户的自定义账户页面端点

夏强吖_3879

夏强吖_3879

发布时间:2025-12-05 13:37:41

|

237人浏览过

|

来源于php中文网

原创

WooCommerce:安全重定向未登录用户的自定义账户页面端点

本文详细介绍了如何解决woocommerce中未登录用户意外访问“我的账户”页面及其自定义端点的问题。通过利用`template_redirect`钩子和精确的条件逻辑,教程展示了如何确保只有已登录用户才能访问这些受保护的页面,同时允许“找回密码”等特定页面对未登录用户开放,从而提升网站的安全性和用户体验。

在WooCommerce开发中,有时我们希望“我的账户”页面及其所有子页面(包括自定义端点)仅对已登录用户可见。例如,当网站设计要求登录/注册表单以弹窗形式展示,而非通过默认的“我的账户”页面时,就需要实现这种重定向机制。这不仅关乎用户体验,更是网站安全性的重要组成部分,防止未授权访问敏感信息或功能。

理解问题:未登录用户访问“我的账户”端点

最初的重定向尝试通常会针对“我的账户”主页面进行,但往往忽略了其下方的自定义端点。当用户在未登录状态下直接访问如 my-account/my_returns 这样的自定义端点时,原有的重定向逻辑可能无法生效,导致用户看到不应出现的登录表单或页面内容。

初始重定向逻辑示例(存在局限性):

add_action( 'template_redirect', 'wish_custom_redirect' );

function wish_custom_redirect() {
  global $wp;

  if (
        !is_user_logged_in()
        &&
        ('my-account' == $wp->request) // 仅针对 'my-account' 主页面
        &&
        ('lost-password' != $wp->request) // 排除 'lost-password'
     )
  {
    wp_redirect( home_url() );
    exit;
  }
}

这段代码的问题在于,('my-account' == $wp->request) 这一条件只精确匹配了“我的账户”主页的请求路径。当请求路径是 my-account/my_returns 时,$wp->request 的值会是 my-account/my_returns,与 'my-account' 不匹配,因此重定向不会触发。

WooCommerce自定义端点的创建

为了更好地理解重定向的必要性,我们首先回顾一下WooCommerce中自定义端点的典型创建流程。这个过程涉及添加重写规则、注册查询变量、将端点添加到账户菜单以及为端点添加内容。

Teleport tsh SSH (Identity-First SSH Access, no passwords/static keys)
Teleport tsh SSH (Identity-First SSH Access, no passwords/static keys)

使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。

下载
  1. 注册新的重写端点: 使用 add_rewrite_endpoint() 函数为“我的账户”页面添加一个新的URL端点。
    function ts_custom_add_my_returns_endpoint() {
        add_rewrite_endpoint( 'my_returns', EP_ROOT | EP_PAGES );
    }
    add_action( 'init', 'ts_custom_add_my_returns_endpoint' );
  2. 添加新的查询变量: 注册与端点对应的查询变量,以便WordPress识别。
    function ts_custom_my_returns_query_vars( $vars ) {
        $vars[] = 'my_returns';
        return $vars;
    }
    add_filter( 'woocommerce_get_query_vars', 'ts_custom_my_returns_query_vars', 0 );
  3. 插入到“我的账户”菜单: 将新端点添加到“我的账户”导航菜单中。
    function ts_custom_add_my_returns_link_my_account( $items ) {
        $items['my_returns'] = 'My returns';
        return $items;
    }
    add_filter( 'woocommerce_account_menu_items', 'ts_custom_add_my_returns_link_my_account' );
  4. 为端点添加内容: 使用 woocommerce_account_{endpoint_slug}_endpoint 钩子为自定义端点填充内容。
    function ts_custom_my_returns_content() {
        // 在此处添加端点页面的具体内容,例如显示退货订单列表
        ?>
        <h2 class="text-center woocommerce-products-header__title page-title need-title"><?php echo get_theme_mod('my_returns_tab_heading') ?></h2>
        <section class="order">
            <?php
            $orders = wc_get_orders( array(
                'numberposts' => -1,
                'orderby' => 'date',
                'order' => 'DESC',
                'customer_id' => get_current_user_id(),
                'status' => array('refunded','cancelled'),
            ) );
            foreach( $orders as $order ){
                // ... 订单内容展示逻辑 ...
            }
            ?>
        </section>
        <?php
    }
    add_action( 'woocommerce_account_my_returns_endpoint', 'ts_custom_my_returns_content' );

    注意: 在添加或修改重写规则后,务必访问WordPress后台的“设置” > “固定链接”页面,并点击“保存更改”按钮,以刷新重写规则,否则可能会出现404错误。

解决方案:扩展重定向逻辑以包含自定义端点

要正确地重定向未登录用户对“我的账户”主页面及其所有自定义端点的访问,我们需要更精细的条件判断。关键在于使用逻辑或 (||) 运算符来组合多个页面路径的匹配,同时通过逻辑与 (&&) 运算符确保用户未登录且排除特定页面。

以下是经过优化的重定向代码:

add_action('template_redirect', 'wish_custom_redirect_extended');

function wish_custom_redirect_extended()
{
    global $wp; // 访问全局 $wp 对象,其中包含当前请求的路径

    // 定义需要保护的账户页面端点列表
    // 这里的 'my-account' 是主页,'my_returns' 是一个自定义端点
    // 您可以根据需要添加更多自定义端点,例如 'my_addresses', 'edit-account' 等
    $protected_endpoints = array(
        'my-account',
        'my-account/my_returns', // 示例自定义端点
        // 添加其他需要保护的自定义端点,例如:
        // 'my-account/my_wishlist',
        // 'my-account/orders',
        // 'my-account/edit-account',
        // 'my-account/edit-address',
        // 'my-account/payment-methods',
        // 'my-account/customer-logout', // 通常应允许登出,但如果需要重定向也可以包含
    );

    // 检查当前请求路径是否在受保护的端点列表中
    $is_protected_endpoint = false;
    foreach ($protected_endpoints as $endpoint) {
        // 匹配精确路径或以该路径开头的任何子路径
        // 例如,如果 $wp->request 是 'my-account/orders/view-order/123'
        // 那么 'my-account/orders' 应该匹配
        if (strpos($wp->request, $endpoint) === 0) {
            $is_protected_endpoint = true;
            break;
        }
    }

    // 综合判断是否需要重定向
    if (
        !is_user_logged_in() // 用户未登录
        &&
        $is_protected_endpoint // 且当前页面是受保护的账户页面或其子页面
        &&
        ('lost-password' != $wp->request) // 排除“找回密码”页面
    ) {
        // 使用 wp_safe_redirect() 进行安全重定向到网站首页
        wp_safe_redirect(site_url());
        exit; // 终止脚本执行
    }
}

// 确保用户登出后也重定向到首页,防止返回缓存页面
add_action('wp_logout','auto_redirect_after_logout');
function auto_redirect_after_logout(){
  wp_safe_redirect( home_url() );
  exit();
}

代码解释与最佳实践

  1. $wp->request: 这个全局变量包含了当前请求的干净URL路径(不含域名和查询参数)。它是判断用户访问哪个页面的关键。
  2. !is_user_logged_in(): 这是一个WordPress核心函数,用于检查当前用户是否已登录。
  3. $protected_endpoints 数组和循环:
    • 我们定义了一个数组 $protected_endpoints 来列出所有需要保护的“我的账户”相关路径。这使得代码更易于维护和扩展。
    • 通过循环遍历这个数组,并使用 strpos($wp->request, $endpoint) === 0 来检查当前请求路径是否以任何一个受保护的端点开头。这种方式可以捕获主端点及其所有子端点(例如,my-account 会匹配 my-account、my-account/orders 等)。
  4. ('lost-password' != $wp->request): 这一条件至关重要,它确保“找回密码”页面对未登录用户是可访问的,这是恢复账户的必要功能。
  5. wp_safe_redirect(site_url()):
    • wp_safe_redirect() 是WordPress推荐的重定向函数,它比 wp_redirect() 更安全,因为它会验证重定向URL,防止开放重定向漏洞。
    • site_url() 返回WordPress网站的URL,即重定向的目标地址。
  6. exit;: 在重定向后,务必调用 exit; 来终止脚本的进一步执行,防止在重定向发生后仍然输出其他内容。
  7. wp_logout 钩子: 额外添加的 wp_logout 钩子确保用户在登出后立即被重定向到网站首页,防止他们使用浏览器后退按钮返回到可能包含敏感信息的缓存页面。

实施步骤

  1. 选择放置位置: 将上述优化后的代码片段添加到您的主题的 functions.php 文件中。
    • 推荐做法: 最好将其放置在一个子主题的 functions.php 文件中,这样在更新父主题时不会丢失您的自定义代码。
    • 更专业的做法: 创建一个自定义插件来管理这类功能,这有助于代码的模块化和可移植性。
  2. 测试:
    • 清除网站缓存(如果使用了缓存插件)。
    • 使用不同的浏览器或隐身模式,在未登录状态下尝试直接访问“我的账户”主页 (/my-account/) 和您创建的自定义端点 (/my-account/my_returns/)。
    • 确认这些页面都成功重定向到了网站首页。
    • 测试“找回密码”页面 (/my-account/lost-password/),确保它仍然可以正常访问。
    • 登录后测试,确保已登录用户可以正常访问所有“我的账户”页面和端点。

通过以上步骤和代码,您可以有效地控制WooCommerce中“我的账户”页面及其自定义端点的访问权限,确保只有已登录用户才能查看这些内容,从而提升网站的安全性和用户体验。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5904

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2624

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1672

2025.10.17

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4065

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1670

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

wordpress seo
wordpress seo

WordPress网站SEO优化方法有:1、选择一个SEO友好的主题,具有清晰的代码结构,快速的加载速度和响应式设计;2、使用SEO插件,优化你的标题标签,元描述,关键字,XML站点地图等;3、优化你的内容,内容是SEO优化的核心;4、优化你的网站速度;5、创建友好的URL;6、使用内部链接;7、优化图像;8、使用社交媒体;9、定期更新你的网站;10、监控和分析你的网站等等。

4995

2023.09.18

wordpress下载后怎么安装
wordpress下载后怎么安装

安装前准备:确保服务器满足要求、获取安装文件、创建数据库。上传 wordpress 文件。创建数据库和用户。运行安装程序:选择语言、输入数据库信息、网站标题和管理员信息。安装 wordpress。安装后配置:设置永久链接、安装主题、安装插件、创建内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5139

2024.04.15

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn