更新《同步WordPress日志更新信息到twitter》,添加标签信息同步
最新进展:已将此功能写成插件,功能更多,使用更方便。下载地址:WordPress官方地址
如果你是一名折腾用户,欢迎使用以下代码集成在自己的主题中。
如果你对php代码不太感冒,对wp结构不太清楚,欢迎试用本插件。
插件下载:地址暂未提供,稍后放出。提前体验,可留言索要。
在上一篇日志《同步WordPress日志更新信息到twitter》,我简单提供了一种实时同步相关信息到推特的方法。
我注意到,twitter上有些同学更新的信息中带有文章标签,在twitter中表现就是前面带有“#”号,此种形式在twitter中应该叫“话题”。于是我也更新了我的方法,加入了更新标签信息的功能。
具体操作就是:
1.每个标签前面加上“#”;
2.如果{标题+url}长度已经大于140,则不加入标签信息,否则则加入标签。
3.加入标签信息后长度大于140,则需要截断标签。原则是要一个标签一个标签的裁掉,不能将一个完整的标签截断。比如一篇日志五个标签,由于大于了限制长度,所以要减少标签数量,但不能将”#标签1 #标签2 #标签3 #标签4 #标签5”给截断成”#标签1 #标签2 #标签3 #标”。截断后是”#标签1 #标签2 #标签3 ”或者”#标签1 #标签2“形式。
另外还有就是之前用substr()截断,容易产生乱码。有条件的同学可以使用mb_substr(),如果你的主机也是不支持mb,可自行上网搜寻一个中文字符截断函数。
原先使用strlen()计算字符长度,其实这个函数会将中文字符当做三个字符计算,所以我提供了一个可以正确计算包含中文字符在内的函数以代替strlen();
add_action('publish_post', 'get_update_post_info');
function get_update_post_info($id)
{
if($_POST['action'] != "autosave" and $_POST['post_status'] != "draft")
{
$mypost = get_post($id);
$title = strip_tags(get_the_title($id));
$postlink = get_permalink($id);
if($_POST['original_post_status'] == 'publish')
{
if (time() - strtotime($mypost->post_date) < 60*60*24*1 )
{
return;
}
$title = "【博文修改】" . $title;
}
else
{
$title = "【博客更新】" . $title;
}
$shortlink = "http://u.boy.im/api.php?url=" . $postlink;
$url_contents = file_get_contents($shortlink);
$temp_length = (str_len($title)) + (str_len($url_contents));
if($temp_length > 137)
{
$remaining_chars = 134 - str_len($url_contents);
if (function_exists(’mb_string’)) //如果你的主机支持mb扩展
{
$title = mb_substr($title, 0, $remaining_chars);
} else
{
$title = substr($title, 0, $remaining_chars);
}
$title = $title . "...";
}
$message = $title . " - " . $url_contents;
//以上是之前的代码,以下为新加内容
$message_length = str_len($message);
$tags = wp_get_post_tags($mypost->ID);
$tagcount = count($tags);//计算标签数目
if ($tagcount > 0)
{
$tag[0] = "#" . $tags[0]->name;//第一个标签前加“#”
$tag_length[0] = str_len($tag[0]);
for ($i=1;$i < $tagcount;$i++)
{
$tag[$i] = $tag[$i-1]." #" . $tags[$i]->name;
$tag_length[$i] = str_len($tag[$i]);
}
/*从包含所有标签的字符串开始计算,直到找出那个符合条件(加上此标签字符串不大于140)的*/
for ($j = $tagcount-1;$j >= 0;$j--)
{
if ((139 - $message_length) >= $tag_length[$j])
{
$ok = $j;
break;
}
}
$message .= " ".$tag[$ok];//连接符合条件的标签字符串
}
wp_to_twitter($message);
}
}
function wp_to_twitter($message)//同步到twitter
{
$username = "用户名";
$password = "密码";
$url = 'http://twitter.com/statuses/update.xml';//国外用户使用这个,国内的用户则通过下面的api代理来发布。(代理可能会不稳,出现更新失败)
//$url = 'http://nest.onedd.net/api/statuses/update.xml';
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, "$url");
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message&source=qiqiboy.com");
curl_setopt($curl_handle, CURLOPT_USERPWD, "$username:$password");
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
/*
$body = array( 'status'=>$message );
$headers = array( 'Authorization' => 'Basic '.base64_encode("$username:$password") );
$request = new WP_Http;
$result = $request->request( $url , array( 'method'=>'POST', 'body'=>$body, 'headers'=>$headers) );
*/
}
function str_len($str)//计算中文字符长度函数
{
$length = strlen(preg_replace('/[\x00-\x7F]/', '', $str));
if ($length)
{
return strlen($str) - $length + intval($length / 3) ;
}
else
{
return strlen($str);
}
}
我自己用的还会同步到新浪微博,但是新浪微博的话题形式是一个标签包含在两个”#”中,所以需要对代码稍作修改。如果你需要相关代码,可联系我。
![]()
针对某些人考虑将密码以明文形式放在function.php中的安全问题,我有打算将这个完备成一个插件,届时还将加入更多同步内容与设置功能。如果你有好的想法或者关于同步的更好建议,欢迎在此与我交流或者twitter上FO我【@qiqiboy】。
Post url: http://qiqi.boy.im/22. You can ReTweet This Post.

23 Responses to this post.
Comments (21) Trackbacks (2)[...] 同步WordPress日志更新信息到twitter Leave a commentGo to comments[38] 19:53|Categories: Program close 本文中方法已经更新,请移步至 更新《同步WordPress日志更新信息到 twitter》,添加标签信息同步 [...]
[...] little wp to twitter(sina)是我结合此前前两篇日志《 同步WordPress日志更新信息到twitter》《更新 同步WordPress日志更新信息到 twitter,添加标签信息同步》的基础上,经过略微修改,丰富相关设置后发布的一款插件。 [...]