概要説明
別サイトのWordPressの記事データを表示させるためのカスタマイズ。複数サイト(DB)の指定ができるようにしているのでショートコードにて1ページに複数のWordPressサイトの記事の表示も可能。カスタム投稿のデータを取得したい場合はDB定義情報の中にpost_typeを含めることで投稿、カスタム投稿の調整が可能です。
~ 目次 ~
コード – 別のDBに接続して記事情報を取得する
functions.php
/*---------------------------------------------------- 別のWordPressの記事を取得し表示させるショートコード ----------------------------------------------------*/ if ( !function_exists( 'get_remote_posts' ) ){ // html調整エリア function get_remote_posts( $atts ){ extract( shortcode_atts( array( 'db_key' => 'default', ), $atts) ); // 記事データ取得 $posts = wpdb_get_posts($db_key); $posts_html = ''; if ( $posts ) { // データ取得用サンプルなのでhtmlは要調整 $posts_html .= '<ul>'; foreach ( $posts as $key => $post ) { $li = <<<EOD <li> <a href="{$post['url']}"> <img src="{$post['thumbnail']}"><hr> {$post['title']}<hr> {$post['content']}<hr> {$post['date']}<hr> </a> </li> EOD; $posts_html .= $li; } $posts_html .= '</ul>'; } return $posts_html; } // アイキャッチ取得 function get_remote_post_thumbnail( $remote_wpdb, $table, $post ) { // サムネイル画像がない場合のデフォルト画像URL指定 $image_url = 'https://xxxxxxxxxxxxxxxx/img/no-image.gif'; // サムネイル画像URL取得 $query = "SELECT meta_value FROM {$table['postmeta']} WHERE post_id = %d AND meta_key = '_thumbnail_id'"; $postmeta = $remote_wpdb->get_row( $remote_wpdb->prepare( $query, $post->ID ) ); if ( $postmeta ) { $query = "SELECT guid FROM {$table['posts']} WHERE ID = %d"; $thumbnail = $remote_wpdb->get_row( $remote_wpdb->prepare( $query, $postmeta->meta_value ) ); if ( $thumbnail ) { $image_url = $thumbnail->guid; } } return $image_url; } // 別DBに接続して記事情報取得 function wpdb_get_posts( $db_key ) { // 複数定義可能 $remote_wp['default'] = array( 'host' => 'DBホスト情報', 'database' => 'データベース名', 'user' => 'ユーザーID', 'pass' => 'パスワード', 'prefix' => 'wp_', 'url' => '取得元サイトURL', ); $remote_wp['wp2'] = array( 'host' => 'DBホスト情報', 'database' => 'データベース名', 'user' => 'ユーザーID', 'pass' => 'パスワード', 'prefix' => 'wp_', 'url' => '取得元サイトURL', ); // 記事取得条件 $post_status = 'publish'; // 公開 $post_type = 'post'; // 投稿データ // 接続情報取得 $remote_db = $remote_wp[ $db_key ]; // テーブル情報取得 $table['posts'] = $remote_db['prefix'].'posts'; $table['postmeta'] = $remote_db['prefix'].'postmeta'; // DB接続 $remote_wpdb = new wpdb( $remote_db['user'], $remote_db['pass'], $remote_db['database'], $remote_db['host']); // prefix 設定 $remote_wpdb->set_prefix( $remote_db['prefix'] ); // 記事データ取得 $query = "SELECT * FROM {$table['posts']} WHERE post_status = %s AND post_type = %s"; $posts = $remote_wpdb->get_results( $remote_wpdb->prepare( $query, $post_status, $post_type ) ); $post_list = array(); foreach ($posts as $post) { // 表示用データ整形 $post_list[] = [ 'post_id' => $post->ID, 'title' => $post->post_title, 'date' => date_i18n('Y.m.d', strtotime($post->post_date)), 'content' => $post->content, 'url' => $remote_db['url'].'/?p='.$post->ID, 'thumbnail' => get_remote_post_thumbnail($remote_wpdb,$table,$post), ]; } return $post_list; } add_shortcode('remote_posts', 'get_remote_posts'); }
データベース接続情報を設定
functions.php
$remote_wp['任意のサイトID'] = array( 'host' => 'DBホスト情報', 'database' => 'データベース名', 'user' => 'ユーザーID', 'pass' => 'パスワード', 'prefix' => 'wp_', 'url' => '取得元サイトURL', );
ショートコードの使用例
[remote_posts] この場合は $remote_wp[‘default’] で設定しているDBに接続します
[remote_posts db_key=wp2] この場合は $remote_wp[‘wp2’] で設定しているDBに接続します
記事、カスタム記事をサイトごとに指定したい場合
functions.php
$remote_wp['任意のサイトID'] = array( 'host' => 'DBホスト情報', 'database' => 'データベース名', 'user' => 'ユーザーID', 'pass' => 'パスワード', 'prefix' => 'wp_', 'url' => '取得元サイトURL', 'post_type'=>'news', ); $remote_db = $remote_wp[ $db_key ]; // 記事取得条件 $post_status = 'publish'; // 公開 $post_type = $remote_db['post_type'];