经常上新浪微博并且关注了不少官网认证号的小伙伴一定会发现很多官方性质的微博都会把网站的最新文章或者动态同步到新浪微博这样一来就可以让微博用户快速 的了解到网站的最新动态,并且也为网站增加了一个曝光以及流量入口,对于更新频繁的网站来说增加一个同步网站动态到微博的功能是非常有必要的,也不扯淡 了,直接上代码:

  1. class sync_sina {
  2.     public $access_token = "";
  3.     public $default_image = "";
  4.     public $host = "https://api.weibo.com/2/";
  5.     public static $boundary = '';
  6.     function __construct(){
  7.         add_action('publish_post', array($this, 'new_post_photo'));
  8. function do_mu_post($url$data) {
  9.         $ch = curl_init ();
  10. $headers = array("Content-Type:multipart/form-data;boundary=". self::$boundary);
  11.         $ch = curl_init();
  12. $ch, CURLOPT_HTTPHEADER, $headers);
  13.         curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
  14. $ch, CURLOPT_POST, TRUE );
  15.         curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
  16. $ch, CURLOPT_URL, $url );
  17.         curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  18. $ret = curl_exec ( $ch );
  19.         curl_close ( $ch );
  20. return $ret;
  21.     }
  22.     function build_http_query_multi($params) {
  23. if (!$paramsreturn '';
  24.         uksort($params, 'strcmp');
  25. $pairs = array();
  26.         self::$boundary = $boundary = uniqid('------------------');
  27. $MPboundary = '--'.$boundary;
  28.         $endMPboundary = $MPboundary. '--';
  29. $multipartbody = '';
  30.         foreach ($params as $parameter => $value) {
  31. if( in_array($parameterarray('pic', 'image')) && $value{0} == '@' ) {
  32.                 $url = ltrim( $value, '@' );
  33. $content = file_get_contents$url );
  34.                 $array = explode( '?', basename$url ) );
  35. $filename = $array[0];
  36.                 $multipartbody .= $MPboundary . "rn";
  37. $multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "rn";
  38.                 $multipartbody .= "Content-Type: image/unknownrnrn";
  39. $multipartbody .= $content"rn";
  40.             } else {
  41. $multipartbody .= $MPboundary . "rn";
  42.                 $multipartbody .= 'content-disposition: form-data; name="' . $parameter . ""rnrn";
  43. $multipartbody .= $value."rn";
  44.             }
  45.         $multipartbody .= $endMPboundary;
  46. return $multipartbody;
  47.     }
  48.     function get_image($post_id){
  49. if( has_post_thumbnail($post_id) ){
  50.             $timthumb_src = wp_get_attachment_image_src(get_post_thumbnail_id($post_id),'full');
  51. $output = $timthumb_src[0];
  52.         } else {
  53. $content = get_post_field('post_content', $post_id);
  54.             $defaltthubmnail = $this->default_image;
  55. "]?(.+?)['"]?(?:(?: | |
    |
    )+.*?)?>/sim', $content$strResult, PREG_PATTERN_ORDER);

  56.             $n = count($strResult[1]);
  57. if($n > 0){
  58.                 $output = $strResult[1][0];
  59. else {
  60.                 $output = $defaltthubmnail;
  61.         }
  62. return $output;
  63.     }
  64.     function new_post_photo($post) {
  65. global $post;
  66.         if$post->post_status != "publish" ){
  67. $token = $this->access_token;
  68.             $url = $this->host ."statuses/upload.json";
  69. $status = "我刚刚发布了新文章 《".get_the_title()."》 。".get_permalink();
  70.             $status .= mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0,180,"..."); 
  71. $pic_path = self::get_image($post->ID);
  72.             $params = array();
  73. $params['access_token'] = $token;
  74.             $params['status'] = $status;
  75. $params['pic'] = '@'.$pic_path;
  76.             $body = self::build_http_query_multi($params);
  77. $result = self::do_mu_post($url,$body);
  78.     }
  79. $HMT = new sync_sina();

以上代码添加至主题 functions.php 文件即可。

注意:

需要服务器支持 file_get_contents 函数以及 curl 组件;

如果网站在国外服务器或者服务因特殊原因屏蔽了 api.weibo.com 域名,则可能造成发布文章卡死或者超时的问题。

如果网站未通过新浪审核微博小尾巴会显示为未审核应用。

文章参考:http://www.mywpku.com/WordPress-sync-sina-weibo.html