PbootCMS自带文章内链功能,设置内链后,不需要在文章中为关键词添加链接,根据设置的关键词以及外链,全自动添加链接。处于SEO的目的,需要为关键词链接添加链接描述,因此需要对系统文件进行二开,此次需要改动的文件主要有四个,分别为:ParserController.php、ParserModel.php、TagsController.php和tags.html。如果需要链接描述与关键词显示不同的内容,则还需要对数据库中的ay_tags添加相关字段,我会在文章中集中说明。
实现目标:后台新增文章内链,包括关键词+关键词链接+链接描述,更新文章后自动为文章中添加的关键词添加相应链接和链接描述。
首先,需要先对数据库进行添加字段的操作,相对应的表为ay_tags,在表中新增description字段,方法不在阐述,添加后的效果如图。
修改TagsController.php,在代码中添加description的相关代码,由于代码添加位置较多,直接上该文件代码,不同的PbootCMS版本或许略有不同,可参照进行添加。
<?php /** * @copyright (C)2016-2099 Hnaoyun Inc. * @author XingMeng * @email hnxsh@foxmail.com * @date 2019年07月12日 * 内链链接控制器 */ namespace appdmincontrollercontent; use coreasicController; use appdminmodelcontentTagsModel; class TagsController extends Controller { private $model; public function __construct() { $this->model = new TagsModel(); } // 文章内链列表 public function index() { if ((! ! $id = get('id', 'int')) && $result = $this->model->getTags($id)) { $this->assign('more', true); $this->assign('tags', $result); } else { $this->assign('list', true); if (! ! ($field = get('field', 'var')) && ! ! ($keyword = get('keyword', 'vars'))) { $result = $this->model->findTags($field, $keyword); } else { $result = $this->model->getList(); } $this->assign('tags', $result); } $this->display('content/tags.html'); } // 文章内链增加 public function add() { if ($_POST) { // 获取数据 $name = post('name'); $link = post('link'); $description = post('description'); if (! $name) { alert_back('名称不能为空!'); } if (! $link) { alert_back('链接不能为空!'); } if (! $description) { alert_back('描述不能为空!'); } // 构建数据 $data = array( 'acode' => session('acode'), 'name' => $name, 'link' => $link, 'description' => $description, 'create_user' => session('username'), 'update_user' => session('username') ); // 执行添加 if ($this->model->addTags($data)) { $this->log('新增文章内链成功!'); if (! ! $backurl = get('backurl')) { success('新增成功!', base64_decode($backurl)); } else { success('新增成功!', url('/admin/Tags/index')); } } else { $this->log('新增文章内链失败!'); error('新增失败!', - 1); } } } // 文章内链删除 public function del() { if (! $id = get('id', 'int')) { error('传递的参数值错误!', - 1); } if ($this->model->delTags($id)) { $this->log('删除文章内链' . $id . '成功!'); success('删除成功!', - 1); } else { $this->log('删除文章内链' . $id . '失败!'); error('删除失败!', - 1); } } // 文章内链修改 public function mod() { if (! $id = get('id', 'int')) { error('传递的参数值错误!', - 1); } // 单独修改状态 if (($field = get('field', 'var')) && ! is_null($value = get('value', 'var'))) { if ($this->model->modTags($id, "$field='$value',update_user='" . session('username') . "'")) { location(- 1); } else { alert_back('修改失败!'); } } // 修改操作 if ($_POST) { // 获取数据 $name = post('name'); $link = post('link'); $description = post('description'); if (! $name) { alert_back('名称不能为空!'); } if (! $link) { alert_back('链接不能为空!'); } if (! $description) { alert_back('描述不能为空!'); } // 构建数据 $data = array( 'name' => $name, 'link' => $link, 'description' => $description, 'update_user' => session('username') ); // 执行添加 if ($this->model->modTags($id, $data)) { $this->log('修改文章内链' . $id . '成功!'); if (! ! $backurl = get('backurl')) { success('修改成功!', base64_decode($backurl)); } else { success('修改成功!', url('/admin/Tags/index')); } } else { location(- 1); } } else { // 调取修改内容 $this->assign('mod', true); if (! $result = $this->model->getTags($id)) { error('编辑的内容已经不存在!', - 1); } $this->assign('tags', $result); $this->display('content/tags.html'); } } }
与此同时,对应的后台HTML文件也需要进行添加相对应的项目,代码如下
{include file='common/head.html'} <div class="layui-body"> {if([$list])} <div class="layui-tab layui-tab-brief" lay-filter="tab"> <ul class="layui-tab-title"> <li class="layui-this" lay-id="t1">文章内链列表</li> <li lay-id="t2">文章内链新增</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <table class="layui-table"> <thead> <tr> <th>序号</th> <th>名称</th> <th>链接</th> <th>描述</th> <th>操作</th> </tr> </thead> <tbody> {foreach $tags(key,value)} <tr> <td>[num]</td> <td>[value->name]</td> <td>[value->link]</td> <td>[value->description]</td> <td> {fun=get_btn_del($value->id)} {fun=get_btn_mod($value->id)} </td> </tr> {/foreach} </tbody> </table> <div class="page">{$pagebar}</div> </div> <div class="layui-tab-item"> <form action="{url./admin/Tags/add}" method="post" class="layui-form"> <input type="hidden" name="formcheck" value="{$formcheck}" > <div class="layui-form-item"> <label class="layui-form-label">名称</label> <div class="layui-input-block"> <input type="text" name="name" required lay-verify="required" placeholder="请输入名称" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">链接</label> <div class="layui-input-block"> <input type="text" name="link" required lay-verify="required" placeholder="请输入链接" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">描述</label> <div class="layui-input-block"> <input type="text" name="description" required lay-verify="required" placeholder="请输入描述" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit>立即提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> </div> </div> </div> {/if} {if([$mod])} <div class="layui-tab layui-tab-brief" lay-filter="tab"> <ul class="layui-tab-title"> <li class="layui-this">文章内链修改</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <form action="{url./admin/Tags/mod/id/'.[$get.id].'}{$backurl}" method="post" class="layui-form"> <input type="hidden" name="formcheck" value="{$formcheck}" > <div class="layui-form-item"> <label class="layui-form-label">名称</label> <div class="layui-input-block"> <input type="text" name="name" required lay-verify="required" value="{$tags->name}" placeholder="请输入名称" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">链接</label> <div class="layui-input-block"> <input type="text" name="link" required lay-verify="required" value="{$tags->link}" placeholder="请输入链接" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">描述</label> <div class="layui-input-block"> <input type="text" name="description" required lay-verify="required" value="{$tags->description}" placeholder="请输入描述" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit>立即提交</button> <button type="reset" class="layui-btn layui-btn-primary">重置</button> {fun=get_btn_back()} </div> </div> </form> </div> </div> </div> {/if} </div> {include file='common/foot.html'}
之后,会发现可以通过后台的文章内链功能添加关键词描述了,并可以修改和删除,但浏览前台文章内容页面,会发现并没有变化,这是因为ParserController.php这个文件没有添加相对应的内容的原因,首先打开此文件,搜索 // 执行内链替换 将
// 执行内链替换 foreach ($tags as $value) { $data->content = preg_replace('/' . $value->name . '/', '<a href="' . $value->link . '">' . $value->name . '</a>', $data->content, $this->config('content_tags_replace_num') ?: 3); }
替换为
// 执行内链替换 foreach ($tags as $value) { $data->content = preg_replace('/' . $value->name . '/', '<a href="' . $value->link . '" title="' . $value->description . '" target="_blank">' . $value->name . '</a>', $data->content, $this->config('content_tags_replace_num') ?: 3); }
此时,浏览内容页面,会发现title=""没有任何内容,这是因为ParserModel.php没有解析description字段的原因,打开此文件,找到 // 文章内链 将
// 文章内链 public function getTags() { return parent::table('ay_tags')->field('name,link') ->where("acode='" . get_lg() . "'") ->order('length(name) desc') ->select(); }
替换为
// 文章内链 public function getTags() { return parent::table('ay_tags')->field('name,link,description') ->where("acode='" . get_lg() . "'") ->order('length(name) desc') ->select(); }
从新浏览前台文章内容页面发现一切正常,至此实现文章关键词自动添加链接和描述的目的。如果不需要描述和关键词显示不同的内容,只需要更改ParserController.php的代码即可。