在开始修改核心代码之前,我们需要一个独立的数据表来存储关键词、对应的链接地址以及替换优先级。这样可以避免直接修改系统原有关键词表导致搜索功能异常。请直接在PHPCMS对应的数据库中执行以下SQL语句。
操作步骤:登录你的数据库管理工具(如phpMyAdmin),选择PHPCMS使用的数据库,点击“SQL”标签页,粘贴并执行以下代码:
```sql CREATE TABLE IF NOT EXISTS `v9_inner_link` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `keyword` char(40) NOT NULL DEFAULT '', `url` char(100) NOT NULL DEFAULT '', `priority` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `keyword` (`keyword`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='站点内链自动替换表'; ```字段说明:
keyword:用于匹配文章内容的关键词,例如“PHPCMS”。
url:关键词跳转的目标地址,例如“/phpcms/”或完整的外链。
priority:优先级,数字越大越优先替换(可选,用于处理关键词包含关系)。
执行成功后,建议插入几条测试数据以备后续验证:
```sql INSERT INTO `v9_inner_link` (`keyword`, `url`, `priority`) VALUES ('PHPCMS', 'http://www.phpcms.cn', 1), ('内链', 'http://www.example.com/neilian', 0); ```PHPCMS的内容页数据是通过content_tag类进行标签调用的。为了实现自动替换,我们需要修改该类文件,在内容输出前拦截并进行正则替换。
文件路径:phpcms/modules/content/classes/content_tag.class.php
修改位置:找到content方法,该方法负责处理{content ...}标签。我们需要在该方法返回数据之前,也就是在return $data;语句之前,插入我们的内链处理逻辑。
打开文件后,定位到大约第70-90行(视版本略有不同),找到public function content($data, $is_intr=0)方法。在方法末尾的return $data;上方加入以下完整代码块:
为了防止关键词替换破坏原有的HTML结构(例如将图片Alt属性中的文字替换成了链接,或者在已有的链接内部又套了一层链接),我们需要在content_tag.class.php类中增加一个私有处理方法。

操作位置:在同一个文件content_tag.class.php的底部,类的最后一个花括号}之前,插入以下方法代码:
代码原理解析:这段代码首先利用正则提取出文章中所有的标签,将其替换为临时的占位符(如LINK_0)。这样在对关键词进行替换时,就不会匹配到链接内部的文字。替换完成后,再将占位符还原为原始的链接。这完美解决了“嵌套链接”和“重复替换”的技术难题。
由于我们在第二步中调用了load_model('inner_link_model'),但PHPCMS默认没有这个模型,直接调用会报错。我们需要创建一个对应的模型文件。
文件路径:phpcms/model/inner_link_model.class.php
如果该目录下没有这个文件,请新建一个,并写入以下代码:
```php db_config = pc_base::load_config('database'); $this->db_setting = 'default'; $this->table_name = 'inner_link'; parent::__construct(); } } ?> ```这个文件非常简单,仅继承了系统的model基类,并指定表名为inner_link。这是PHPCMS MVC设计模式中操作数据库的标准写法。
代码修改完成后,必须更新系统缓存和模板缓存,修改才能生效。
操作步骤:
访问该文章的前台页面,检查关键词是否已经自动变成了带有链接的标签。如果链接出现,且原有的链接没有被破坏,说明配置成功。
如果在操作过程中遇到问题,请按以下顺序排查:
content_tag.class.php中的括号是否闭合。确保inner_link_model.class.php文件存在于指定路径。v9_inner_link表中是否有数据,且keyword字段在文章内容中确实存在。检查代码中if($i > 5) break;是否限制了替换次数。inner_link_replace方法,而不是简单的str_replace。易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图