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

WordPress自定义文章类型URL中分类法占位符未被替换的解决方案

阿明姑娘_4996

阿明姑娘_4996

发布时间:2026-02-13 15:41:01

|

327人浏览过

|

来源于php中文网

原创

WordPress自定义文章类型URL中分类法占位符未被替换的解决方案

本文详解如何修复acf post object字段在timber/twig模板中输出时,自定义文章类型(如photos)的%locations% url占位符未被正确解析为实际分类法slug的问题,核心在于post_type_link过滤器中错误使用get_the_id()导致foreach警告及重写失败。

在WordPress中为自定义文章类型(CPT)配置带分类法层级的永久链接(如 photos/%locations%/post-slug)是一项常见需求,但当该CPT被ACF的Post Object字段引用,并在Timber/Twig等模板引擎中通过{{ story.meta('associated_photo_gallery').link }}输出链接时,常出现URL中%locations%未被实际分类法slug(如world/india)替换的问题——最终生成类似 https://www.php.cn/link/74fde144c79640df7e7ccc94ce993504 的无效链接。

根本原因在于 post_type_link 过滤器的回调函数中,调用了全局上下文函数 get_the_ID(),而该函数依赖当前主循环(The Loop)的全局$post对象。当ACF Post Object字段从非主循环上下文(例如侧边栏、自定义查询、Timber上下文或REST API响应)获取文章并生成链接时,get_the_ID() 返回0或null,导致 get_the_terms( get_the_ID(), 'locations' ) 返回false或空值,进而触发PHP警告 Invalid argument supplied foreach(),并使str_replace()无法执行,最终保留原始占位符。

✅ 正确做法是:始终使用过滤器传入的 $post 参数中的 $post->ID,它明确指向当前正在处理的文章对象,与上下文无关,确保get_the_terms()能准确获取对应文章的分类法项。

Chinese Sensitive Words
Chinese Sensitive Words

中文敏感词/违禁词检测与内容合规性检查工具。支持对小红书(Xiaohongshu)、Douyin(抖音)、WeChat(微信)、Weibo(微博)、Bilibili(哔哩哔哩)、Zhihu(知乎)、Taobao(淘宝)、JD.com(京东)等主流平台的禁用词、限用词及高风险词进行文本扫描与合规性分析。

下载

以下是修正后的完整、健壮的 post_type_link 实现:

add_filter( 'post_type_link', 'textdomain_post_type_link', 10, 2 );
function textdomain_post_type_link( $post_link, $post ) {
    // 仅处理 photos 文章类型
    if ( 'photos' !== $post->post_type ) {
        return $post_link;
    }

    $taxonomy = 'locations';

    // ✅ 关键修正:使用 $post->ID 而非 get_the_ID()
    $terms = get_the_terms( $post->ID, $taxonomy );

    // ✅ 增强容错:检查 $terms 是否为数组且非空
    if ( ! is_array( $terms ) || empty( $terms ) || is_wp_error( $terms ) ) {
        // 若无分类法项,可选择返回默认基础链接,或保留占位符(需配合其他逻辑)
        return str_replace( '%' . $taxonomy . '%', 'uncategorized', $post_link );
    }

    $slug = [];
    foreach ( $terms as $term ) {
        // 确保 $term 是有效对象
        if ( ! is_object( $term ) || ! isset( $term->name ) || ! isset( $term->parent ) ) {
            continue;
        }

        $term_slug = sanitize_title_with_dashes( $term->name );
        if ( 0 === (int) $term->parent ) {
            array_unshift( $slug, $term_slug ); // 顶级分类放最前
        } else {
            array_push( $slug, $term_slug );     // 子级分类追加
        }
    }

    // ✅ 替换占位符
    if ( ! empty( $slug ) ) {
        $post_link = str_replace( '%' . $taxonomy . '%', join( '/', $slug ), $post_link );
    } else {
        // 降级处理:若无有效slug,移除占位符或设为默认值
        $post_link = str_replace( '%' . $taxonomy . '%', '', $post_link );
        $post_link = str_replace( '//', '/', $post_link ); // 清理多余斜杠
    }

    return $post_link;
}

? 重要注意事项与最佳实践:

  • 刷新重写规则:修改后务必进入WordPress后台 → 设置 → 固定链接 → 点击“保存更改”(无需手动调用 flush_rewrite_rules(),生产环境应避免此函数);
  • ACF字段值验证:确保Post Object字段确实关联了已分配locations分类法的photos文章,否则get_the_terms()仍会返回空;
  • 层级顺序逻辑:当前代码按“顶级分类优先、子分类后置”构建路径(如 world/india),符合典型地理层级;若需反向(如 india/world),请调整array_unshift/array_push逻辑;
  • 性能考虑:get_the_terms() 在循环中调用属常规操作,但若页面存在大量photos链接,建议结合对象缓存(如wp_cache_get/set)优化;
  • Timber兼容性:Timber本身不干预URL生成逻辑,它仅渲染ACF返回的.link属性;因此本修复完全适配Timber/Twig工作流。

完成上述修正后,ACF Post Object字段在任何上下文中(包括story.meta('associated_photo_gallery').link)输出的链接将正确解析为形如 https://example.com/photos/world/india/taj-mahal-and-the-ganges/ 的完整URL,彻底解决占位符残留问题。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

蛙蛙写作

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

DeepSeek

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

豆包大模型

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

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

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

738

2025.12.04

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3303

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

854

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

6386

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

5390

2024.08.16

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

461

2026.05.08

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何在 Windows 11 上安装 XAMPP
如何在 Windows 11 上安装 XAMPP

共1课时 | 208人学习

第二十三期_前端开发
第二十三期_前端开发

共98课时 | 11.7万人学习

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

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