WordPress 小程序通过 XML_RPC 实现发布文章详细教程
更新时间:2018-12-15 分类:小程序 浏览量:3935
上一次写了一篇《通过 XMLRPC 实现 WordPress 微信小程序发布文章》,然后由于时间关系,基本实现的功能并没有整合至开源版《WordPress 连接微信小程序 API 增强插件》里,一直放在一个角落里静静的呆着。后来,由于准备着新版的 WordPress 小程序 API 插件的码代码,所以就没有再写过详细的教程,这次,借着新版的 WordPress 小程序 API 插件基本功能完成后,写一篇比较详细的教程。不过,还是采用开源版的写法,而且,需要说明一下的是,其实这个方法虽然可以实现,但是并不是那么的好用,只是作为一种思路,提供参考。
首先,需要创建一个发布文章的 API 。为了节省时间,就直接贴全部的 API 代码,虽然是渣渣,但也是探索成功了。
add_action( 'rest_api_init', function () {
register_rest_route( 'wechat/v1', 'post/add', array(
'methods' => 'POST',
'callback' => 'wp_post_data_by_xmlrpc'
));
});
function wp_post_data_by_xmlrpc($request) {
$title=$request['title'];
$body=$request['body'];
$category=$request['category'];
$openid=$request['openid'];
if(empty($title) || empty($body) || empty($category) || empty($openid) ) {
return new WP_Error( 'error', 'openid or title or content or category is empty', array( 'status' => 500 ) );
} else {
if(!username_exists($openid)) {
return new WP_Error( 'error', 'Not allowed to submit', array('status' => 500 ));
} else {
$data = wp_post_insert($title, $body, $category, $openid);
if (empty($data)) {
return new WP_Error( 'error', 'add post error', array( 'status' => 404 ) );
}
$response = new WP_REST_Response($data);
$response->set_status( 200 );
return $response;
}
}
}
// https://codex.wordpress.org/XML-RPC_WordPress_API/Posts
function wp_post_insert( $title, $body, $category, $openid ){
$url = get_bloginfo('wpurl').'/xmlrpc.php';
$user = $openid;
$passwd = $openid;
$content = array(
'post_title' => $title,
'post_content' => $body,
'post_type' => 'post', // 文章类型,默认 post;
'post_status' => 'pending', // 状态:Publish 发布; Future 计划; Draft 草稿; Pending 待审; Private 私密; Trash 回收站; Auto-Draft 自动草稿
'post_category' => array($category)
);
$params = array(0,$user,$passwd,$content,true);
$request = xmlrpc_encode_request("wp.newPost", $params, array('encoding' => 'UTF-8', 'escaping' => 'markup'));
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
$results = curl_exec($ch);
curl_close($ch);
$data = simplexml_load_string($results);
return $data;
}
上面的代码创建的 API 是 https://你的域名/wp-json/wechat/v1/post/add 。需要传递的参数是:文章标题,文章内容,分类 ID 和用户 Openid 。标题,内容和分类 ID 就不多说了,之所以传递用户 Openid 是,由于开源版采用的是用户 Openid 作为登录名,XML_RPC 发布文章的接口是需要用户名和密码的。但是为什么不传递密码呢?这个要不要传递,是根据自己个人情况设定的。这里不传递,是因为开源版把用户 Openid 同样作为了用户密码,所以代码里面的密码也是使用 Openid 。(这其实是一个风险,容易被人利用。所以要看自己的个人情况把这个默认方式修改,比如用 md5 加密或者 base64 加密)
如果想要发表文章的时候,可以增加更多的内容,比如包括自定义标签,文章标签等,则可以考虑 https://codex.wordpress.org/XML-RPC_WordPress_API/Posts 相关说明,这里不作过多介绍。
完成了 API 创建之后,下面就是小程序前端了。小程序前端的写法,下面仅提供一个参考代码,具体的实现,还需要靠个人自己去尝试了。
wxml 代码
<form bindsubmit="formSubmit">
<input name="title" id="title" value="" style="height:60rpx;line-height:60rpx;margin:10rpx 20rpx;background:#eee;"/>
<input name="body" id="body" value="" style="height:60rpx;line-height:60rpx;margin:10rpx 20rpx;background:#eee;"/>
<input name="category" id="category" value="" style="height:60rpx;line-height:60rpx;margin:10rpx 20rpx;background:#eee;"/>
<button type="warn" form-type="submit">马上发布</button>
</form>
js 代码
formSubmit: function (e) {
var self = this;
var title = e.detail.value.title; // 标题
var body = e.detail.value.body; // 内容
var category = e.detail.value.category; // 必须是分类 id
var openid = 这里需要根据自身情况获取用户 openid;
//console.log(title,body,category);
if (title != null && title != '' && body != null && body != '') {
wx.request({
url: 'https://你的域名/wp-json/wechat/v1/post/add',
method: "POST",
data: {
title: title,
body: body,
category: category,
openid: openid ,
},
success: function (res) {
console.log(res);
if (res.statusCode == 200) {
if (res.data.fault) {
wx.showToast({
title: '提交失败',
icon: 'warn',
duration: 2000
})
} else {
wx.showToast({
title: '提交成功',
icon: 'success',
duration: 2000
})
}
} else {
wx.showToast({
title: '提交失败',
icon: 'warn',
duration: 2000
})
}
},
fail: function (res) {
console.log(res);
wx.showToast({
title: '提交失败',
icon: 'warn',
duration: 2000
})
}
});
} else {
// 失败提示
}
}
如此基本上就可以实现了通过 XML_RPC 发布文章。至于上传图片的详细代码,这里就不写了。相比上一篇,这一次的代码相对比较详细了,有兴趣的可以去折腾一下。
另作个预告,新版的 WordPress 小程序插件,最终还是基于 WordPress REST API 创建,基本上完成了,尽力的做到小程序里只需要修改一个域名就可以使用,相关配置尽力的配置到了后台插件里,不需要做太多的繁杂修改。其实还是比较推荐水煮鱼大神的小程序 API ,现在加入了水煮鱼大神的开发课程里,有兴趣不妨一起加入学习吧。至于我设计的新版 WordPress 小程序插件,目前还在测试中,基于新版插件的艾码汇小程序已经提交审核了。
新版 WordPress 小程序 API 插件功能修改了点赞功能,可以取消点赞,增加了收藏文章功能,也可以取消收藏文章。但是广告功能,目前没有增加,以后会增加广告,内容发布(但是没有计划做投稿功能,主要是手机碎片化时间,投稿没什么意义,且排版不好),文章发布推送消息等等。