Vue.jsとWordPressApiを利用しwebサイトを作りました。

作成したwebサイト

withレイクタウンというサイトを作成しました。


基本的な作りは以下のページをご参照下さい。

main.vueに手を入れています。

WordPressApiの利用

記事自体はwordpressで作成していています。

トップ画面はvue.jsで作成しており、WordPressAPIで記事の情報を取得してトップ画面に「お勧め情報」や「新着情報」を表示しています。

以下のリクエストでwordpressで作ったサイトのjsonデータを取得できます。

http://{ドメイン}/wp-json/wp/v2/posts?

お勧め記事の取得

WordPressAPIは条件を指定して情報を抽出することも出来ます。カテゴリーを条件に記事の情報を取得します。
記事に「PICUP」というカテゴリーを追加し、そのカテゴリーの記事を取得します。

アイキャッチ画像を取得するために「_embed」の条件を付けます。

また、categories=n で指定したカテゴリーの記事を抽出することが出来ます。

「PICUP」というカテゴリーをアイキャッチ画像付きで取得するURLは以下になります。

https://www.with-laketown.com/wp-json/wp/v2/posts?_embed&categories=5

created()メソッドはVueインスタンスが作成された直後に呼ばれます。

また、 axiosを使用することで非同期通信を実施することができます。

非同期で「PICUP」カテゴリー記事を取得しに行っています。

  created() {
       // axiosで非同期通信を実施
      axios.get('https://www.with-laketown.com/wp-json/wp/v2/posts?_embed&categories=5')
      .then(resp => {
          // 返却されたjsonをpickUpList[]に格納
          this.pickUpList = resp.data;

          this.pickUpImage[0] = resp.data[0]['_embedded']['wp:featuredmedia'][0]['source_url'];
          this.pickUpImage[1] = resp.data[1]['_embedded']['wp:featuredmedia'][0]['source_url'];
          this.pickUpImage[2] = resp.data[2]['_embedded']['wp:featuredmedia'][0]['source_url'];
  
      })

返却されたjsonデータは配列pickUpList[]に格納しています。

this.pickUpList = resp.data;

注意点ですが、アイキャッチ画像についてはHTMLの中で取得することが出来なかったので、 created()メソッドの中でjson構造を辿って取得しています。

 this.pickUpImage[0] = resp.data[0]['_embedded']['wp:featuredmedia'][0]['source_url'];

取得したデータは<template>内で使用できます。

<h1 class="new-info">お勧め情報</h1>

<slick ref="slick" :options="slickOptions" class="slick-outer">
  <div><a v-bind:href="pickUpList[0].link" class="slick-text"><img :src="pickUpImage[0]" class="slick-img">{{pickUpList[0].title.rendered}}</a></div>
  <div><a v-bind:href="pickUpList[1].link" class="slick-text"><img :src="pickUpImage[1]" class="slick-img">{{pickUpList[1].title.rendered}}</a></div>
  <div><a v-bind:href="pickUpList[2].link" class="slick-text"><img :src="pickUpImage[2]" class="slick-img">{{pickUpList[2].title.rendered}}</a></div>
</slick>

記事のURLリンクは pickUpList[0].link で取得しています。

記事のタイトルは pickUpList[0].title.rendered で取得しています。

Vue.jsのvue-slickを利用しお勧め記事をカルーセルスライダーで表示させています。

レイクタウン情報

Flexboxのcssで作っています。記事をカテゴリーで抽出したwordpressのページに遷移します。

<div class="parent">
  <div class="contents-box border">
    <a href="https://www.with-laketown.com/category/%e3%83%9f%e3%83%ab%e3%82%af%e3%83%ab%e3%83%bc%e3%83%a0-%e3%82%ad%e3%83%83%e3%82%ba%e3%83%88%e3%82%a4%e3%83%ac/">
      <img src="static/img/baby.png" alt="baby" class="contents-img">
    </a>
    <h2 class='subtitle'>ミルクルーム/キッズトイレ</h2>
  </div>
            	
  <div class="contents-box border">
    <a href="https://www.with-laketown.com/category/%e7%84%a1%e6%96%99%e9%81%8a%e3%81%b3%e5%a0%b4/">
      <img src="static/img/free.png" alt="free" class="contents-img">
    </a>
    <h2 class='subtitle'>無料で遊べるスペース</h2>
  </div>
        
  <div class="contents-box">
    <a href="https://www.with-laketown.com/category/%e4%be%bf%e5%88%a9%e6%83%85%e5%a0%b1/">
      <img src="static/img/info.png" alt="info" class="contents-img">
    </a>
    <h2 class='subtitle'>耳寄り情報/便利情報</h2>
  </div>
</div>

新着記事

WordPressAPIで per_page=n を指定することで取得するデータ数を指定できます。

per_page=3 とし、最新の3記事の情報を取得します。

https://www.with-laketown.com/wp-json/wp/v2/posts?_embed&per_page=3

      axios.get('https://www.with-laketown.com/wp-json/wp/v2/posts?_embed&per_page=3')
      .then(resp => {
          this.list = resp.data;
          console.log(this.list);

          this.image[0] = resp.data[0]['_embedded']['wp:featuredmedia'][0]['source_url'];
          this.image[1] = resp.data[1]['_embedded']['wp:featuredmedia'][0]['source_url'];
          this.image[2] = resp.data[2]['_embedded']['wp:featuredmedia'][0]['source_url'];
          
          for (var i =0; i<3 ;i++){
            var str = resp.data[i]['excerpt']['rendered'];
            var str2 = str.slice( 3 ) ;
            this.text[i] = str2.slice( 0,-5 ) ;
          }

      })

resp.data[i][‘excerpt’][‘rendered’] で記事の抜粋を取得していますが、前後に不要なタグが入っているので slice を利用し文字列を除去しています。

<h1 class="new-info">新着記事</h1>

  <div class="new-parent">
      
    <div class="newtopic-box">
      <div>
      <a v-bind:href="list[0].link" class="slick-text">
        <div class="newtopic-img">
          <img :src="image[0]" class="slick-img">
        </div>
        <div class="newtopic-title">
          <h3>{{list[0].title.rendered}}</h3>
          <p>{{text[0]}}</p>
        </div>
      </a>
      </div>
    </div>
            	
    <div class="newtopic-box">
      <div>
        <a v-bind:href="list[1].link" class="slick-text">
          <div class="newtopic-img">
            <img :src="image[1]" class="slick-img">
          </div>
          <div class="newtopic-title">
            <h3>{{list[1].title.rendered}}</h3>
            <p>{{text[1]}}</p>
          </div>
        </a>
      </div>
    </div>

    <div class="newtopic-box">
      <div>
        <a v-bind:href="list[2].link" class="slick-text">
          <div class="newtopic-img">
            <img :src="image[2]" class="slick-img">
          </div>
          <div class="newtopic-title">
            <h3>{{list[2].title.rendered}}</h3>
            <p>{{text[2]}}</p>
          </div>
        </a>
      </div>
    </div>

まとめ