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的代码即可。