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

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中自定义端点的典型创建流程。这个过程涉及添加重写规则、注册查询变量、将端点添加到账户菜单以及为端点添加内容。

注册新的重写端点: 使用 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' );

添加新的查询变量: 注册与端点对应的查询变量,以便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 );

插入到“我的账户”菜单: 将新端点添加到“我的账户”导航菜单中。

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' );

为端点添加内容: 使用 woocommerce_account_{endpoint_slug}_endpoint 钩子为自定义端点填充内容。

function ts_custom_my_returns_content() {    // 在此处添加端点页面的具体内容,例如显示退货订单列表    ?>    

-1, 'orderby' => 'date', 'order' => 'DESC', 'customer_id' => get_current_user_id(), 'status' => array('refunded','cancelled'), ) ); foreach( $orders as $order ){ // ... 订单内容展示逻辑 ... } ?>
<?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();}

代码解释与最佳实践

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

实施步骤

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

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

以上就是WooCommerce:安全重定向未登录用户的自定义账户页面端点的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1341359.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在WordPress页脚插入可定制和响应式Shortcode的教程
上一篇 2025年12月13日 04:39:20
PHP会话管理:实现页面重载后按钮状态持久化
下一篇 2025年12月13日 04:39:33

相关推荐

  • MySQL SHOW 语句与预处理参数绑定:深入解析与解决方案

    本文深入探讨了在PHP PDO中尝试使用参数绑定执行SHOW VARIABLES LIKE :var查询时遇到的常见问题。核心原因是MySQL对SHOW类语句的预处理存在限制,导致无法直接绑定参数。文章提供了多种有效的替代方案,包括字符串拼接(需注意安全)以及更推荐的通过WHERE variable…

    2026年9月22日
    400
  • 悟空浏览器如何管理和删除已保存的密码_悟空浏览器密码管理和删除方法

    可通过悟空浏览器的密码管理功能查看、删除或关闭保存的网站密码。1、进入“我的”-“设置”-“隐私与安全”-“密码管理”查看已保存的账号密码,点击条目可查看详情(需验证锁屏或生物识别)。2、在密码管理界面长按某条目,选择“删除”并确认即可移除单个密码。3、点击右上角“更多”按钮,选择“清空所有密码”,…

    2026年9月22日
    700
  • Workerman与PHP协同开发:构建高性能的Web应用程序

    workerman与php协同开发:构建高性能的web应用程序 引言:在今天互联网高速发展的时代,Web应用程序的高性能已成为用户体验和竞争力的重要因素。而PHP作为一种广泛使用的服务器端开发语言,其性能优化一直备受关注。本文将介绍如何利用Workerman与PHP协同开发,从而构建高性能的Web应…

    用户投稿 2026年9月22日
    000
  • 解决PHP扩展缺失错误:phpinfo验证与服务重启指南

    本文旨在解决%ignore_a_1%脚本运行时提示特定扩展(如json、mbstring)缺失的问题,即便用户已在php配置中手动启用。核心解决方案是利用`phpinfo()`函数验证扩展的实际加载状态,并强调在修改php配置后,必须重启相关的web服务器或php-fpm服务,以确保新的配置生效。 …

    2026年9月22日
    100
  • windows怎么恢复已删除的输入法_已卸载输入法恢复技巧

    首先通过语言设置重新添加输入法,进入设置→时间和语言→语言和区域→语言选项→键盘→添加所需输入法;若无效可使用控制面板,在区域和语言中更改键盘设置并添加;还可从其他设备导出注册表中Keyboard Layout与InputMethod相关项导入本机;最后可通过系统还原点恢复删除前的输入法配置。 如果…

    2026年9月22日
    300
  • VSCode安装C/C++文档查看 提升开发效率的VSCode技巧

    答案是利用C/C++扩展和cppreference插件实现高效文档查阅。首先安装微软官方C/C++扩展,启用智能感知与悬停提示;再安装cppreference扩展,通过命令面板直接搜索标准库函数,实现离线在线无缝查阅;结合Doxygen生成项目文档,使用“转到定义”功能快速跳转源码;同时借助Inte…

    2026年9月22日
    000
  • PHP数组中JSON字符串值的解析与访问教程

    本教程将详细指导如何在PHP中处理包含JSON字符串的数组。通过利用json_decode()函数,您可以轻松地将这些JSON字符串转换为可操作的PHP数组,进而提取并访问其中嵌套的shortname、fullname等具体字段,从而实现对复杂数据结构的有效管理和利用。 理解问题:PHP数组中的JS…

    2026年9月22日
    000
  • 悟空浏览器如何彻底清除上网痕迹保护隐私_悟空浏览器清除上网痕迹方法

    清除悟空浏览器上网痕迹需通过隐私设置删除浏览历史、搜索记录、缓存和Cookie,或使用账号与安全功能清除账户关联数据,还可启用无痕浏览模式避免数据留存。 如果您在使用悟空浏览器时希望保护个人隐私,防止他人查看您的浏览活动,则需要彻底清除相关的上网痕迹。这些痕迹包括浏览历史、搜索记录、缓存数据和Coo…

    2026年9月22日
    000
  • 如何配置Android开发环境 Android Studio安装与JDK配置方法

    答案:配置Android开发环境需先安装JDK并设置环境变量,再下载安装Android Studio,配置SDK及虚拟设备,最后创建项目测试。具体步骤包括:1. 安装JDK 17并配置JAVA_HOME和Path;2. 从官网下载Android Studio并安装,自动集成SDK;3. 通过SDK …

    2026年9月22日
    100
  • 递增操作符对PHP类静态属性的影响_PHP静态属性递增行为

    静态属性在PHP中被类的所有实例共享,使用++操作符递增时会修改唯一的内存副本。例如定义计数器属性 $count,每次调用 increment() 方法均使其加1,无论通过哪个对象实例。这种机制适用于统计对象创建次数、追踪全局状态等场景。由于静态属性生命周期贯穿整个请求,递增值持续累积,可能导致内存…

    2026年9月22日
    100
  • ClipStudioPaintPro如何导出AI漫画图片?保存图像的详细指南

    导出AI漫画图片需通过Clip Studio Paint Pro的“文件”菜单选择“导出”,根据用途选单页、多页或Webtoon导出,推荐PNG用于高质量或透明背景需求,JPG用于网络分享以平衡文件大小与画质,设置300dpi以上分辨率确保清晰度,色彩配置选用sRGB保障跨平台一致性,批量导出时利用…

    2026年9月22日
    100
  • 谷歌浏览器官网直接进入 Chrome浏览器官方登录入口

    谷歌浏览器官网直接进入方式为访问https://www.google.com/chrome/,该网站是Chrome官方登录入口,提供跨平台同步、V8引擎加速、地址栏集成搜索、自动填充表单等核心功能,支持极简界面、深色模式、自定义新标签页及侧边栏服务,具备安全浏览、隐私沙盒、密码检查和无痕模式等安全机…

    2026年9月22日
    100
  • 在月球上用肉眼能清晰地看到长城吗?蚂蚁庄园今日答案最新10.24

    或许有的用户还不知道在月球上用肉眼能清晰地看到长城吗?蚂蚁庄园今日答案最新10.24,下面让php的小编为你解答这个问题,快来看看吧! 立即进入“各种好用的网站推荐☜☜☜☜☜点击进入”; 蚂蚁庄园非常好玩,养鸡的同时还能做慈善,增进知识的同时还可以免费领取小鸡饲料。 蚂蚁庄园课堂今天的问题是: 在月…

    2026年9月22日
    900
  • Laravel 8 注册成功但登录失败的解决方案

    本文针对 Laravel 8 中使用 php artisan ui:auth 生成的认证系统,注册功能正常但登录功能失效的问题,提供了一种解决方案。通过重写 LoginController 中的 username() 方法,将认证字段从默认的 email 修改为 username,从而解决登录失败的…

    2026年9月22日
    000
  • rm -rf 误删文件?别急,或许有救!

    rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!rm -rf 误删文件?别急,或许有救!

    立即采取行动! 在生产环境中,我们应尽量避免进行风险操作。但如果不慎犯错,如何挽救呢?让我分享一个故事:上周我为了打包一个应用,需要整理Ubuntu 16.04上的线上数据,不小心删除了一个数据文件,幸而最终有惊无险,现记录如下。 extundelete 我的恢复计划主要依赖于一个工具——extun…

    2026年9月22日 • 用户投稿
    000
  • 一杯热水在变凉的过程中温度是匀速下降的吗?蚂蚁庄园课堂今天答案最新10月24日

    肯定有许多的童鞋想明白一杯热水在变凉的过程中温度是匀速下降的吗?蚂蚁庄园课堂今天答案最新10月24日,下面由php的小编为你带来答案哦,跟小编一起来看看哦。 立即进入“各种好用的网站推荐☜☜☜☜☜点击进入”; 蚂蚁庄园非常好玩,养鸡的同时还能做慈善,增进知识的同时还可以免费领取小鸡饲料。 蚂蚁庄园课…

    2026年9月22日
    2300
  • UC浏览器占用内存太高怎么办_UC浏览器内存占用高优化方案

    UC浏览器内存占用过高可通过清理缓存、关闭多余标签页、禁用插件和开启省电模式解决。首先清除浏览数据释放资源,其次减少同时开启的标签页数量以降低内存压力,接着管理扩展程序避免后台消耗,最后启用性能优化功能减少资源使用,提升整体运行效率。 如果您在使用UC浏览器时发现设备运行缓慢或应用响应迟缓,这很可能…

    2026年9月22日
    100
  • MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑

    MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑MySQL复杂查询语句写作技巧_Sublime环境中编写多表关联逻辑

    提升mysql多表查询性能与可读性的方法包括:1. 优化索引,确保join和where字段有合适索引,理解复合索引左前缀原则;2. 使用cte分解逻辑,使结构清晰易维护;3. 利用sublime text插件如sqltools、sublimelinter提升编写效率;4. 拆解复杂逻辑,逐步构建查询…

    2026年9月22日 • 用户投稿
    100
  • iPhone如何打开url

    轻触链接即刻访问 当您在信息、邮件或其它应用程序中遇到一个网址链接时,只需轻轻点击该链接,iPhone便会自动启动Safari浏览器并加载对应的网页内容。这是最为普遍且高效的访问方式。 借助快捷指令快速进入 若您频繁访问某个特定网址,可使用“快捷指令”功能实现一键直达。先从App Store下载“快…

    2026年9月22日
    100
  • unix怎么安装php_unix系统安装php环境指南

    首先确认系统环境并检查是否已安装相关软件,然后选择包管理器或源码编译方式安装PHP;推荐使用包管理器快速安装,如Debian/Ubuntu用apt,CentOS/RHEL/Fedora用yum或dnf,FreeBSD用pkg;安装后配置Web服务器,Apache需加载mod_php或集成PHP-FP…

    2026年9月22日
    300

发表回复

登录后才能评论
关注微信