Vue.js 是一套构建用户界面(user interface)的渐进式前端框架,因为 Vue.js 的核心库只专注于视图层,Vue.js 没有内置的 HTTP API,如果我们需要与服务器进行交互,我们必须引入第三方的 API,Vue.js 官方推荐的 HTTP 库是 Asios。Axios 是一个伟大的 HTTP 客户端库。它默认使用 promises 并在客户端和服务器上运行(这使得它适合于在服务器端渲染期间获取数据)。Asios 很容易与 Vue.js 一起使用,从 WordPress Rest API 获取数据,然后通过 Vue.js 展示出来。下面我们就举例说明,如何使用 Vue.js 和 Axios 与 WordPress Rest API 进行交互,获取和提交数据。
下面的示例中,使用了基于 Vue.js 的 Element UI 实现前端界面样式,如果你熟悉其他前端框架,也可以使用其他框架(如 BootStrap)来实现前端界面样式,效果是一样的。
使用 Vue.js 和 Axios 从 WordPress Rest API 获取数据并展示
下面的代码通过 Rest API 获取了 WordPress 的最新文章并以卡片的方式显示在前端。
[wprs_c-alert type=”info” content=”下面的代码是从一个 Vue.js 单文件组件中直接复制出来的,直接粘贴到页面中,不会显示任何内容,需要手动挂载到 “#APP” 上或者通过 Vue Router 挂载才能显示文章到页面中。” /]
<template>
<el-row v-if="posts && posts.length">
<el-col :span="8" v-for="post of posts">
<el-card :body-style="{ padding: '0px' }">
<div style="padding: 14px;">
<span>{{post.title.rendered}}</span>
<div class="bottom clearfix">
<time class="time">{{ post.modified }}</time>
<el-button type="text" class="button">操作按钮</el-button>
</div>
</div>
</el-card>
</el-col>
</el-row>
</template>
<script>
// 首先导入 axios 库
import axios from 'axios';
export default {
data: () => ({
posts : [],
errors: []
}),
// 组件创建后获取数据,如果获取成功,设置 posts 数据,如果失败,设置错误数据
created() {
axios.get('http://abc.dev/wp-json/wp/v2/posts')
.then(response => {
this.posts = response.data
})
.catch(e => {
this.errors.push(e)
})
}
}
</script>
使用 Vue.js 和 Axios 提交表单数据到 WordPress Rest API
下面的示例是一个基本的 WordPress 前端投稿 表单,用户点击 “立即投稿” 后,会通过 Rest API 发布一个状态为草稿的文章到 WordPress 后台。通过 Rest API 到 WordPress 后台需要验证才能提交,因为是在同一个站点提交数据,我们使用最基本的 “Nonce” 验证方法即可。这种方法首先需要设置 nonce 随机数到前端,以便 Axios 库使用。先加入以下代码到 WordPress 的 functions.php 文件中。
add_action( 'wp_enqueue_scripts', 'rest_theme_scripts' );
function rest_theme_scripts() {
wp_localize_script( 'jquery', 'wp', [
'nonce' => wp_create_nonce( 'wp_rest' ),
] );
}
上面的代码会设置一个名称为 “wp” 的 JavaScript 对象到页面的 head 中,然后在下面我们就可以通过 wp.nonce
访问 WordPress 后台生成的这个随机数了,把这个随机数加入到 Axios 的 http header 中,Rest API 会对这个随机数进行验证,如果验证一致,就可以保存提交的数据了,如果验证不通过,则返回错误信息。
<template>
<el-form ref="form" :model="form" label-width="80px">
<el-c-alert v-if="message.show" :title="message.title" :type="message.type"></el-c-alert>
<el-form-item label="文章标题">
<el-input v-model="form.title"></el-input>
</el-form-item>
<el-form-item label="文章摘要">
<el-input type="textarea" v-model="form.excerpt"></el-input>
</el-form-item>
<el-form-item label="文章内容">
<el-input type="textarea" v-model="form.content"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即投稿</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</template>
<script>
import axios from 'axios';
// 设置 axios 全局 header nonce 数据,用于 WordPress REST Api 验证,
// 如果没有这个,提交数据时,会因为权限验证失败而提交不了
axios.defaults.headers.post['X-WP-Nonce'] = wp.nonce;
export default {
data() {
return {
form : {
title : '',
excerpt : '',
content : '',
},
message: {
title: "",
type : "",
show : false
}
};
},
methods: {
onSubmit() {
axios.post('http://abc.dev/wp-json/wp/v2/posts', {
title : this.form.title,
excerpt : this.form.excerpt,
content : this.form.content,
})
.then(response => {
this.message.title = "保存成功";
this.message.type = "success";
this.message.show = true;
})
.catch(e => {
this.errors.push(e)
});
}
}
};
</script>
上面的代码中,用户提交成功后,会显示一个提交成功的提示消息。为了精简文章的篇幅,没有把提交失败的处理方法贴出来,所以如果提交失败,不会有任何提示。有需要的朋友可以自行实现一下。
创建通用的 http 模块,方便在各个模块中调用
为了方便在多个模块直接调用数据,我们还可以编写一个通用的 http 模块,在其他模块使用时,直接引入这个模块即可。如下:
<script>
import axios from 'axios';
export const HTTP = axios.create({
baseURL: `http://jsonplaceholder.typicode.com/`,
headers: {
Authorization: 'Bearer {token}'
}
})
</script>
在其他模块使用时:
<script>
import {HTTP} from './http-common';
export default {
data: () => ({
posts: [],
errors: []
}),
created() {
HTTP.get(`posts`)
.then(response => {
this.posts = response.data
})
.catch(e => {
this.errors.push(e)
})
}
}
</script>
熟悉上上面的开发方法以后,在 WordPress 前端页面获取提交数据都可以直接通过 WordPress Rest API 进行,只要熟练 JavaScript,完全可以结合 WordPress 做一个功能丰富,界面漂亮的应用了,比如 WordPress 使用者经常寻找的前端用户中心,甚至基于WordPress 的购物车订单系统等,都可以通过本文介绍的方法进行开发。
11 thoughts on “使用 Vue.js 和 Axios 与 WordPress Rest API 交互-获取或提交WordPress数据”
Vue.js 目前非常火,新东西太多; 前端 停留在(JQuery+CSS)蒸气时代的我,感觉有点跟不上时代
直接看一下官方文档,做一个项目就掌握了,其实没多少东西。
你可以试一下这个源码,简单上手,使用 Vue.js 结合 WordPress 的源码,功能全面,具有完整的例子,GitHub 源码地址:https://github.com/crlang/VueWPress
站长有完整的例子吗?我是新手,想找个完整的例子参考一下。
完整的例子文件比较多,你要的话,加一下我的 QQ,发给你看一下。
发现一个使用 Vue.js 结合 WordPress 的源码,功能全面,具有完整的例子,GitHub 源码地址:https://github.com/crlang/VueWPress
看着不错,已收藏,有空了看看。
前段时间正好也对这种用法挺感兴趣的 就顺手翻了一篇教程 感兴趣的朋友可以看看
使用Vue.js在WordPress中创建单页面应用SPA
http://t.cn/EfY98kS
哇,这篇文章写的太好了,我将来一定能用上。谢谢啦。
我转载了一下:
https://www.npc.ink/11922.html
你好,请问axios.defaults.headers.post[‘X-WP-Nonce’] = wp.nonce;报错是怎么回事呢
wp 全局变量需要 php 生成,如果你做的是 spa 应用,这个变量是不存在的,这种情况下可以使用 JWT 方法验证。/wc-api/wprs-wc-alipay-return/ 是 url rewrite 后的页面,实际上是没有这个文件夹的。