外部からWordPressの記事を読み込む方法まとめ【複数WP、別サーバー対応】

こんにちは、katori@xxbicottです。
この間、WordPress外の静的ページから複数のWordPressの新着記事を取得するロジックを書く機会がありました。
サクッと見つけたwp-load.phpを使う方法で対処しようとしたところ、複数のWPでは無理ということが判明。

そこからそもそもWP外からWP記事を取得するのはどんな方法があるのかな〜と思い、ひとつのWPだけを取得する方法から別サーバーの複数のWPを取得する方法まで、色々と調べてまとめてみました!
参考になれば幸いです。

同一サーバ内にあるWPの記事を取得する

例えばコーポレートサイトで、TOP含め他ページは静的ページ、ブログだけWPという構成は結構ありますよね。
このような構成で「TOPページにブログの新着記事を表示させたい」といった、取得先のWPと静的ページ双方が同サーバー内の場合に使える方法を最初に紹介したいと思います。

※ちなみに同じサーバーであればドメインは別でも問題ありません。

調べたところ、読み込むWPの数によって主に2つの方法があります。

wp-load.phpを使う方法

読み込みたいWPが一つだけの時に使える方法です。

記事を取得・表示させたい静的ページの上部に次の一行をいれれば、通常のWPテンプレートと同じようにWPテンプレートタグを使用することができます。

require_once(  './blog/wp-load.php' );

wp-load.phpはWPインストールディレクトリ直下に存在。上記は/blog/がWPインストールディレクトリで、その上の階層に静的ページを設置している場合

記事を取得・出力するサンプルはこちら。

<?php
require_once($_SERVER['DOCUMENT_ROOT']. '/blog/wp-load.php' );

$args = array(
	'post_type' => 'post',
	'post_status' => 'publish',
	'orderby' => 'post_date',
	'order' => 'DESC'
);
$the_query = new WP_Query($args);

if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post();

	echo '<li>'.get_the_time('Y/m/d g:i').' : <a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';

endwhile;endif;
wp_reset_postdata();
?>

wp-load.phpではなくwp-blog-header.phpを読み込む方法も見かけたりしますが、wp-blog-header.phpの中身を見るとわかる通りwp-load.phpを読み込んで機能を使っています。

加えて、wp-load.phpの他に読み込んでいるtemplate-loader.phpが悪さをしてエラーになることがある模様。

「template-loader.php」は「投稿ページ = single.php」「固定ページ = page.php」「一覧ページ = archives.php」といった現在表示中のページに合わせたテーマファイル(テンプレート)を選んで表示させる役割があります。

そのため、WPの外にある静的ページはテーマファイルではないと認識され、WPとしてはそんなものは存在してないよ!となるため404エラーが発生するようです。

引用元)wp-blog-header.phpをインクルードしたページが404エラーになった時の対処法

ということで、wp-load.phpを読み込むようにしましょう。

ここで注意したいのは「wp-load.phpは1つしか読み込めない」ということ。
複数読み込んでも、残念ながら最初のwp-load.phpで読み込んだWPの内容しか取得できません。
読み込みたいWPがひとつのときに使いましょう。

ポイント
  • 取得できるWPは1つだけ
  • 取得先のWPと静的ページ双方が同一サーバ内であること
  • WPテンプレートと同じ要領でコードを書ける(WPテンプレートタグが使える)

DBに接続して取得する方法

読み込みたいWPが複数でも使える方法です
サンプルではPDOを使ってDBに接続しています。

<?php
try{
$dbh = new PDO("mysql:host=localhost; dbname=database; charset=utf8", "root", "password");
$stmt = $dbh->query('SELECT post_date,post_modified,post_title,guid
	FROM wp_posts
	WHERE post_status = "publish"
	AND post_type = "post"
	ORDER BY post_date DESC
	LIMIT 5');
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

}catch (PDOException $e){
	echo('Error:'.$e->getMessage());
	die();
}
// 接続を閉じる
$dbh = null;

// 出力
echo '<ul>';
foreach ($data as $key => $value) {
	echo '<li>'.$value["post_date"].' : '.$value["post_title"].'</li>';
}
echo '</ul>';
?>

複数のWPから取得する場合は、上の要領で他のDBにPDO接続→結果を取得してきて、結合・ソートしてから出力すればOK。

// 結合
$array = array_merge($data, $data2);
// ソート(post_date降順の場合)
array_multisort( array_map( "strtotime", array_column( $array, "post_date" ) ), SORT_DESC, $array );
ポイント
  • 取得するWPは複数でもOK
  • 取得先のWPと静的ページ双方が同一サーバ内であること
  • DBに関する知識が必要

別サーバーのWPの記事を取得する

例えば外部のサイトの記事を集めて表示させたいという時はこちら。
取得したいWPが別のサーバーの場合、WPのRSSフィードを取得する方法が中心になるようです。ここではフィードを取得する方法の違いで2つ紹介したいと思います。

fetch_feed()を使ってフィードを読み込む方法

WPの機能である fetch_feed() を使ってフィードを取得する方法です。
fetch_feedは外部のRSSフィードを取得して解析する関数で、参照する前にwp-includes/feed.phpを読み込む必要があります。

WPではテンプレートでそのまま使うことができるし、WP外の静的ページでは先ほどのwp-load.phpを読み込めば同じ要領で使うことが可能。
ただし仕組みの都合上静的ページと同じサーバー内にWPがある必要があります

サンプルはこちら。

<?php
require_once( './wp-load.php' );
include_once( ABSPATH . WPINC . '/feed.php' );
$feeduri = 'https://example.com/blog/feed/';
$rss = fetch_feed($feeduri);

if (!is_wp_error($rss)) {
	$maxitems = $rss->get_item_quantity(10);//件数
	$rss_items = $rss->get_items( 0, $maxitems );
}

// 出力
echo '<ul>';
foreach ( $rss_items as $item ) :
	echo '<li>'.date('Y/m/d',strtotime( $item->get_date() )).'<a href="'.$item->get_permalink().'">'.$item->get_title().'</a>';
endforeach;
echo '</ul>';
?>
ポイント
  • 静的ページと同じサーバーにWPが入っている(wp-load.phpを呼び出せる環境である)こと
  • 取得するWPは複数でもOK
  • 情報が多いので調べやすい
  • 取得できる情報はSimplePie_Itemオブジェクトのメソッド参照

ライブラリを使ってフィードを読み込む方法

こちらは同じサーバーにWPがなくても使える方法。
ここではRSSフィードを解析するライブラリ 「RSS & Atom Feeds for PHP」 を使用して、RSSを取得・解析を行っています。

<?php
header('Content-Type: text/html; charset=utf-8');
date_default_timezone_set('Asia/Tokyo');

require_once './Feed.php';

$rss = Feed::loadRss('https://example.com/blog/feed/');

echo '<ul>';
foreach ($rss->item as $itemc) {
	$pubDate = date('Y/n/j', strtotime( $itemc->pubDate));
	$link = $itemc->link;
	$title = $itemc->title;
	echo '<li>'.$pubDate.' : <a href="'.$link.'">'.$title.'</a></li>';
}
echo '</ul>';
?>
ポイント
  • 動作は重め
  • 操作がシンプルで使いやすい
    操作方法は「RSS & Atom Feeds for PHP」参照
  • 取得できる情報はフィードに出力されているもののみ

さいごに

wp-load.phpを使ってサイトの一部だけWordPress化しているサイトはいくつか見かけたことがあるんですが、使ったのは初めて。
こんな便利なものがあったのか!と驚きつつ、複数サイトで使えるようになったら最高なのになぁとも感じました_(┐「ε:)_

ちなみに、私が調べていた「同じサーバーのWordPress外の静的ページから複数のWordPressの新着記事を取得する」方法に関しては、個人的にDB接続が手っ取り早くて一番便利だなぁと思いました。

環境に合わせた方法で試してみてください!

参考サイト