管理画面を使わず、Vue.js と WP REST API を使って、Webページから直接記事データ等を更新する

WP REST API を使えばWebページから直接WordPress製サイトの記事データを更新することもできます。
ただしセキュリティ的には推奨されませんので、本記事の内容は社内システムのようにIPアドレスなどでアクセス制限されたWebサイトだけを対象とします。
その点だけご注意ください。
それでは具体的に、WordPressで制作された sample.com というサイトの記事ID:99の記事のタイトルを、Vue.js と WP REST API を使って別のサイトから更新してみます。
まず、更新される側のサイトsample.com で
sample.com/wp-json/myrest/v1/update/記事ID
に対して投げられたPOSTを受けてタイトルを更新するための REST API を新規で登録します。
テーマのfunctions.php に以下のように追加します。
/* REST APIの定義 */
add_action( 'rest_api_init', 'add_custom_endpoint' );
function add_custom_endpoint() {
register_rest_route( 'myrest/v1', '/update/(?P<id>d+)', [
[
'methods' => 'POST',
'permission_callback' => function() {
return true; // ※ ここをtrueで返すことで誰でも更新できるようになります
},
'callback' => function( WP_REST_Request $request ) {
$title = $request->get_param( 'title' );
$id = $request['id'];
$result = wp_update_post( [
'ID' => $id,
'post_type' => 'post',
'post_status' => 'publish',
'post_title' => $title
], true );
if ( is_wp_error( $result ) ) {
return $result;
} else {
return new WP_REST_Response( get_post( $result ) );
}
}
],
] );
}
この要領で、REST API はいくつでも追加できます。
これで sample.com 側の受け皿はできましたので、次は出し側のほうです。
Vue.js を使って WP REST API で取得した他サイトの投稿データを自サイトに表示する
を参考にしながら Vue.js のCDN参照の宣言をします。
そして、そのすぐ下に次のようにjavascriptを書きます。
<script>
var vue = new Vue({
el: "#app",
data: {
theTitle
},
methods: {
editPost: function() {
axios.post('https://sample.com//wp-json/myrest/v1/update/99', {
title: this.theTitle
})
.then(response => {
console.log(response)
})
.catch(error => {
console.log(error.response)
});
},
},
});
</script>
最後に入力のhtmlを以下のように書きます。
<input type="text" v-model="theTitle" >
<button type="button" v-on:click="editPost">更新</button>
これで、input にテキストを入れて「更新」ボタンを押すと、sample.com というサイトの記事ID:99の記事のタイトルが入力されたテキストの内容に更新されます。