1,問題:
將wordpress中的一篇文章作為永久素材上傳到微信:
當文章中只有一張圖片時,可以正常上傳,且在微信公眾平台查看此素材時,文字內容、圖片都可以完整顯示。
在文章中再增加一張圖片(文章圖片大於1張時),在微信後台查看此素材時發現文章不完整:從第一張圖片開始以後的內容全部遺失。
補充說明:
(1)自己寫了個插件,可以將wordpress文章上傳到微信素材庫。
主要流程:curl抓取文章中的圖片並上傳到微信素材庫,取得url然後將wordpress文章中的圖片src做相應替換。
然後建構圖文訊息json字串上傳到微信。
(2)wordpress文章中不添加任何樣式,僅
、標籤
2,代碼:
<code>// 上传图文消息代码
$raw = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='
. $token, self::json_article( $post_ids, $token ), false );
/**
* 将文章内容构造成json字符串
*
* @param array $post_ids
* @param string $token
* @return string json
*/
private function json_article( $post_ids, $token ) {
$mp_article = '{"articles":[';
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
$post_urls = self::preg_match_src( $post->post_content );
if ( $post_urls ) {
// 如果文章中有图片,将文章中的图片上传至微信素材库
foreach ( $post_urls as $post_url ) {
if ( strpos( $post_url, 'qpic.cn' ) === false ) {
// 如果图片没有上传到微信服务器
$res = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_material?'
. 'access_token=' . $token . '&type=image', false, Curl::curl_get_img( $post_url ) );
//替换文章内容img中的src地址
$post->post_content = str_replace( $post_url, $res['url'], $post->post_content );
}
$post->post_content = str_replace( '"', '\"', $post->post_content );
}
}
// 获取缩略图并上传
// 相应的code省略
// 构造json
$mp_article .= '{
"title": "' . $post->post_title . '",
"content_source_url": "' . get_permalink( $post_id, false ) . '",
"thumb_media_id": "' . $thumb_res['media_id'] . '",
"content": "' . htmlspecialchars_decode( $post->post_content ) . '",
"show_cover_pic": 0,
';
if ( !empty($post->post_excerpt ) ) {
$mp_article .= '"digest": "' . $post->post_excerpt . '",';
}
$mp_article .= '},';
}
return rtrim($mp_article, ',') . ']}';
}</code>
登入後複製
登入後複製
3,報錯訊息:微信未回傳錯誤訊息。
4,截圖:無。
5,其他參考:
在CSDN上看過tilun_099遇到類似的問題:http://bbs.csdn.net/topics/39...。
tilun_099的問題是:「在上傳多圖文素材時如果content的內容是純文字是,可以上傳成功,得到media_id,然後透過群發接口,手機可以正確獲得多圖文資訊。可是如果content裡面的內容含有html的標籤,如
,,等等時,上傳後雖然也能獲得media_id,群發後,手機得到的是單圖文,而且這個單圖文有圖片,標題,鏈接,就是沒有具體內容。一下轉義。
<code>foreach ($news as &$item){
foreach ($item as $k=>$v){
if($k =='content'){
$item[$k] = urlencode(htmlspecialchars(str_replace("\"","'",$v)));
}else{
$item[$k] = urlencode($v);
}
}
}</code>
登入後複製
登入後複製
就是要將html裡面的「」引號先轉成單引號,然後再轉成html實體,這樣在進行urlencode的時候就不會影響到標籤了。
<code>$data=array("articles"=>$news);
$data=json_encode($data);
$end_data= urldecode($data);
$end_data= htmlspecialchars_decode($end_data);</code>
登入後複製
登入後複製
上傳之前再對內容進行urldecode和將html實體轉成html標籤,這樣就OK了。
測試過的! 」
我和他遇到的問題有點相似,但是不完全相同,我是直接構造的json。
回覆內容:
1,問題:
將wordpress中的一篇文章作為永久素材上傳到微信:當文章中只有一張圖片時,可以正常上傳,且在微信公眾平台查看此素材時,文字內容、圖片都可以完整顯示。
在文章中再增加一張圖片(文章圖片大於1張時),在微信後台查看此素材時發現文章不完整:從第一張圖片開始以後的內容全部遺失。
補充說明:
(1)自己寫了個插件,可以將wordpress文章上傳到微信素材庫。
主要流程:curl抓取文章中的圖片並上傳到微信素材庫,取得url然後將wordpress文章中的圖片src做相應替換。
然後建構圖文訊息json字串上傳到微信。
(2)wordpress文章中不添加任何樣式,僅
、標籤
2,代碼:
<code>// 上传图文消息代码
$raw = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='
. $token, self::json_article( $post_ids, $token ), false );
/**
* 将文章内容构造成json字符串
*
* @param array $post_ids
* @param string $token
* @return string json
*/
private function json_article( $post_ids, $token ) {
$mp_article = '{"articles":[';
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
$post_urls = self::preg_match_src( $post->post_content );
if ( $post_urls ) {
// 如果文章中有图片,将文章中的图片上传至微信素材库
foreach ( $post_urls as $post_url ) {
if ( strpos( $post_url, 'qpic.cn' ) === false ) {
// 如果图片没有上传到微信服务器
$res = Curl::curl_post_wx( 'https://api.weixin.qq.com/cgi-bin/material/add_material?'
. 'access_token=' . $token . '&type=image', false, Curl::curl_get_img( $post_url ) );
//替换文章内容img中的src地址
$post->post_content = str_replace( $post_url, $res['url'], $post->post_content );
}
$post->post_content = str_replace( '"', '\"', $post->post_content );
}
}
// 获取缩略图并上传
// 相应的code省略
// 构造json
$mp_article .= '{
"title": "' . $post->post_title . '",
"content_source_url": "' . get_permalink( $post_id, false ) . '",
"thumb_media_id": "' . $thumb_res['media_id'] . '",
"content": "' . htmlspecialchars_decode( $post->post_content ) . '",
"show_cover_pic": 0,
';
if ( !empty($post->post_excerpt ) ) {
$mp_article .= '"digest": "' . $post->post_excerpt . '",';
}
$mp_article .= '},';
}
return rtrim($mp_article, ',') . ']}';
}</code>
登入後複製
登入後複製
3,報錯訊息:微信未回傳錯誤訊息。 4,截圖:無。 5,其他參考:
在CSDN上看過tilun_099遇到類似的問題:http://bbs.csdn.net/topics/39...。
tilun_099的問題是:「在上傳多圖文素材時如果content的內容是純文字是,可以上傳成功,得到media_id,然後透過群發接口,手機可以正確獲得多圖文資訊。可是如果content裡面的內容含有html的標籤,如
,,等等時,上傳後雖然也能獲得media_id,群發後,手機得到的是單圖文,而且這個單圖文有圖片,標題,鏈接,就是沒有具體內容。一下轉義。
<code>foreach ($news as &$item){
foreach ($item as $k=>$v){
if($k =='content'){
$item[$k] = urlencode(htmlspecialchars(str_replace("\"","'",$v)));
}else{
$item[$k] = urlencode($v);
}
}
}</code>
登入後複製
登入後複製
就是要將html裡面的「」引號先轉成單引號,然後再轉成html實體,這樣在進行urlencode的時候就不會影響到標籤了。
<code>$data=array("articles"=>$news);
$data=json_encode($data);
$end_data= urldecode($data);
$end_data= htmlspecialchars_decode($end_data);</code>
登入後複製
登入後複製
上傳之前再對內容進行urldecode和將html實體轉成html標籤,這樣就OK了。 測試過的! 」
我和他遇到的問題有點相似,但是不完全相同,我是直接構造的json。