同サーバー内にある別のWordPressの投稿をリスト一覧で表示する方法

Cocoonカスタマイズ集
この記事は約6分で読めます。
記事内に広告が含まれています。

はじめに

同一サーバー上に複数の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サイトを運営している方は、サイト間の回遊率を高める施策としてぜひ活用してみてください。

タイトルとURLをコピーしました