Vue.js を使って WP REST API で取得した他サイトの投稿データを自サイトに表示する

Vue.js と WP REST API を使って、WordPressで作られている他サイトの投稿データを自サイトに表示する方法のご紹介をします。 まず、Vue.js を読み込みます。 テーマの footer.php に次のように記述します。
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
すべてのhtml読み込みが終わってからVue.jsを読み込む必要があるので、footer部のhtmlの記述が終わった後の場所に書きましょう。
2つ目の axios というのはAPIからデータを取得したり送信したりするためのHTTPクライアントです。
単純に、APIを使うために必要、と思ってください。
さて、上のように Vue.js 関係のCDN参照宣言ができたら、そのまま続けて footer.php に次のように記述します。
<script>
var vue = new Vue({
el: "#app",
data: {
posts: []
},
created() {
axios.get('https://sample.com/wp-json/wp/v2/posts/').then(response => {
this.posts= response.data;
})
},
});
</script>
これで、https://sample.com の記事データをすべて取得できました。
あとは、取得した記事データを表示する処理を、表示したいページのテンプレートPHPに記述すれば完成です。
<div id="app">
<div v-for="post in posts">
<h3>{{ post.title.rendered }}</h3>
<div v-html = "post.content.rendered"></div>
</div>
</div>
※ 「id=”app”」の部分は、scriptに書いた「el: “#app”」と合わせましょう。
※ v-html は取得したデータをhtmlとしてはめ込みますので、XSS脆弱性を考えて、信頼できるサイトからのデータ取得だけにするようにしましょう。
これで表示したいページに https://sample.com の記事のタイトル&コンテンツのセットが記事数分表示されるはずです。
なお全記事でなく、特定の記事だけ取得したい場合は、「記事ID」を指定してあげればできます。
<script>
var vue = new Vue({
el: "#app",
data: {
posts: []
},
created() {
axios.get('https://sample.com/wp-json/wp/v2/posts/記事ID').then(response => {
this.posts= response.data;
})
},
});
</script>
もちろん1記事だけ取得なら、テンプレート側の記述のfor文でまわす処理のところはなくなりますね。
<div id="app">
<div>
<h3>{{ posts.title.rendered }}</h3>
<div v-html = "posts.content.rendered"></div>
</div>
</div>