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

**【自动化推送神器】百度普通收录自动推送插件,轻松提升SEO效率!**

// ======================
// 百度推送 只推一次 自动触发
/// 百度推送自动触发
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