微博通for wordpress插件完善

昨天老郑说:"搞一个微博同步插件,只需要同步到微博通,标题加截取摘要加图片". 折腾一宿加一下午终于弄好了,解决了微博通官方插件for wordpress不能截取内容摘要和上传图片的问题,
先上效果图

微博通同步效果

然后上代码(晚点再补充说明,因为我现在急着去打牌了,哈哈)
2013-02-21 01:00:56 更新: 可以直接抓取文中第一张图片而不用设置缩略图了,支持外链图片和本地上传的图片,非第一次发布的文章更新永久不会同步,下面代码已经替换为新版

  • 下载地址(直接在插件→安装中上传启用即可)
  • 代码源文件
  • <?php
    /*
    Plugin Name: 微博通同步发布
    Plugin URI: http://xiaohudie.net/wbto-plugin.html (参考: 原插件下载地址: http://www.wbto.cn/bbs/viewthread.php?tid=382)
    Description: 自动把你的博客文章同步到微博通,微博通将同步至你所绑定的各个平台。
    Version: 1.0
    Author: 小蝴蝶(原作者yige)
    Author URI: http://xiaohudie.net & http://t.qq.com/abcwuwuwu
    */
    function wbto_install() {
    global $wpdb;
    $table_name = $wpdb->prefix."wbto";
    if($wpdb->get_var("show tables like '$table_name'") != $table_name) {
    $sql = "CREATE TABLE " . $table_name . " (id mediumint(9) NOT NULL AUTO_INCREMENT, wbto_username VARCHAR(100) NOT NULL, wbto_password VARCHAR(100) NOT NULL, );";
    }
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
    }
    function send_to_wbto($post_ID) {
    $posted = get_post($post_ID);
    preg_match_all('/<img[^>]+src=['"](http[^'"]+)['"].*>/isU',$posted->post_content, $image);//匹配图像格式
    $p_sum = count($image[1]);
    if ($p_sum > 0) {
    $p = $image[1][0];
    }
    if (!$p) {
    if (function_exists('has_post_thumbnail') && has_post_thumbnail($post_ID)) { //  如果支持特色图像(WordPress v2.9以上)并且存在特色图像,则抓特色图像
    if ($image_url = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'post-thumbnail'))
    $p = $image_url[0];
    }
    }
    $t1=$posted->post_date;
    $t2=$posted->post_modified;
    $diff=strtotime($t2)-strtotime($t1);
    if($diff>0){return;} //重要修改:加上了发布时间判断,如果文章更新,将不会同步到微博
    $username = get_option('wbto_username');
    $password = get_option('wbto_password');
    $posted = get_post($post_ID);
    $image_url = $p;//重要修改:抓图像,支持外链图片和本地上传的图片,如果有特色图像则抓特色图像
    $excerpt=mb_strimwidth(strip_tags($posted->post_content),0,130,'...'); //截130字的内容,因为总共140字还要留一点在最后放链接
    $fields = array();
    $fields['source'] = 'wordpress';
    $fields['content'] = urlencode('['.$posted->post_title.']'.mb_strimwidth(strip_tags($excerpt),0,130,'...').' '.$posted->guid); //微博格式,效果如图,即:[标题]摘要内容+链接
    $ch = curl_init();
    if ($image_url) { //图片和文字微博的接口不同,所以要加个判断,否则会同步失败
    $fields['imgurl'] =$image_url;
    curl_setopt($ch, CURLOPT_URL, "http://wbto.cn/api/upload.json"); //这是官方API里提供的图片同步的接口
    } else {
    curl_setopt($ch, CURLOPT_URL, "http://wbto.cn/api/update.json"); //这是普通文字微博接口
    }
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    $result = curl_exec($ch);
    curl_close($ch);
    }
    //以下代码则未做改动,不过我也注释了一些部分,给大家做个参考,了解一下
    function wbto_menu() {
    add_options_page('微博通同步设置', '微博通同步', 8, __FILE__, 'wbto_options');
    }//添加一个设置页面
    function wbto_options() {//下面输出设置页面的HTML
    echo '<div class="wrap">';
    echo '<h2>微博通同步</h2>';
    echo '<form method="post" action="options.php">';
    echo wp_nonce_field('update-options');
    echo '<table class="form-table">';
    echo '<tr valign="top">';
    echo '<th scope="row">用户名 <a href="http://www.wbto.cn/?app=wp">注册</a></th>';
    echo '<td><input type="text" name="wbto_username" value="'.get_option('wbto_username').'" /></td>';
    echo '</tr>';
    echo '<tr valign="top">';
    echo '<th scope="row">密码</th>';
    echo '<td><input type="password" name="wbto_password" value="'.get_option('wbto_password').'" /></td>';
    echo '</tr>';
    echo '</table>';
    echo '<input type="hidden" name="action" value="update" />';
    echo '<input type="hidden" name="page_options" value="wbto_username,wbto_password" />';
    echo '<p class="submit">';
    echo '<input type="submit" name="submit" id="submit" class="button-primary" value="保存更改" />';
    echo '</p>';
    echo '</form>';
    echo '</div>';
    
    }
    add_action('admin_menu', 'wbto_menu');//将插件设置页面挂在后台设置中
    add_action('publish_post', 'send_to_wbto');//动作在发布文章时触发
    ?>
    133 Comments

    Name *

    E-mail *

    Website

    1. 萨龙龙

      确实在为文章通过社交网站苦恼,微博通for WP是个实用的插件。

    2. Han

      下载地址失效了。。

      • 小蝴蝶

        @Han 已修复

    3. 小任

      我始終無法同步到微博通,我增加可以觸發的transition_post_status action hook
      function wbtoPublishTo( $new_status, $old_status, $post ) {
      if ( $old_status!=’publish’ && $old_status!=’trash’ && $new_status == ‘publish’ )
      send_to_wbto();
      }
      add_action( ‘transition_post_status’, ‘wbtoPublishTo’, 10, 3 );

      ,但是文字及圖片都抓不到,只顯示 []…,有任何建義嗎?

    4. 静心

      你好,我想提取评论内容中图片的url,我根据网上代码写成的下面代码,但测试不对,你知道正确的写法吗?能不能帮忙改一下,谢谢。
      function catch_comment_image($comment_ID){$comment_text=
      get_comment_text($comment_ID);
      $image_url=”;
      $output=preg_match_all(‘/(http:\/\/|https:\/\/){1}.+?\.(jpg|gif|bmp|bnp|png)$/is’,$comment_text,$image_url);//匹配图像格式
      $c_pic = $image_url[1][0];
      return $c_pic;}

      • 小蝴蝶

        @静心 你匹配正则写的不对,用法也不对

        function catch_comment_image(){
        $comment_text=get_comment_text( ); 
        $output=preg_match_all('/ <[img|IMG].*?src=[\'|\"](.*?(?:[\.png|\.jpg|\.gif|\.bmp|\.bnp]))[\'|\"].*?[\/]? >/',$comment_text,$match); 
        print_r( $match[1][0]);}

        然后在评论函数里comment_text();后面加上catch_comment_image() 就能调出来了

    5. 静心

      @小蝴蝶,谢谢。。

      • 小蝴蝶

        @静心 不客气

        • Michael

          @小蝴蝶 出现[]问题,文章发表了后同步微博就只显示这个“[]”,求解决办法

          • 小蝴蝶

            @Michael 说明文章内容没被抓取,如果文章不是空白的话,检查一下插件是否被改动过,也有可能是wp升级导致,等有时间了我再看看吧

            • Michael

              @小蝴蝶 文章形式是“图片”,不是“标准”的就没办法同步,内容变空

              • 小蝴蝶

                @Michael 哦这样啊 那就对了 没有兼顾文章形式这一块 等有时间弄吧

    6. UFO

      可以请小蝴蝶将此插件同步到微博的动态链接代码:
      ‘.$posted->guid);

      改成根据后台设置的“固定链接”格式的代码吗?

      因为我网站的动态链接(http://www.ufo.org.in/?p=232)不知何故无法实现自动跳转……

    7. 小伙子博客

      太棒了,正在寻找这样的方法,马上试试。