首先找到后台模板发布文件:后台/temp/article_add.htm,找到提交按钮添加监听ID:<button class="layui-btn" id="btnSubmit">提交保存</button>
添加JS代码:
<script>
// 全局变量,用于记录是否点击过加内链按钮
var hasClickedLink = false;
// 表单提交验证
$(document).ready(function() {
$('#btnSubmit').click(function(event) {
var title = $('#title').val();
var typeid = $('#typeid').val();
if (title === "" || typeid === "") {
$("#yuanwentititletext").html("标题和栏目ID都不能为空!");
event.preventDefault(); // 阻止表单提交
return false;
}
else if (!hasClickedLink) {
$("#yuanwentititletext").html("添加文章内链!");
event.preventDefault(); // 阻止表单提交
return false;
}
});
// 可选:为了防止用户直接按回车提交表单,也可以给表单本身添加提交事件处理器
// $('#articleForm').submit(function(event) {
// var title = $('#title').val();
// var typeid = $('#typeid').val();
//
// if (title === "" || typeid === "") {
// alert("标题和栏目ID都不能为空!");
// event.preventDefault(); // 阻止表单提交
// }
// });
// 但是,由于我们已经给提交按钮添加了点击事件处理器,并且在该处理器中调用了event.preventDefault(),
// 所以通常不需要给表单本身再添加提交事件处理器。上面的代码是可选的,仅作为示例。
});
//#yuanwentititletext替换成自己的alert或者其他提示
自己找一个位置加添内链按钮事件:
<div style='float:left;padding-right:10px'>
<input type="button" class="layui-btn layui-btn-primary" onClick="lianjie();" value="加内链">
</div>
lianjie()JS代码:
//文章加链接
function lianjie(){
$("#yuanwentititletext").html('查找相关文章中...');
hasClickedLink = true; // 标记为已点击
//整篇文字加内链
var lianjietext = editor1.html();
$.post('article_add_lianjie.php', {info: lianjietext}, function(result){
try {
var response = JSON.parse(result);
if(response.code == 200) {
// 成功替换
editor1.html(response.data.processed_content);
$("#yuanwentititletext").html('成功替换关键词: ' + response.data.matched_keyword);
} else {
// 显示错误信息,但保留原内容
$("#yuanwentititletext").html('错误: ' + response.code+'_'+response.message);
// 如果需要,也可以在这里显示原内容
// editor1.html(response.data);
}
} catch(e) {
// 如果返回的不是JSON,可能是旧格式,直接设置内容
editor1.html(result);
$("#yuanwentititletext").html('处理完成');
}
}).fail(function() {
$("#yuanwentititletext").html('请求失败,请检查网络连接');
});
}
article_add_lianjie.php代码:
<?php
//通过关键词获取后台随机文章
include_once('../inc/common.inc.php'); //连接数据库
// 设置返回数据的统一格式
function returnResult($code, $message, $data = null) {
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
echo json_encode($result);
exit;
}
if($_POST['info']){
$info = $_POST['info'];
// 检查内容是否为空
if(empty($info)) {
returnResult(400, '输入内容不能为空');
}
// 1. 删除<img>标签及其所有属性(包括alt和title)
$q = preg_replace('/<img[^>]*>/i', '', $info);
// 2. 读取远程 keywords.txt 文件
$keywords_url = 'https://aaaa.cn/keywords.txt';
//远程关键词文件链接,内容关键词格式:关键词1,关键词2,关键词3,关键词4.。。
// 初始化 cURL
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $keywords_url,
CURLOPT_RETURNTRANSFER => true, // 将返回的数据作为字符串而不是直接输出
CURLOPT_FOLLOWLOCATION => true, // 跟随重定向
CURLOPT_SSL_VERIFYPEER => false, // 跳过 SSL 证书验证(生产环境建议设为 true 并配置证书路径)
CURLOPT_TIMEOUT => 10, // 设置超时时间(秒)
CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; PHP Script)' // 模拟浏览器用户代理,避免被某些服务器拒绝
]);
$keywords_content = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);
curl_close($ch);
// 检查 cURL 请求是否成功且返回 HTTP 200 状态码
if ($keywords_content === false || $http_code != 200) {
$error_msg = $curl_error ?: "HTTP 状态码: {$http_code}";
returnResult(404, '无法获取远程关键词文件或文件不存在。错误信息: ' . $error_msg, $info);
}
// 检查关键词文件内容是否为空
if(empty($keywords_content)) {
returnResult(405, '关键词文件内容为空', $info);
}
// 将关键词字符串分割成数组
$keywords = explode(',', $keywords_content);
// 3. 检查清理后的$q中是否包含任意关键词(排除图片标签内的关键词)
$matched_keyword = '';
$aid = null;
foreach ($keywords as $keyword) {
$keyword = trim($keyword); // 去除空格
if (!empty($keyword) && strpos($q, $keyword) !== false) {
// 计算1年前的时间戳
$five_years_ago = strtotime('-12 months');
// 查询1年内的随机记录
$row = $dsql->GetOne("Select id From dede_archives where title like '%".$keyword."%' AND pubdate >= $five_years_ago ORDER BY rand() LIMIT 1");
// 如果找到对应的ID,记录并跳出循环
if ($row && isset($row['id'])) {
$matched_keyword = $keyword;
$aid = $row['id'];
break; // 找到第一个匹配的关键词且有文章,停止循环
}
// 如果没有找到文章,继续下一个关键词
}
}
// 4. 如果没有匹配到任何关键词或有文章的关键词,返回状态信息
if (empty($matched_keyword)) {
returnResult(406, '未匹配到关键词或匹配的关键词没有相关文章', $info);
}
// 5. 获取文章详细信息
global $dsql;
include_once(DEDEINC."/channelunit.func.php");
$aid = trim(preg_replace('/[^0-9]/','',$aid));
$chRow = $dsql->GetOne("Select arc.*,ch.maintable,ch.addtable,ch.issystem From dede_arctiny arc left join dede_channeltype ch on ch.id=arc.channel where arc.id='$aid' ");
if(!is_array($chRow)) {
returnResult(408, '获取文章频道信息失败', $info);
}
if(empty($chRow['maintable'])) {
$chRow['maintable'] = 'dede_archives';
}
if($chRow['issystem'] != -1) {
$nquery = " Select arc.*,tp.typedir,tp.topid,tp.namerule,tp.moresite,tp.siteurl,tp.sitepath
From `{$chRow['maintable']}` arc left join `dede_arctype` tp on tp.id=arc.typeid
where arc.id='$aid' ";
} else {
$nquery = " Select arc.*,1 as ismake,0 as money,'' as filename,tp.typedir,tp.topid,tp.namerule,tp.moresite,tp.siteurl,tp.sitepath
From `{$chRow['addtable']}` arc left join `dede_arctype` tp on tp.id=arc.typeid
where arc.aid='$aid' ";
}
$arcRow = $dsql->GetOne($nquery);
// 检查是否获取到文章详情
if(!is_array($arcRow)) {
returnResult(409, '获取文章详情失败', $info);
}
// 获取文章标题
$title = $arcRow['title'];
$wjwblogquery = " Select value From `dede_sysconfig` where varname = 'cfg_multi_site'";
$wjwarcRow = $dsql->GetOne($wjwblogquery);
if($wjwarcRow['value'] == 'Y'){
$Url = GetFileUrl($aid,$arcRow['typeid'],$arcRow['senddate'],$title,$arcRow['ismake'],$arcRow['arcrank'],$arcRow['namerule'],$arcRow['typedir'],$arcRow['money'],$arcRow['filename'],$arcRow['moresite'],$arcRow['siteurl'],$arcRow['sitepath']);
} else {
$wjwblogqueryurl = " Select value From `dede_sysconfig` where varname = 'cfg_basehost'";
$wjwarcRowurl = $dsql->GetOne($wjwblogqueryurl);
$Url = $wjwarcRowurl['value'].GetFileUrl($aid,$arcRow['typeid'],$arcRow['senddate'],$title,$arcRow['ismake'],$arcRow['arcrank'],$arcRow['namerule'],$arcRow['typedir'],$arcRow['money'],$arcRow['filename'],$arcRow['moresite'],$arcRow['siteurl'],$arcRow['sitepath']);
}
// 检查URL是否生成成功
if(empty($Url)) {
returnResult(410, '生成文章链接失败', $info);
}
// 6. 创建链接HTML
$link_html = "<a href='".$Url."' target='_blank' title='".$title."' alt='".$title."'>".$matched_keyword."</a>";
// 7. 替换原始内容中的关键词为链接(只替换纯文本中的关键词,不替换标签内的)
// 使用简单但有效的方法:先分割HTML,然后只在文本节点中替换
$parts = preg_split('/(<[^>]*>)/', $info, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$replaced = false;
foreach ($parts as &$part) {
// 如果不是HTML标签,且包含关键词,且尚未替换过
if (!preg_match('/^<[^>]*>$/', $part) && strpos($part, $matched_keyword) !== false && !$replaced) {
$part = str_replace($matched_keyword, $link_html, $part);
$replaced = true;
}
}
$result = implode('', $parts);
// 检查是否成功替换
if (!$replaced) {
returnResult(411, '关键词替换失败', $info);
}
// 成功返回
returnResult(200, '成功添加内链,关键词:', array(
'matched_keyword' => $matched_keyword,
'article_title' => $title,
'article_url' => $Url,
'processed_content' => $result
));
} else {
returnResult(400, '未接收到内容参数');
}