• 解決済 kuroara

    (@kuroara)


    サブディレクトリで2つのWordpressを入れています。それをルートドメインの静的トップページに、更新時系列順に載せたいと思っています。

    example.com/index.html ←ここに
    example.com/wp01/ ←これと
    example.com/wp02/ ←これのポストを、個々にではなく合わせて時系列順に更新情報として載せたい

    載せたい情報は、タイトルとリンク、サムネイル画像(アイキャッチではなく、最初の画像のリサイズされたサムネイル)です。

    最初、Google Feed APIでやってみたのですが、RSSにアイキャッチを追加する方法はあるようなのですが、サムネイルは見つかりませんでした。(以前はサムネイル=アイキャッチだったようで、検索してもアイキャッチ関連ばかり出てきます)

    WP JSON APIを使う方法があるようで、wp-json/postからIDを取り出してwp-json/mediaでサムネイルを取り出せば良いような気もするのですが、情報が少なく、とても私にはできそうもありません。複数のWordpressを合わせる方法も解決できそうもないです。

    何か良い方法はないでしょうか?

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • いろいろ方法はあるだろうけれどJSON APIを使う場合、記事内の1枚目の画像をそのまま サムネイル として挿入するなら(js頑張って書けば)PHPは弄ることなくクライアント側の処理は書けそう。(ソートはArray.sortで出来るはず。)

    ただし記事内にはサムネイル以外のサイズ(w300とか)で挿入していてサムネイルとしては150×150のthumbnailを使いたい、という場合は一癖いるっぽくて画像URL→アタッチメント→サムネイルURL をAPI側でやれるように拡張してやる必要がある(?)

    @kuroara さん

    WordPress も、静的ページも、同一ドメインですよね? ということは、データベースも同一でしょうか?

    …とても私にはできそうもありません…

    ということなら、無理して REST API や RSS を使わなくてもできますが、残念ながら、いずれにしても、プログラムを書かなければ実現はできないと思います。サムネール・イメージの条件を考えたら、直接データベースに問い合わせるのが簡単なような気がしますが、とりあえず、「WP JSON API」で検索したら、最上位にきた「WP REST API」を使った場合の雛形をつけます。マークアップは適当なので、お好きにどうぞ。

    「サムネール」は「投稿本文の中で最初に現れる <img src="..."> の…をそのまま使ってます。何も考えずに投稿にイメージを挿入すれば、リサイズされたイメージがここにきているはずなので。しかし、条件によってはオリジナルサイズのイメージが来てしまうかもしれません。

    この場合には、jQuery.getJSON() のコールバック関数が受け取るデータに投稿 ID が含まれているので、それを使って再び問い合わせをしなければなりません。完全な照合のためにはメタデータが必要で、このときは、認証が必要になります。あるいは、imgUrl 変数に入っているファイル名を決め打ちで書き換えるという手もありますが、テーマを変えただけで整合性を失いますので、お勧めではありません。

    プラグインを書き換えるのはどうか? 基本的に WordPress ですから、データを作るのに、WP_Query、WP_JSON_Response クラスを使っています。ということは、pre_get_posts フックを途中で実行するはずなので、メタクエリを追加すれば目的のデータを飛ばすことができます。この場合、フックだけではなくて、JavaScript も変更しなければなりません。外部に公開している API だというのと、プラグインをアップデートしたときに変更が消えるというのがいまいちなので、やってません。

    <script>
      (function($) {
          var items = [];
          $.when (
              $.getJSON("http://example.com/wp01/wp-json/posts", function(data) {
                  $.each(data, function(key, value) {
                      if ((/<img(.|\s)*?>/i).test(value.content)) {
                          var imgTag = value.content.match(/<img(.|\s)*?>/i)[0];
                          var imgUrl = imgTag.match(/src=["'](.*?)["']/i)[1];
                      }
                      items.push({title: value.title, link: value.link, img: imgUrl, date: value.date});
                  });
              }),
              $.getJSON("http://example.com/wp02/wp-json/posts", function(data) {
                  同じ繰り返し;
              })
          ).done(function() {
              items.sort(function(a, b) {
                  return a.date - b.date;
              });
              var container = $("<div>", {
                  "class": "post-container"
              });
              $.each(items, function(key, value) {
                  var subContainer = $("<div>", {
                      "class": "sub-container"
                  });
                  var titleTag = $("<h2>", {
                      "class": "post-title"
                  });
                  var linkTag = $("<a>", {
                      href: val.link,
                      text: val.title
                  });
                  titleTag.append(linkTag);
                  subContainer.append(titleTag);
                  if (val.img !== 'undefined') {
                      var imgTag = $("<img>", {
                          src: val.img
                      });
                      subContainer.append(img);
                  }
                  container.append(subContainer);
              });
              $("body").append(container);
          });
      })(jQuery);
    </script>
    トピック投稿者 kuroara

    (@kuroara)

    Hinaloeさん、kjmtshさん、投稿ありがとうございます!

    kjmtshさん、詳しく雛形までありがとうございます。まさしく、WP REST APIです。
    ですが・・・何も表示されません・・・
    $.getJSON を一つにして、).done(function() {以下を、他のサイトで見つけたコードにすると表示されるので、$.each のところが上手くいっていないのか何かわからないのですが・・・せっかく記載していただいたのに本当に申し訳ないです。

    wp01とwp02のデータベースは別です。ドメインは全て同じで、example.comのサブディレクトリにある状態です。なるほど、データベースから直接取り出す、と言う方法もあるのですね!調べてみます。

    「サムネール」は「投稿本文の中で最初に現れる <img src=”…”> の…をそのまま使ってます。何も考えずに投稿にイメージを挿入すれば、リサイズされたイメージがここにきているはずなので。

    ここの部分ですが、wp-json/postsの、”content”:に出てくる部分だと思っているのですが、私の場合、ここには投稿したサイズ(フルサイズで投稿しているのでフルサイズ)が出てきます。アイキャッチを設定すれば、”featured_image”:が出てきて、アイキャッチ(=サムネイルサイズの画像)を取得できるのですが。
    なので、wp-json/mediaとの合わせ技とか、Hinaloeさんが仰るような方法で、js頑張って書かないとできないのかな・・・と思っていたのです。

    いずれにせよ、そんなに簡単にはいかないという事ですね。
    WP REST API はWordpessに今後実装されるそうなので、そうすると色々と情報も出てくるかと思うのでそれを待つことにします。

    WP JSONだと色々な情報を取り出せるので今後を考えても使ってみたかったのですが・・・RSSの方で色々していたら、サムネイル画像を追加することができました。
    functions.phpに $content = wp_get_attachment_image( $thumb[1],'thumbnail' ) . get_the_content(); としましたら一枚目画像のサムネイルを追加できました。とりあえずこれで対応します。

    こんな初歩的な質問にお答えくださりどうもありがとうございました。

    モデレーター gatespace

    (@gatespace)

    kjmtshさんとは異なるアプローチですが、WP REST API使ったデモとソースを公開してますので参考にどうぞ。

    デモ
    http://ja.demo.media-assembly-kit.com/mak-simple/

    ソース一式
    https://github.com/megumiteam/media-assembly-kit-simple-template

    なお、WP REST APIは最新バージョンでJSONPに対応しているはずなので、別ドメインでもいけるはずです(ただし、個人的に検証していません)

    トピック投稿者 kuroara

    (@kuroara)

    お礼が遅くなり申し訳ございません。
    結局Google Feed APIを使っていますが、画像があるからか取得するのに若干時間がかかったりでやっぱりWP REST APIを使ったほうがスマートなのかな…?とも思ってます。

    デモ教えていただきありがとうございます。やっぱり私には難易度高そうですが…参考にさせていただきます!

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「静的サイトにWordPressの更新情報をサムネイル付きで載せたい」には新たに返信することはできません。