article_save.php 里只放这一段(放最后)

// ======================
// 百度推送 只推一次 自动触发
/// 百度推送自动触发
if (isset($blogid) && intval($blogid) > 0) {
$push_url = EMLOG_ROOT . '/content/plugins/baidu_push/baidu_push_trigger.php';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $push_url,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => ['baidu_push_blogid' => $blogid],
CURLOPT_TIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => false,
]);
curl_exec($ch);
curl_close($ch);
}
**/content/plugins/baidu_push/
├── baidu_push.php # 主文件(核心逻辑)
├── baidu_push_callback.php # 回调文件(初始化/清理数据)
├── baidu_push_setting.php # 后台设置页(接口配置/记录管理)
### └── baidu_push_trigger.php # 自动推送触发文件**
### baidu_push.php # 主文件(核心逻辑)
<?php
/*
Plugin Name: 百度普通收录自动推送
Version: 1.0
Plugin URL: https://www.ls4.cn
Description: 发布/修改文章自动推送(精准对接save_log挂载点)
Author: ls4.cn
Author URL: https://www.ls4.cn
*/
!defined('EMLOG_ROOT') && exit('access denied!');
// === 1. 配置读取(和设置页匹配) ===
function baidu_push_get_config() {
$storage = Storage::getInstance('baidu_push');
return $storage->getValue('config', 'array') ?: ['site' => '', 'token' => ''];
}
// === 2. 核心推送函数(接收挂载点参数) ===
function baidu_push_do_push($blogid, $is_publish = true) {
// 仅推送已发布的文章(根据挂载点的 $pubPost 参数判断)
if (!$is_publish) return;
if (empty($blogid)) return;
// 获取配置
$config = baidu_push_get_config();
if (empty($config['site']) || empty($config['token'])) {
$status = 'fail';
$msg = '未配置百度推送接口(site/token为空)';
$url = '';
} else {
// 获取文章链接(EMLOG内置函数,兼容所有版本)
$url = Url::log($blogid);
if (empty($url)) {
$status = 'fail';
$msg = '文章链接获取失败(ID:'.$blogid.')';
} else {
// 构造百度推送接口
$api = "http://data.zz.baidu.com/urls?site={$config['site']}&token={$config['token']}";
// 执行curl请求
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $url, // 单条链接推送
CURLOPT_HTTPHEADER => ['Content-Type: text/plain'],
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false, // 忽略SSL验证
]);
$result = curl_exec($ch);
$curl_errno = curl_errno($ch);
curl_close($ch);
// 解析推送结果
if ($curl_errno > 0) {
$status = 'fail';
$msg = "CURL错误:{$curl_errno} - " . curl_strerror($curl_errno);
} else {
$res = json_decode($result, true);
if (json_last_error() !== JSON_ERROR_NONE) {
$status = 'fail';
$msg = "接口返回非JSON:{$result}";
} else {
if (isset($res['success']) && $res['success'] > 0) {
$status = 'success';
$msg = "推送成功 | 剩余配额:{$res['remain']}";
} else {
$status = 'fail';
$msg = "推送失败 | " . json_encode($res);
}
}
}
}
}
// 强制写入记录(无论成功/失败,必写)
baidu_push_save_log($blogid, $url, $status, $msg);
}
// === 3. 保存推送日志(自动建表) ===
function baidu_push_save_log($blogid, $url, $status, $msg) {
$db = MySql::getInstance();
$table = DB_PREFIX . 'baidu_push_log';
// 自动创建日志表(兜底)
$check_table = $db->once_fetch_array("SHOW TABLES LIKE '{$table}'");
if (empty($check_table)) {
$sql = "CREATE TABLE `{$table}` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`blogid` int(11) unsigned NOT NULL,
`url` varchar(255) NOT NULL,
`status` varchar(20) NOT NULL,
`msg` text NOT NULL,
`create_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;";
$db->query($sql);
}
// 写入记录
$sql = "INSERT INTO `{$table}` (blogid, url, status, msg, create_time)
VALUES (
" . intval($blogid) . ",
'" . addslashes($url ?? '') . "',
'" . addslashes($status) . "',
'" . addslashes($msg) . "',
" . time() . "
)";
$db->query($sql);
}
// === 4. 精准对接 save_log 挂载点(核心!) ===
addAction('save_log', 'baidu_push_auto_trigger');
function baidu_push_auto_trigger($blogid, $pubPost, $logData) {
// $pubPost = 是否直接发布(true/false),仅推送已发布的文章
if ($pubPost) {
baidu_push_do_push($blogid, true);
}
}
// === 5. 备用自动推送(log_list钩子,双重保障) ===
addAction('log_list', 'baidu_push_backup_trigger');
function baidu_push_backup_trigger() {
global $logs;
if (empty($logs)) return;
$db = MySql::getInstance();
$table = DB_PREFIX . 'baidu_push_log';
foreach ($logs as $log) {
$blogid = intval($log['gid']);
$has_log = $db->once_fetch_array("SELECT id FROM `{$table}` WHERE blogid = {$blogid} LIMIT 1");
if (!$has_log) {
// 仅推送已发布的文章(hide=0 兼容旧版本)
$is_publish = $db->once_fetch_array("SELECT hide FROM " . DB_PREFIX . "blog WHERE gid = {$blogid}");
if ($is_publish['hide'] == 0) {
baidu_push_do_push($blogid, true);
}
}
}
}
// === 6. 手动重推/清理/保存配置/获取标题(和设置页匹配) ===
function baidu_push_repush($blogid) {
$db = MySql::getInstance();
$db->query("DELETE FROM " . DB_PREFIX . "baidu_push_log WHERE blogid=".intval($blogid));
baidu_push_do_push($blogid, true);
return ['code' => 1, 'msg' => '重推触发成功,查看记录'];
}
function baidu_push_clear_log($blogid) {
$db = MySql::getInstance();
$db->query("DELETE FROM " . DB_PREFIX . "baidu_push_log WHERE blogid=".intval($blogid));
return ['code' => 1, 'msg' => '记录已清理'];
}
function baidu_push_save_config($site, $token) {
$storage = Storage::getInstance('baidu_push');
$storage->setValue('config', ['site' => trim($site), 'token' => trim($token)], 'array');
return ['code' => 1, 'msg' => '配置保存成功'];
}
function baidu_push_get_title($blogid) {
$db = MySql::getInstance();
$r = $db->once_fetch_array("SELECT title FROM " . DB_PREFIX . "blog WHERE gid=".intval($blogid));
return $r['title'] ?? "未知文章($blogid)";
}
baidu_push_callback.php # 回调文件(初始化/清理数据)
<?php
!defined('EMLOG_ROOT') && exit('access denied!');
// 插件启用时初始化
function callback_init() {
// 初始化数据库
$db = MySql::getInstance();
if (empty($db)) $db = Database::getInstance();
$log_table = DB_PREFIX . 'baidu_push_log';
// 创建推送日志表(兜底)
$check_table = $db->once_fetch_array("SHOW TABLES LIKE '{$log_table}'");
if (empty($check_table)) {
$sql = "CREATE TABLE `{$log_table}` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`blogid` int(11) unsigned NOT NULL,
`url` varchar(255) NOT NULL,
`status` varchar(20) NOT NULL,
`msg` text NOT NULL,
`create_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;";
$db->query($sql);
}
// 初始化配置
$storage = Storage::getInstance('baidu_push');
if (empty($storage->getValue('config'))) {
$storage->setValue('config', ['site' => '', 'token' => ''], 'array');
}
}
// 插件卸载时清理数据
function callback_rm() {
$db = MySql::getInstance();
if (empty($db)) $db = Database::getInstance();
$log_table = DB_PREFIX . 'baidu_push_log';
// 删除日志表
$db->query("DROP TABLE IF EXISTS {$log_table}");
// 删除配置
$storage = Storage::getInstance('baidu_push');
$storage->deleteAllName('YES');
}
// 插件更新(预留)
function callback_up() {}
baidu_push_setting.php # 后台设置页(接口配置/记录管理)
<?php
!defined('EMLOG_ROOT') && exit('access denied!');
function plugin_setting_view() {
// 初始化数据库
$db = MySql::getInstance();
if (empty($db)) $db = Database::getInstance();
$log_table = DB_PREFIX . 'baidu_push_log';
$config = baidu_push_get_config();
// 处理表单提交
$msg = '';
$msg_type = '';
if ($_POST) {
// 保存配置
if (isset($_POST['save_config'])) {
$res = baidu_push_save_config($_POST['site'], $_POST['token']);
$msg = $res['msg'];
$msg_type = $res['code'] ? 'success' : 'danger';
}
// 手动推送单篇
if (isset($_POST['manual_push'])) {
$blogid = intval($_POST['manual_blogid']);
if ($blogid > 0) {
baidu_push_do_push($blogid);
$msg = "文章ID:{$blogid} 手动推送触发成功";
$msg_type = 'success';
} else {
$msg = '文章ID必须为正整数';
$msg_type = 'danger';
}
}
// 重新推送
if (isset($_POST['repush'])) {
$res = baidu_push_repush($_POST['blogid']);
$msg = $res['msg'];
$msg_type = $res['code'] ? 'success' : 'danger';
}
// 清理记录
if (isset($_POST['clear_log'])) {
$res = baidu_push_clear_log($_POST['blogid']);
$msg = $res['msg'];
$msg_type = $res['code'] ? 'success' : 'danger';
}
}
// 查询推送记录
$logs = [];
$check_table = $db->once_fetch_array("SHOW TABLES LIKE '{$log_table}'");
if ($check_table) {
$result = $db->query("SELECT * FROM {$log_table} ORDER BY create_time DESC");
while ($row = $db->fetch_array($result)) {
$row['create_time'] = date('Y-m-d H:i:s', $row['create_time']);
$row['title'] = baidu_push_get_title($row['blogid']);
$logs[] = $row;
}
}
?>
<style>
.baidu-push-wrap { padding: 20px; max-width: 1200px; }
.alert { padding: 10px 15px; margin: 10px 0; border-radius: 4px; }
.alert-success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
.alert-danger { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
.form-group { margin: 15px 0; }
label { display: block; margin-bottom: 6px; font-weight: 600; }
input { padding: 8px 10px; width: 400px; border: 1px solid #ddd; border-radius: 4px; }
button {
padding: 8px 18px; border: none; border-radius: 4px; cursor: pointer;
color: #fff; background: #007bff; margin-right: 10px;
}
button.btn-warning { background: #ffc107; color: #000; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
table th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
table th { background: #f8f9fa; }
.status-success { color: #28a745; font-weight: 600; }
.status-fail { color: #dc3545; font-weight: 600; }
</style>
<div class="baidu-push-wrap">
<h2>百度普通收录自动推送</h2>
<?php if ($msg): ?>
<div class="alert alert-<?php echo $msg_type; ?>"><?php echo $msg; ?></div>
<?php endif; ?>
<!-- 接口配置 -->
<div>
<h3>接口配置</h3>
<form method="post">
<div class="form-group">
<label>站点域名(必填,如:www.ls4.cn):</label>
<input type="text" name="site" value="<?php echo htmlspecialchars($config['site']); ?>" placeholder="百度搜索资源平台验证的域名" required>
</div>
<div class="form-group">
<label>准入Token(必填):</label>
<input type="text" name="token" value="<?php echo htmlspecialchars($config['token']); ?>" placeholder="百度搜索资源平台普通收录Token" required>
</div>
<button type="submit" name="save_config">保存配置</button>
</form>
</div>
<!-- 手动推送 -->
<div style="margin: 30px 0;">
<h3>手动推送单篇</h3>
<form method="post">
<div class="form-group">
<label>文章ID(编辑页URL中gid=xxx的xxx):</label>
<input type="number" name="manual_blogid" placeholder="输入文章ID" min="1" required>
</div>
<button type="submit" name="manual_push">立即推送</button>
</form>
</div>
<!-- 推送记录 -->
<div>
<h3>推送记录</h3>
<?php if (empty($logs)): ?>
<div class="alert alert-danger">暂无推送记录,请先配置接口并推送文章</div>
<?php else: ?>
<table>
<thead>
<tr>
<th>文章标题</th>
<th>推送链接</th>
<th>状态</th>
<th>反馈信息</th>
<th>推送时间</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($logs as $log): ?>
<tr>
<td><?php echo htmlspecialchars($log['title']); ?></td>
<td><a href="<?php echo htmlspecialchars($log['url']); ?>" target="_blank"><?php echo htmlspecialchars($log['url']); ?></a></td>
<td class="<?php echo $log['status'] == 'success' ? 'status-success' : 'status-fail'; ?>">
<?php echo $log['status'] == 'success' ? '成功' : '失败'; ?>
</td>
<td><?php echo htmlspecialchars($log['msg']); ?></td>
<td><?php echo $log['create_time']; ?></td>
<td>
<form method="post" style="display: inline;">
<input type="hidden" name="blogid" value="<?php echo $log['blogid']; ?>">
<button type="submit" name="clear_log" class="btn-warning" onclick="return confirm('确认清理该记录?')">清理</button>
</form>
<form method="post" style="display: inline;">
<input type="hidden" name="blogid" value="<?php echo $log['blogid']; ?>">
<button type="submit" name="repush" onclick="return confirm('确认重新推送?')">重推</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
</div>
<?php
}
baidu_push_trigger.php # 自动推送触发文件****
<?php
!defined('EMLOG_ROOT') && exit('access denied!');
// 触发百度推送
function baidu_push_trigger_now($blogid) {
if (empty($blogid)) return ['code' => 0, 'msg' => '文章ID为空'];
// 读取配置
$storage = Storage::getInstance('baidu_push');
$config = $storage->getValue('config', 'array') ?: ['site' => '', 'token' => ''];
if (empty($config['site']) || empty($config['token'])) {
return ['code' => 0, 'msg' => '未配置百度推送接口'];
}
// 获取文章链接
$url = Url::log($blogid);
if (empty($url)) {
return ['code' => 0, 'msg' => '文章链接获取失败'];
}
// 调用百度接口
$api = "http://data.zz.baidu.com/urls?site={$config['site']}&token={$config['token']}";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $api,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $url,
CURLOPT_HTTPHEADER => ['Content-Type: text/plain'],
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false,
]);
$result = curl_exec($ch);
$errno = curl_errno($ch);
curl_close($ch);
// 处理结果
if ($errno > 0) {
$status = 'fail';
$msg = "CURL错误:{$errno} - " . curl_strerror($errno);
} else {
$res = json_decode($result, true);
if (json_last_error() !== JSON_ERROR_NONE) {
$status = 'fail';
$msg = "接口返回异常:{$result}";
} else {
if (isset($res['success']) && $res['success'] > 0) {
$status = 'success';
$msg = "推送成功 | 剩余配额:{$res['remain']}";
} else {
$status = 'fail';
$msg = "推送失败 | " . json_encode($res);
}
}
}
// 写入日志
$db = MySql::getInstance();
$table = DB_PREFIX . 'baidu_push_log';
// 自动建表
$check = $db->once_fetch_array("SHOW TABLES LIKE '{$table}'");
if (empty($check)) {
$db->query("CREATE TABLE `{$table}` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`blogid` int(11) unsigned NOT NULL,
`url` varchar(255) NOT NULL,
`status` varchar(20) NOT NULL,
`msg` text NOT NULL,
`create_time` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;");
}
// 写入记录
$db->query("INSERT INTO `{$table}` (blogid, url, status, msg, create_time)
VALUES (
" . intval($blogid) . ",
'" . addslashes($url) . "',
'" . addslashes($status) . "',
'" . addslashes($msg) . "',
" . time() . "
)");
return ['code' => 1, 'msg' => $msg];
}
// 接收文章ID并触发推送
if (isset($_POST['baidu_push_blogid']) && intval($_POST['baidu_push_blogid']) > 0) {
$blogid = intval($_POST['baidu_push_blogid']);
$result = baidu_push_trigger_now($blogid);
exit(json_encode($result));
}
打包下载地址请上传zip格式的插件安装包
https://klcka.lanzoum.com/is4cY3kp8jhi



ls4.cn11 小时前
ls4.cn5 天前
🚨 低价清仓!小寻儿童电话手表P6S 一批处理 🚨 ✅ 精准定位 ✅ 清晰通话 ✅ 上课模式 ✅ 安全守护 库存有限,价格美丽!给宝贝多一份安心~ 有需要的家长速联!手慢无⏳ 👉 微信:ls4_cn(添加请备注“手表”,优先通过哦) ✨ 转发给需要的朋友,感谢支持!✨
ls4.cn9 个月前
家人们谁懂啊!做点小生意真不容易。今天又遇到个事儿,烦得我脑袋都大了。有客户来换手表屏幕,换完之后反馈说视频通话自动挂断,还扯出一堆其他“质量问题”,张嘴就要仅退款。
可我们检测了,屏幕换好后基础功能正常,触摸显示也没毛病,视频通话问题是他电信卡没开通高清通话(VoLTE)服务还有可能手表摄像头坏了,但是用户有不打开摄像头拍照,这哪能赖我们啊!其他所谓“质量问题”更是毫无关联,没证据就要求退款,这合理吗?咱做生意诚信为本,可也不能这么被讹啊,真愁人!
ls4.cn9 个月前
无聊的电商人
ls4.cn1 年前
米兔儿童电话手表