18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

un-T factory! XAAdvent Calendar 2018

Day 22

WP Rest APIとvue.jsでお知らせを一覧を作ってみる

Last updated at Posted at 2018-12-21

#WP Rest APIとvue.jsでお知らせを一覧を作る

最近vue.jsを勉強し始めたのでWordpressとの連携を試してみたかったので
実装頻度が高そうなお知らせ一覧で作ってみようと思います。

実装環境

WP REST API(WPプラグインで投稿内容のjsonを返してくれる)
・投稿はカスタム投稿を使用します。(カスタム投稿名はnewsで設定)
・vue.jsとaxionはCDNで読み込み。

##WP側の設定
ドメイン名/news/ でアクセスされたらjsonを返すよう、functions.phpに下記の内容を記述。

functions.php
	 function get_news_feed(){
	   register_rest_route(
	     'wp/v1/', 'news', //jsonを取得するためのurlを設定
	     array(
	       'method' => 'GET',
	       'args' => array(
	         'paged' => array(
	           'default' => 1,
	           'sanitize_callback' => 'absint'
	         )
	       ),
	       'callback' => 'news_add'
	    ));
	 }

	 function news_add() {
		$result = array();

		$query = new WP_Query(array(
			'post_type' => 'news', //設定済みのカスタム投稿名
			'posts_per_page' => 3 // 表示数
		));

		$items = array();//投稿情報を格納するための配列を作成
		while($query->have_posts()) {
			$query->the_post();
			$item = array();
            // 表示させたい内容をを配列に入れていく
			$item['title'] = get_the_title();//タイトル名
			$item['date'] = get_the_time("Y.m.d");//日付
			$item['permalink'] = get_the_permalink();//個別記事のリンク
			$item['content'] = mb_substr(strip_tags(get_the_content()), 0, 120, 'UTF-8');//記事本文
			$item['thumbnail'] = get_the_post_thumbnail_url(
				get_the_ID(), 'news_list'); //サムネイル画像
			$items[] = $item;
			}
			$result['items'] = $items;
			return $result;
	}

wp側の設定は以上。

JS側の設定

適当なファイル名で作成(今回はnewsfeed.js)

newsfeed.js
new Vue({
  el: '#newsFeed',
  data: {
    items: []//カスタム投稿の内容を入れる変数を用意
  },
  created: function created() {
    axios.get('https://example/news/').then(function (response) {
      // 取得完了したらlistリストに代入
      this.items = response.data;
    }.bind(this)).catch(function (e) {
      console.error(e);
    }.bind(this));
  }
})

html側の設定

作成したJSファイルの読み込み

<script src="newsfeed.js"></script>

vue.jsの読み込み

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>

axioxの読み込み

<script src="https://cdn.jsdelivr.net/npm/axios@0.17.1/dist/axios.min.js"></script>

後は表示させたい箇所でJSで受け取った値をリストで表示するための記述をして実装完了。

index.html
<div id="newsFeed">
	<div v-for="item in items" class="news_list_item">
		<a v-bind:href="item.permalink">
			<div class="news_list_img"><img v-bind:src="item.thumbnail" alt=""></div>
			<h3 class="news_list_title">{{ item.title }}</h3>
			<time class="news_list_time">{{ item.date }}</time>
			<div class="news_list_txt newsBar">{{ item.content }}</div>
			<span class="news_list_link din_bold">READ MORE...</span>
		</a>
	</div>
</div>

終わり

今回一覧のみのシンプルな実装ですが、さらに使えるようになり要件に沿った実装ができたらと
いいなーと思いました。

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?