$wpdbで複数のWordPressから投稿データを取得する方法

今回ご紹介する方法を使うとWordPressのマルチサイト機能を利用しなくても $wpdb で接続先のデータベースを切り替えてデータを取得することで複数のWordPressから投稿データなどWP管理下のデータを吸い上げることが可能です。

データベース情報

接続先のデータベース情報を管理する配列を用意します。

/**
 * データベース情報
 */
$ag_db_list = [
    'wp1' => [
        'host'   => 'mysqXXXXX.xserver.jp',
        'name'   => 'hoge_wp1',
        'user'   => 'hoge_usr',
        'pass'   => 'password',
        'prefix' => 'wp_'
    ],
    'wp2' => [
        'host'   => 'mysqXXXXX.xserver.jp',
        'name'   => 'hoge_wp2',
        'user'   => 'hoge_usr',
        'pass'   => 'password',
        'prefix' => 'wp_'
    ],
];
define('AG_DB_LIST', $ag_db_list);

データベースIDに該当するWordPressの投稿を取得する関数

データベース情報の管理用配列内で管理されているデータベースのIDを指定して該当のWordPressから投稿データを取得する関数です。

/**
 * データベースIDに該当するWordPressの投稿を取得する
 */
function ag_get_posts_by_dbid($dbid)
{
    $ag_db = AG_DB_LIST[$dbid];
    $ag_wpdb = new wpdb($ag_db['user'], $ag_db['pass'], $ag_db['name'], $ag_db['host']);

    $table       = $ag_db['prefix'].'posts';
    $post_status = 'publish';
    $post_type   = 'post';
    $query       = "SELECT * FROM {$table} WHERE post_status = %s AND post_type = %s";
    $result      = $ag_wpdb->get_results( $ag_wpdb->prepare( $query, $post_status, $post_type  )  );
        
    $post_list = array();
    foreach ($result as $post) {
        
        if(mb_strlen($post->post_content,'UTF-8')>200){
            $content = str_replace('\n', '', mb_substr(strip_tags($post->post_content), 0, 200,'UTF-8'));
            $content = $content.'・・・';
        }else{
            $content = str_replace('\n', '', strip_tags($post->post_content));
        }
        
        //
        $post_list[] = [
            'post_id'      => $post->ID,
            'title'        => $post->post_title,
            'date'         => date_i18n('Y.m.d', strtotime($post->post_date)),
            'content'      => $content,
        ]; 
    }
    

    return $post_list;
}

DBリスト内の全WordPressの投稿データを取得する

以下の関数でデータベース情報管理用の配列をループで回して上記で追加した ag_get_posts_by_dbid関数を実行する際にデータベースIDを渡してリスト内の全てのデータベースから投稿データを取得します。

/**
 * DBリスト内の全WordPressの投稿データを取得する
 */
function ag_get_posts_all()
{
    $post_list = array();
    
    foreach (AG_DB_LIST as $dbid) {
        $posts = ag_get_posts_by_dbid($dbid);

        foreach ($posts as $post) {
            $post_list[] = $post;
        }
    }
    return $post_list;
}

動作環境情報

エックスサーバー(x10)
PHP 7.3.16
MySQL 5.7
WordPress 5.5.1

関連記事

コメント

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