织梦后台文章自动加关键词内链

2026-01-07 11:55

admin
60
来源:未知

首先找到后台模板发布文件:后台/ temp/ article_add.htm,找到提交按钮添加监听ID: button class="layui-btn" id="btnSubmit"提交保存/button 添加JS代码: script // 全局变量,用于记录是否点击过加内链

首先找到后台模板发布文件:后台/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, '未接收到内容参数');
}

下一篇

下一篇:没有了