Code Fan 49

中年で開発に目覚めたおじさんの技術ブログ。WordPress・Rails・Cloud9などなど。

WordPressのfeedをphpで読みとりjQueryのajaxで静的ページに読み込ませる。

はじめに

もっぱらWP漬けの毎日です。 企業ウェブサイトの新着情報にWPのブログ記事を表示、リンクしたいという依頼があったので今回はこれです。

やりたいこと

簡単な図にしました。

f:id:koyacch:20180123112959p:plain

コード作成

1. feed.phpを使ってWPのフィード情報を読みこむ。

WPはフィードという「更新情報」を持っており、投稿またはカテゴリ毎のフィード情報をURLのみで読み出すことができます。

WORDPRESS Codexによると以下のような定義です。

フィードは、フィードリーダーがサイトにアクセスし、新規コンテンツを自動的に探し出し、その情報を別のサイトに投稿し更新できるようにする特別なソフトウェア機能です。

WordPress フィード配信 - WordPress Codex 日本語版

全ての投稿ならhttp://example.com/feed/ 特定のカテゴリならhttp://www.example.com/category/categoryname/feed

とかでOKです。便利ですね! これを使えば他のサイトにコンテンツを表示させることができます。

読み込みに使ったfeed.phpは以下のコードを使わせていただきました。 ありがとうございました。 改変せずそのまま利用しました。

github.com

2. topic.phpを使って読みこんだフィード情報をhtmlに整形。

フィード情報はxml形式なので、必要な情報を抜き取る必要があります。 上記URLに参考があります。

echo 'Title: ', $rss->title;
echo 'Description: ', $rss->description;
echo 'Link: ', $rss->link;

foreach ($rss->item as $item) {
    echo 'Title: ', $item->title;
    echo 'Link: ', $item->link;
    echo 'Timestamp: ', $item->timestamp;
    echo 'Description ', $item->description;
    echo 'HTML encoded content: ', $item->{'content:encoded'};
}

上記を参考にすればうまくいきそうです。

利用方法、改変については、以下のブログを参考にさせていただきました。 ありがとうございました。

kana-lier.com

こちらのファイルを、topic.phpとしました。

静的ページのfeed表示に必要な情報は、 [日付][カテゴリ][投稿タイトル][投稿URL]

ということで、合わせて書き換えをしております。 コードは以下です。

topic.php

<?php

// wp url
$wp_url = [ your-wordpress-url ];

// feed.phpを読み込む
require_once [ your-feed.php-path ];
$feed = new Feed ;

// topics.jsからの変数
$get_category = htmlspecialchars($_GET['feedurl'], ENT_QUOTES, 'UTF-8');

// RSSフィードURLの取得
if ( $get_category ){
    $url = $wp_url."/category/".$get_category."/feed/";
}
else{
    $url = $wp_url."/feed/";
}

$rss = $feed->loadRss( $url ) ;
$num = 10;//表示させたい件数
$i=0;

foreach( $rss->item as $item )
{
    if($i<$num){
        $title = $item->title ;  // タイトル
        $link = $item->link ; // リンク
        $category = $item->category;
        $timestamp = strtotime( $item->pubDate ) ; // 更新日時
        $description = $item->description ; // 詳細
        $description = strip_tags($description);
        $thumbnail = trim($now_url,"/") . "blog/wp-content/themes/simplicity2/images/no-image.png";//画像がない場合の指定
        if( preg_match_all('/<img([\s\S]+?)>/is', $item->description, $matches) ){
            foreach( $matches[0] as $img ){
                if ($img === reset($matches[0])) {//最初の画像にマッチしたもの
                    if( preg_match('/src=[\'"](.+?jpe?g)[\'"]/', $img, $m) ){
                        $thumbnail = $m[1];
                    }
                }
            }
        }
        // slugタグからカテゴリー取得
        if( preg_match('/<slug>[\w-]+<\/slug>/i', $item->description, $m) ){
            $slug = strip_tags($m[0]);
        }
        
        $list_data .= '<li><a href="'.$link.'"><div class="news_topic_body"><span class="date">'.date( "Y.m.d", $timestamp).'</span><span class="cat"><span class="icon '.$slug.'_icon">'.$category.'</span></span><br class="topic_br"><span class="topic_title">'.$title.'</span></div></a></li>';
        $i++;
    }
}

echo $list_data;

?>

3. フィード情報にサムネイルとカテゴリ情報を含めるようfunctions.phpに追記。

なお、WP標準では、フィードにサムネイルとカテゴリ情報がないため、WPのfunctions.phpでフックする必要があります。

functions.php追記

function rss_plus($content) {
    global $post;

    $category = get_the_category($post->ID);
    $cat_slug = $category[0]->slug;
    $content = '<slug>' .$cat_slug . '</slug>' . $content;

    if(has_post_thumbnail($post->ID)) {
        $content = '<div>' . get_the_post_thumbnail($post->ID) . '</div>' . $content;
    }
    
    return $content;
}
add_filter('the_excerpt_rss', 'rss_plus');

4. 読込をコントロールするjQueryを作成。

url open 以下は、最初にページを読み込んだ時の動作です。

  • ローディングのためのhtmlを読み込む。
  • feedはデフォルトとする。
  • ajaxでfeedをtopic.phpに渡し戻り値を表示させる。

click list 以下は、ボタン(li)をクリックした時の動作です。

  • ローディングのためのhtmlを読み込む。
  • htmlのクラス名からfeedを選択する。
  • ajaxでfeedをtopic.phpに渡し戻り値を表示させる。

func_ajaxajaxの動作をまとめています。

topics.js

$(function(){

  /////////// url open
  
  // loading html
  var loadhtml = [ your-loading-html ];

  // loading html
  $([ your-list-ul ]).html(loadhtml);
  
// default feed url
  feedset = "";

  // ajax
  
  func_ajax(feedset);

  /////////// click list
  
  // click
  $([ your-list-ul-li ]).click(function(){
    
  // loading html
  $([ your-list-ul ]).html(loadhtml);
   
  // get list class
  var btnclass = $(this).attr('class');
  var feedset = "";
  
  // branch feed
  if(btnclass == [ your-tab-all ]){
    feedset = "";
  }
  else if(btnclass == [ your-tab-cate1 ]){
    feedset = [ your-feed-cate1 ] ;
  }
  else if(btnclass == [ your-tab-cate2 ]){
    feedset = [ your-feed-cate2 ] ;
  }
  else if(btnclass == [ your-tab-cate3 ]){
    feedset = [ your-feed-cate3 ] ;
  }
  
  // ajax
  
  func_ajax(feedset);
  
  });
    
  //////////// function ajax
  
  function func_ajax(x){
    
    $.ajax({
      url: [ yout-topic.php-path ],
      data: {
        feedurl: x
      },
      dataType: 'html'
    })
    .done(function(data){
      $('.topic_list').html(data);
    })
    .fail(function(data){
      $('.topic_list').html('<li>no data</li>');
    });
    
  }

});

さいごに

.ajaxについて詳しく知らなかったので勉強できてよかった。 こちらの記事を参考にしました。ありがとうございました。

www.koikikukan.com

js.studio-kingdom.com

ほれほれ、Railsはどうしたよ。とほほ。