本插件目前有两个功能:
1、发布文章时通过API主动将文章推送给百度
2、用户在前台浏览文章时,会在每个页面底部加载自动提交代码,将当前浏览的页面提交给百度

插件下载:BaiduSeo.zip
项目地址:Gitee

需要填写的接口调用地址,登录百度站长平台并添加站点后,会自动生成,如图所示

api.png

将此项填入插件设置即可使用主动推送。

另外需要注意的是,自动提交需要在百度资源平台给站点关联过主体后才有效。

guanlianzhuti.png


实现思路:

  1. 将功能的具体实现注册到对应的调用点。
  2. 启用插件后提示用户,要求设置提交接口。
  3. 发布文章后获取文章的链接与提交接口,提交数据,若提交失败给出提示。
  4. 前台访问触发后,将自动提交的JS代码输出到前台模板。

API提交代码和自动提交的JS代码,百度资源平台的文档都有,插件调用点我选择了Widget_Contents_Post_EditfinishPublish接口,和Widget_Archivefooter接口,分别会在文章发布保存入数据库后 和 前台页面的底部被触发。

typecho_widget.png

在文章发布完成后调用插件,插件会获取发布的文章的地址,将其提交给百度的接口,若配置有误或提交失败会弹出错误信息。

代码如下

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
/**
 * 百度SEO
 * 
 * @package BaiduSeo
 * @author 寒冬日志
 * @version 1.0.0
 * @link https://www.cwlog.net/
 */
class BaiduSeo_Plugin implements Typecho_Plugin_Interface
{
    /**
     * 激活插件方法,如果激活失败,直接抛出异常
     * 
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function activate()
    {
        Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('BaiduSeo_Plugin', 'publish_push');
        Typecho_Plugin::factory('Widget_Archive')->footer = array('BaiduSeo_Plugin', 'auto_push');
        return _t('请设置接口调用地址');
    }
    
    /**
     * 禁用插件方法,如果禁用失败,直接抛出异常
     * 
     * @static
     * @access public
     * @return void
     * @throws Typecho_Plugin_Exception
     */
    public static function deactivate()
    {}
    
    /**
     * 获取插件配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form 配置面板
     * @return void
     */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        $api = new Typecho_Widget_Helper_Form_Element_Text('api', NULL, 'NULL', _t('接口调用地址'), _t('站长工具-普通收录-资源提交-API提交-接口调用地址<br>(格式如下:http://data.zz.baidu.com/urls?site=https://www.cwlog.net&token=xxxxxxxxxxx)'));
        $form->addInput($api->addRule('required', _t('请填写接口调用地址')));
    }
    
    /**
     * 个人用户的配置面板
     * 
     * @access public
     * @param Typecho_Widget_Helper_Form $form
     * @return void
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {}
    
    /**
     * 发布文章时使用接口推送
     * 
     * @access public
     * @return void
     */
    public static function publish_push($content, $edit)
    {
        $api = Typecho_Widget::widget('Widget_Options')->plugin('BaiduSeo')->api;
        if($api === 'NULL' || strpos($api, 'data.zz.baidu.com') !== 7) exit('<script>alert("请为BaiduSeo插件配置正确的接口调用地址");location.href="'.$siteUrl.'/admin/manage-posts.php";</script>');
        
        $db = Typecho_Db::get();
        $siteUrl = Typecho_Widget::widget('Widget_Options')->index;

        $content['cid'] = $edit->cid;
        $content['slug'] = $edit->slug;
        
        //获取分类缩略名
        $content['category'] = urlencode(current(Typecho_Common::arrayFlatten($db->fetchAll($db->select()->from('table.metas')
            ->join('table.relationships', 'table.relationships.mid = table.metas.mid')
            ->where('table.relationships.cid = ?', $content['cid'])
            ->where('table.metas.type = ?', 'category')
            ->order('table.metas.order', Typecho_Db::SORT_ASC)), 'slug')));

        //获取并格式化文章创建时间
        $content['created'] = $edit->created;
        $created = new Typecho_Date($content['created']);
        $content['year'] = $created->year; $content['month'] = $created->month; $content['day'] = $created->day;

        //生成URL
        $url = Typecho_Common::url(Typecho_Router::url($content['type'], $content), $siteUrl);

        //发送请求
        $urls = array(0=>$url);
        $ch = curl_init();
        $options =  array(
            CURLOPT_URL => $api,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => implode("\n", $urls),
            CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
        );
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);
        
        $res = json_decode($result, true);
        if(isset($res['error'])) exit('<script>alert("链接提交百度接口失败!错误代码:'.$res['error'].',错误信息:'.$res['message'].'。");location.href="'.$siteUrl.'/admin/manage-posts.php";</script>');
    }
    
        /**
     * 用户浏览文章时自动推送
     * 
     * @access public
     * @return void
     */
    public static function auto_push()
    {
        echo PHP_EOL.'<script>
(function(){
  var bp = document.createElement("script");
  var curProtocol = window.location.protocol.split(":")[0];
  if (curProtocol === "https"){
    bp.src = "https://zz.bdstatic.com/linksubmit/push.js";
  }else{
    bp.src = "http://push.zhanzhang.baidu.com/push.js";
  }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>'.PHP_EOL;
    }
}

标签: none

已有 3 条评论

  1. 收集癖 收集癖

    大佬,为啥我用了插件,连续两天上传文章,在百度的站点信息里链接提交里,都显示没有推送啊

  2. 呀!大佬! 那个插件下载地址失效了
    有时间可以补一下吗

    1. 已修改,前阵子换上传目录漏掉了

添加新评论