はじめに
同一サーバー上に複数のWordPressサイトを設置している場合、「あるサイトの新着記事を、別のサイトでも一覧表示したい」というケースは少なくありません。
そこで、独自のショートコードを使用し、別インストールのWordPressデータベースから直接データを取得・表示する仕組みを構築します。
複数のサイトから記事を一括取得し、投稿日時の新しい順にマージして表示します。
この記事では、この方法について説明します。
使用方法
以下にショートコードを示します。
[my_external_posts]
| オプション | 説明 | 値 | 初期値 |
|---|---|---|---|
| count | 投稿数 | 5 |
実装手順
以下の手順で実装します。
- ラベルwp-config.phpから情報を取得
別のWordPressのデータベースにアクセスするには、wp-config.phpに記述されているデータベース接続情報が必要で。
// サイト1の接続情報 define('EXT_SITE1_DB_NAME', 'db_site_a'); define('EXT_SITE1_DB_USER', 'user_site_a'); define('EXT_SITE1_DB_PASSWORD', 'pass_site_a'); define('EXT_SITE1_DB_HOST', 'localhost'); define('EXT_SITE1_DB_PREFIX', 'wp_'); define('EXT_SITE1_URL', 'https://a.com'); // サイト2の接続情報 define('EXT_SITE2_DB_NAME', 'db_site_b'); define('EXT_SITE2_DB_USER', 'user_site_b'); define('EXT_SITE2_DB_PASSWORD', 'pass_site_b'); define('EXT_SITE2_DB_HOST', 'localhost'); define('EXT_SITE2_DB_PREFIX', 'wp_'); define('EXT_SITE2_URL', 'https://b.com'); - ラベルPHPを追加
以下のコードをfunctions.phpに追加します。
add_shortcode('my_external_posts', function ($atts) { $atts = shortcode_atts([ 'count' => 5, ], $atts); // 接続対象となるサイトの情報 $target_sites = [ [ 'db' => EXT_SITE1_DB_NAME, 'user' => EXT_SITE1_DB_USER, 'pass' => EXT_SITE1_DB_PASSWORD, 'host' => EXT_SITE1_DB_HOST, 'pref' => EXT_SITE1_DB_PREFIX, 'url' => EXT_SITE1_URL, ], [ 'db' => EXT_SITE2_DB_NAME, 'user' => EXT_SITE2_DB_USER, 'pass' => EXT_SITE2_DB_PASSWORD, 'host' => EXT_SITE2_DB_HOST, 'pref' => EXT_SITE2_DB_PREFIX, 'url' => EXT_SITE2_URL, ], ]; $merged_posts = []; // 各サイトのデータベースを巡回 foreach ($target_sites as $site) { // 巡回中のサイト情報を使って、新しくデータベース接続 $external_db = new wpdb($site['user'], $site['pass'], $site['db'], $site['host']); $external_db->prefix = $site['pref']; // 公開済み(publish)の通常の投稿(post)を投稿順に取得 $query = " SELECT ID, post_title, post_date FROM {$external_db->prefix}posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC LIMIT %d "; $results = $external_db->get_results( $external_db->prepare($query, intval($atts['count'])) ); // データベースから記事が正常に取得できた場合 if (!empty($results)) { foreach ($results as $post) { $post->site_url = $site['url']; $merged_posts[] = $post; } } } // マージされた全記事を、投稿日付が新しい順(降順)にソート usort($merged_posts, function ($a, $b) { return strtotime($b->post_date) <=> strtotime($a->post_date); }); // 全体データから、指定された件数だけを先頭から切り出す $display_posts = array_slice($merged_posts, 0, intval($atts['count'])); // 投稿が存在しない場合 if (empty($display_posts)) { return '<p>投稿が見つかりませんでした。</p>'; } $list_items = ''; foreach ($display_posts as $post) { $link = $post->site_url . '/?p=' . $post->ID; $title = esc_html($post->post_title); $date = date('Y/m/d', strtotime($post->post_date)); $escaped_url = esc_url($link); $list_items .= " <li><a href=\"{$escaped_url}\" target=\"_blank\">{$title}</a> <span class=\"post-date\">({$date})</span></li>\n"; } return '<ul class="external-merged-posts">' . "\n" . $list_items . '</ul>'; });
さいごに
今回紹介した方法を使えば、同一サーバー内にある別WordPressの投稿を取得して一覧表示できます。
wp-config.phpに定数を追加・修正するだけで、接続するサイトの追加や変更にも柔軟に対応できます。
マルチドメインやサブディレクトリを利用して複数のWordPressサイトを運営している方は、サイト間の回遊率を高める施策としてぜひ活用してみてください。

