經常上新浪微博并且關注了不少官網認證號的小伙伴一定會發現很多官方性質的微博都會把網站的最新文章或者動態同步到新浪微博這樣一來就可以讓微博用戶快速 的了解到網站的最新動態,并且也為網站增加了一個曝光以及流量入口,對于更新頻繁的網站來說增加一個同步網站動態到微博的功能是非常有必要的,也不扯淡 了,直接上代碼:
class sync_sina {
public $access_token = "";//access_token
public $default_image = "";//默認圖片地址
public $host = "https://api.weibo.com/2/";
public static $boundary = '';
function __construct(){
/**
** 事件綁定
**/
add_action('publish_post', array($this, 'new_post_photo'));
}
function do_mu_post($url, $data) {
$ch = curl_init ();
$headers = array("Content-Type:multipart/form-data;boundary=". self::$boundary);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt ( $ch, CURLOPT_POST, TRUE );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$ret = curl_exec ( $ch );
curl_close ( $ch );
return $ret;
}
function build_http_query_multi($params) {
if (!$params) return '';
uksort($params, 'strcmp');
$pairs = array();
self::$boundary = $boundary = uniqid('------------------');
$MPboundary = '--'.$boundary;
$endMPboundary = $MPboundary. '--';
$multipartbody = '';
foreach ($params as $parameter => $value) {
if( in_array($parameter, array('pic', 'image')) && $value{0} == '@' ) {
$url = ltrim( $value, '@' );
$content = file_get_contents( $url );
$array = explode( '?', basename( $url ) );
$filename = $array[0];
$multipartbody .= $MPboundary . "/r/n";
$multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "/r/n";
$multipartbody .= "Content-Type: image/unknown/r/n/r/n";
$multipartbody .= $content. "/r/n";
} else {
$multipartbody .= $MPboundary . "/r/n";
$multipartbody .= 'content-disposition: form-data; name="' . $parameter . "/"/r/n/r/n";
$multipartbody .= $value."/r/n";
}
}
$multipartbody .= $endMPboundary;
return $multipartbody;
}
function get_image($post_id){
if( has_post_thumbnail($post_id) ){
$timthumb_src = wp_get_attachment_image_src(get_post_thumbnail_id($post_id),'full');
$output = $timthumb_src[0];
} else {
$content = get_post_field('post_content', $post_id);
$defaltthubmnail = $this->default_image;
preg_match_all('/<img.*?(?: |//t|//r|//n)?src=[/'"]?(.+?)[/'"]?(?:(?: |//t|//r|//n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER);
$n = count($strResult[1]);
if($n > 0){
$output = $strResult[1][0];
} else {
$output = $defaltthubmnail;
}
}
return $output;
}
function new_post_photo($post) {
global $post;
if( $post->post_status != "publish" ){
$token = $this->access_token;
$url = $this->host ."statuses/upload.json";
$status = "我剛剛發布了新文章《".get_the_title()."》。".get_permalink();
$status .= mb_strimwidth(strip_tags(apply_filters('the_content', $post->post_content)), 0,180,"..."); //順手加了個文章摘要,不喜歡就去掉啦
$pic_path = self::get_image($post->ID);
$params = array();
$params['access_token'] = $token;
$params['status'] = $status;
$params['pic'] = '@'.$pic_path;
$body = self::build_http_query_multi($params);
$result = self::do_mu_post($url,$body);
}
}
}
$HMT = new sync_sina();
以上代碼添加至主題functions.php文件即可。
注意:
需要服務器支持file_get_contents函數以及curl組件;
如果網站在國外服務器或者服務因特殊原因屏蔽了api.weibo.com域名,則可能造成發布文章卡死或者超時的問題。
如果網站未通過新浪審核微博小尾巴會顯示為未審核應用。
新聞熱點
疑難解答