WordPress 小程序通过 XML_RPC 实现发布文章详细教程

2018年12月15日 3933点热度 0人点赞 5条评论

上一次写了一篇《通过 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 插件功能修改了点赞功能,可以取消点赞,增加了收藏文章功能,也可以取消收藏文章。但是广告功能,目前没有增加,以后会增加广告,内容发布(但是没有计划做投稿功能,主要是手机碎片化时间,投稿没什么意义,且排版不好),文章发布推送消息等等。

WPTalk

这个人很懒,什么都没留下

文章评论

  • Propitiator

    评论一下

    2018年12月20日
  • Propitiator

    评论一下

    2018年12月20日
  • Propitiator

    情况

    2018年12月20日
  • Cash

    框架

    2019年1月25日
  • Cash

    加起来

    2019年1月25日
  • 您需要 登录 之后才可以评论