皇家元林

位置: 首页 > WordPress插件:wp-to-weibo

WordPress插件:wp-to-weibo

Feb 2018 08

首先介绍一下这个插件,wp-to-weibo就是WordPress同步到新浪微博的插件。之前很喜欢用朋友圈,可朋友真的多起来的时候,我又喜欢用微博了,或许哪天微博朋友多起来了,我又喜欢了Twitter。

前两年这个功能很多人用,现在用WordPress的人都没那么多了,好多这种插件代码的朋友都是N年前更新的。不过这代码又不是没用的。

这里要感谢张戈的博客,他里面介绍了很多关于怎么同步到新浪微博的方法,怎么去发现问题,受益良多。而且他之前也做了这样的一个插件。所以我这个插件基本上也是从他的代码中提炼出来的。

wp-to-weibo

wp-to-weibo

从根本上说不是他的代码有问题,是微博的接口问题,之前他介绍的微博高级写入接口,我找了半天都没找到,最后只有头条文章高级写入接口比较符合,如果想申请头条文章发布的权限,好像还需要至少有发布过10篇以上这样的文章才行。不过从微博开发平台里申请微连接之后单独申请这样的接口就OK了。

但是我这边插件除了支持这个接口,还有一个接口还可以同步到微博,那就是分享接口——第三方分享接口,这个接口只要你申请微连接默认是有的。他同步的形式如上图所示,这几天我测试了N遍。

主要核心代码有两个:一是分享到微博的形式:


function post_to_sina_weibo($post_ID) {
	if( wp_is_post_revision($post_ID) ) return;
   $get_post_info = get_post($post_ID);
   $get_post_centent = get_post($post_ID)->post_content;
   $get_post_title = get_post($post_ID)->post_title;
   if(!empty(get_post_format($post_ID))){
	if(get_post_format($post_ID) == 'aside') $get_post_format = __('aside','wp-to-weibo');
	if(get_post_format($post_ID) == 'gallery') $get_post_format =  __('gallery','wp-to-weibo');
	if(get_post_format($post_ID) == 'link') $get_post_format =  __('link','wp-to-weibo');
	if(get_post_format($post_ID) == 'image') $get_post_format =  __('image','wp-to-weibo');
	if(get_post_format($post_ID) == 'quote') $get_post_format =  __('quote','wp-to-weibo');
	if(get_post_format($post_ID) == 'status') $get_post_format =  __('status','wp-to-weibo');
	if(get_post_format($post_ID) == 'video') $get_post_format =  __('video','wp-to-weibo');
	if(get_post_format($post_ID) == 'audio') $get_post_format =  __('audio','wp-to-weibo');
	if(get_post_format($post_ID) == 'chat') $get_post_format = __('chat','wp-to-weibo');
   }else{
	$get_post_format = __('Headline', 'wp-to-weibo');
   }
   if ($get_post_info->post_status == 'publish') {
       $appkey = "新浪微博APPKEY";
       $username = “新浪微博账号”;
       $userpassword = “新浪微博密码”;
       $request = new WP_Http;
       $keywords = ""; 
 
       /* keywords of post */
       $tags = wp_get_post_tags($post_ID);
       foreach ($tags as $tag ) {
          $keywords = sprintf(__(' %1$s # %2$s # ', 'wp-to-weibo'), $keywords, $tag->name);
       }
 
      /* add keywords to post topic*/
     $string1 = sprintf(__('【 %1$s 】 %2$s : ','wp-to-weibo'), strip_tags($get_post_format), strip_tags( $get_post_title ));
     $string2 = sprintf(__('%1$s Read More %2$s', 'wp-to-weibo'), $keywords, get_permalink($post_ID));
 
     /* post num, sync failed if more */
     $wb_num = (138 - WeiboLength_test($string1.$string2))*2;
     $status = $string1.mb_strimwidth(strip_tags( apply_filters('the_content', $get_post_centent)),0, $wb_num,'...').$string2;
       /* get the thumbnail, or get the first pic */ 
		$url = get_mypost_thumbnail($post_ID);
		//$url = preg_replace('/https:\/\//i','http://',$url);
        $api_url = 'https://api.weibo.com/2/statuses/share.json'; /* API */
        $body = array('status' => $status,'source' => $appkey,'pic' => $url);
       $headers = array('Authorization' => 'Basic ' . base64_encode("$username:$userpassword"));
       $result = $request->post($api_url, array('body' => $body,'headers' => $headers));
       return json_encode($result);
    }
}

另一种是以头条文章的形式:

function post_to_sina_toutiao($post_ID) {
	if( wp_is_post_revision($post_ID) ) return;
   $get_post_info = get_post($post_ID);
   $get_post_centent = get_post($post_ID)->post_content;
   $get_post_title = get_post($post_ID)->post_title;
   $get_the_excerpt = get_post($post_ID)->post_excerpt;
   if(!empty(get_post_format($post_ID))){
	if(get_post_format($post_ID) == 'aside') $get_post_format = __('aside','wp-to-weibo');
	if(get_post_format($post_ID) == 'gallery') $get_post_format =  __('gallery','wp-to-weibo');
	if(get_post_format($post_ID) == 'link') $get_post_format =  __('link','wp-to-weibo');
	if(get_post_format($post_ID) == 'image') $get_post_format =  __('image','wp-to-weibo');
	if(get_post_format($post_ID) == 'quote') $get_post_format =  __('quote','wp-to-weibo');
	if(get_post_format($post_ID) == 'status') $get_post_format =  __('status','wp-to-weibo');
	if(get_post_format($post_ID) == 'video') $get_post_format =  __('video','wp-to-weibo');
	if(get_post_format($post_ID) == 'audio') $get_post_format =  __('audio','wp-to-weibo');
	if(get_post_format($post_ID) == 'chat') $get_post_format = __('chat','wp-to-weibo');
   }else{
	$get_post_format = __('Headline', 'wp-to-weibo');
   }
   if ($get_post_info->post_status == 'publish') {
       $appkey = "新浪微博APPKEY";
       $username = “新浪微博账号”;
       $userpassword = “新浪微博密码”;
       $request = new WP_Http;
       $keywords = ""; 
 
       /* keywords of post */
       $tags = wp_get_post_tags($post_ID);
       foreach ($tags as $tag ) {
          $keywords = sprintf(__(' %1$s # %2$s # ', 'wp-to-weibo'), $keywords, $tag->name);
       }
 
      /* add keywords to post topic*/
     $string1 = sprintf(__('【 %1$s 】 %2$s : ','wp-to-weibo'), strip_tags($get_post_format), strip_tags( $get_post_title ));
     $string2 = sprintf(__('%1$s Read More %2$s', 'wp-to-weibo'), $keywords, get_permalink($post_ID));
 
     /* post num, sync failed if more */
     $status = $string1.$get_post_centent.$string2;
       /* get the thumbnail, or get the first pic */ 
		$url = get_mypost_thumbnail($post_ID);
		//$url = preg_replace('/https:\/\//i','http://',$url);
        $api_url = 'https://api.weibo.com/proxy/article/publish.json'; 
        $body = array('title' => $get_post_title, 'text' => $get_the_excerpt, 'summary' => $get_the_excerpt, 'content' => $status, 'source' => $appkey, 'cover' => $url);
       $headers = array('Authorization' => 'Basic ' . base64_encode("$username:$userpassword"));
       $result = $request->post($api_url, array('body' => $body,'headers' => $headers));
       return json_encode($result);
    }
}

其实两段代码基本一样,不同的是接口。另外,我还添加了post-format类型。如果不满意我的中文翻译,可以用poedit软件重新翻译,当然也可以反馈给我,我会考虑您的意见。

官方下载地址

此插件刚已经提交到官方插件库了,不知道什么时候可以审核通过。目前给大家一个下载地址:WordPress插件wp-to-weibo

注意:如果以文章头条的形式,excerpt,即摘要内容必须有,否则同步失败。因为我把微博和导语部分是同步摘要的部分。其实这个插件做的不完美,特别是头条文章的形式,文章打开之后,显示的是格式化的文章,没有段落。有高手路过,可以帮我一起完善它,感谢!

== 已知bug ==
1、如上所述,头条文章形式,打开文章无格式,无段落;
2、文章更新后,还是会同步到微博,这个虽然可以加字段解决,但是我又不想在数据库里加个字段,而官方这个wp_is_post_revision貌似也不管用!

== changelog ==
2018.02.08 开始提交该插件;
2018.02.10 官方审核通过!

--转载请注明: https://hjyl.org/wp-to-weibo/

8条评论

  1. #1
    朱建林

    朱建林

    2018/02/11 08:12 -@
    Google Chrome 55 Google Chrome 55 Windows 7 Windows 7

    小刘真是太强大了。

  2. #2
    yidilian

    yidilian

    2018/02/23 19:44 -@
    Google Chrome 64 Google Chrome 64 Mac OS X 10.13 Mac OS X 10.13

    无法启用插件,因为它引起了一个致命错误(fatal error)。
    Fatal error: Can’t use function return value in write context in /**************.com/wp-content/plugins/wp-to-weibo/class-weibo.php on line 11

  3. #3
    皇家元林

    皇家元林

    2018/02/23 20:52 -@
    Firefox 58 Firefox 58 Windows 10 Windows 10

    @yidilian 不应该啊,这一行不是自定义函数啊!
    是插件冲突么?

  4. #4
    Ckend

    Ckend

    2018/02/24 01:54 -@
    Google Chrome 64 Google Chrome 64 Mac OS X 10.12 Mac OS X 10.12

    WordPress 4.9.4,使用Sequential主题,同步失败,看了博主的源代码,感觉没有任何问题,但就是同步不了,很奇怪。
    跟着微博的官方文档写了下面这个函数,用开发者token在本地可以成功分享,但是到了服务器上的WordPress用钩子却无法同步了,头痛。
    不知道在WordPress上有没有办法知道它发送post请求后的response,如果能得到response或许能知道同步不了的原因。

    function post_to_sina_weibo($status, $pic, $token) {
    $url=’https://api.weibo.com/2/statuses/share.json’;
    $status = urlencode($status);
    $options = array(
    ‘status’ => $status,
    ‘access_token’ => $token,
    ‘pic’ => new \CurlFile($pic, ‘image/png’, ‘1.png’)
    );
    $ch = curl_init();
    $timeout = 5;
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $options);
    $file_contents = curl_exec($ch);
    curl_close($ch);
    echo $file_contents;
    }

  5. #5
    皇家元林

    皇家元林

    2018/02/24 10:06 -@
    QQbrowser 10 QQbrowser 10 Windows 7 Windows 7

    @Ckend 原来是位大神,这代码我看不懂,你可以参考一下https://zhangge.net/5082.html这篇文章,他可以测试问题。

  6. #6
    皇家元林

    皇家元林

    2018/02/24 10:08 -@
    QQbrowser 10 QQbrowser 10 Windows 7 Windows 7

    @Ckend 另外,你的站貌似挂了,打不开啊

  7. #7
    Ckend

    Ckend

    2018/02/24 16:46 -@
    Google Chrome 64 Google Chrome 64 Mac OS X 10.12 Mac OS X 10.12

    @皇家元林 噢,昨晚一个插件搞冲突了,挂了一段时间。话说我找到原因了,建议用save_post钩子代替publish_post. 更加兼容一些网站。

  8. #8
    皇家元林

    皇家元林

    2018/02/24 18:27 -@
    Firefox 58 Firefox 58 Windows 10 Windows 10

    @Ckend 嗯嗯,你也可以考虑下transition_post_status这个,刚试了一下,可以解决更新文章时不同步得问题!

  9. 发表评论

    (必填)

    6794