今回ご紹介する方法を使うと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
コメント