とても便利なCMS[コンテンツ・マネジメント・システム]の1つ「WordPress」。
プラグインを使えば大抵の事が実現できてしまう優れものです。
しかし、時にはもっとカスタマイズして使いたい!
例えば、データベースにテーブルを追加して使うというのはどうでしょうか?
今回は、実際にテーブルを追加して、そのテーブルデータをWordPress上で使う方法をご紹介します。
★試した環境
・PHP バージョン 7.4 以上。
・MariaDB バージョン 10 以上
※DB操作には「phpMyAdmin」を使用
・WordPressのバージョン 5.7.1 (2021年4月時点の最新版)
※マルチサイト化したWordPressで実行してますが、シングルサイトとやり方は ほぼ同じです
※WordPressやデータベースを直接変更するため、作業前に必ず両方のバックアップを取る事をオススメします
どんなテーブルをデータベースに追加するか
まずはデータベースにテーブルを追加します。
そうは言っても、どのようなテーブルを追加すればいいのか?
人それぞれに使い方やアイデアがあると思うので何とも言えませんが、1つ例として、私がデータベースにテーブルを追加して構築したサイトがありますので、こちらを例に出しましょう。
このサイトでは、10万人あたりの新型コロナウイルス感染者を、日別・地域/都道府県別にリストアップしたものです。
よって、テーブルへの追加データは新型コロナの感染者データになります。
※NHKよりデータをダウンロードして使用してます
WordPressのデータベースにテーブル追加とデータ挿入
では実際にデータベースにテーブルを追加します。
追加方法はテーブルのプレフィックス(接頭辞)を付けます。
WordPressをインストールした際に指定したのと同じです。
特に変更してなければ「wp_」がプレフィックスになります。
よって追加するテーブル名は「wp_(テーブルの名前)」になります。
※例:「wp_add_table」
マルチサイトの場合、プレフィックスに数字が入りますので、追加したいサイトの数字も入れてテーブルを追加します。
※サイト数字が「10」の場合の例:「wp_10_」がマルチサイトのプレフィックスなら「wp_10_add_table」
「phpMyAdmin」でテーブル追加します。
テーブルができたら、テーブルにデータを挿入します。
別にコマンドで追加しても構いませんが、データベースのテーブル追加とデータ挿入は、ここでは省略させていただきます。
WordPressのPHP設定ファイルを変更
テーブルを追加したら、次にWordPressでそのテーブルが使えるようにします。
WordPressがインストールされている場所に「wp-includes/wp-db.php」というファイルがあるはずです。
こちらのファイルの中に、利用するテーブルの一覧がありますので、先程追加したテーブルを追加します。
ここでは追加テーブルを「wp_add_table」とします。
以下に一部、挿入箇所を抜粋します。
/**
* List of WordPress per-blog tables.
*
* @since 2.5.0
* @see wpdb::tables()
* @var array
*/
public $tables = array(
'posts',
'comments',
'links',
'options',
'postmeta',
'terms',
'term_taxonomy',
'term_relationships',
'termmeta',
'commentmeta',
'add_table',
);
これでWordPressの設定ファイルの変更は完了です。
WordPress内でPHPを実行してデータベースにアクセスする
追加したテーブルを使うには、PHPを使ってデータベースにアクセスします。
テンプレートのphpファイルに直接書き込む事で使用する事もできますが、個人的にはあまりオススメしません。
それよりも、PHPを実行できるプラグインを使ったものをオススメします。
投稿記事内やウィジェットで使えるものなど様々あります。
プラグイン「Post Snippets」などはショートカットコードとして、格納したPHPを実行できるのでオススメです。
データを取得するための、基本的な書き方は以下の通りです。
// wpdbオブジェクトを生成
global $wpdb;
// デバッグ用
$wpdb->show_errors();
// SQL分
$sql = $wpdb->prepare('<ここに書きたいSQLを記述する!>');
// SQLを実行する
$rows = $wpdb->get_results($sql);
// DBから取得した値を出力する
foreach ($rows as $row) {
echo $row-><抽出テーブル名>
}
私の作成した「10万人あたりの都道府県別・コロナ感染者数」を例に少し解説いたします。
「2021年4月22日:都道府県別・10万人当たりのコロナ数」のページを見てみます。
一部を抜粋しました。
こちらの「地域別・10万人あたりのコロナ数」についての記述を紹介します。
// wpdbオブジェクト
global $wpdb;
// デバッグ用
$wpdb->show_errors();
// WHERE条件に使う日付 = 投稿日を取得
$sql_date = get_the_date('Y-m-d');
// SQL文
$sql = $wpdb->prepare("<SQL文1>" );
$sql2 = $wpdb->prepare("<SQL文1>");
$sql3 = $wpdb->prepare("<SQL文1>");
//SQL実行
$rows = $wpdb->get_results($sql);
$rows2 = $wpdb->get_results($sql2);
$rows3 = $wpdb->get_results($sql3);
$html = '
<figure class="wp-block-table">
<table>
<tbody>
<tr>
<td>ワーストランク</td>
<td>地域</td>
<td>感染者数(10万人あたり)</td>
<td>感染者数(1日)</td>
</tr>
<tr>
<td>1</td>
<td><a href="../../../region_prefecture/{地方1e/0}" data-type="URL" data-id="../../../region_prefecture/{地方1e/0}">{地域/0}</a></td>
<td>{地域_10万人当たり_1日感染者/0} 人</td>
<td>{地域の合計感染者数_1日感染者/0} 人</td>
</tr>
<tr>
<td>2</td>
<td><a href="../../../region_prefecture/{地方1e/1}" data-type="URL" data-id="../../../region_prefecture/{地方1e/1}">{地域/1}</a></td>
<td>{地域_10万人当たり_1日感染者/1} 人</td>
<td>{地域の合計感染者数_1日感染者/1} 人</td>
</tr>
<tr>
<td>3</td>
<td><a href="../../../region_prefecture/{地方1e/2}" data-type="URL" data-id="../../../region_prefecture/{地方1e/2}">{地域/2}</a></td>
<td>{地域_10万人当たり_1日感染者/2} 人</td>
<td>{地域の合計感染者数_1日感染者/2} 人</td>
</tr>
<tr>
<td>4</td>
<td><a href="../../../region_prefecture/{地方1e/3}" data-type="URL" data-id="../../../region_prefecture/{地方1e/3}">{地域/3}</a></td>
<td>{地域_10万人当たり_1日感染者/3} 人</td>
<td>{地域の合計感染者数_1日感染者/3} 人</td>
</tr>
<tr>
<td>5</td>
<td><a href="../../../region_prefecture/{地方1e/4}" data-type="URL" data-id="../../../region_prefecture/{地方1e/4}">{地域/4}</a></td>
<td>{地域_10万人当たり_1日感染者/4} 人</td>
<td>{地域の合計感染者数_1日感染者/4} 人</td>
</tr>
<tr>
<td>6</td>
<td><a href="../../../region_prefecture/{地方1e/5}" data-type="URL" data-id="../../../region_prefecture/{地方1e/5}">{地域/5}</a></td>
<td>{地域_10万人当たり_1日感染者/5} 人</td>
<td>{地域の合計感染者数_1日感染者/5} 人</td>
</tr>
<tr>
<td>7</td>
<td><a href="../../../region_prefecture/{地方1e/6}" data-type="URL" data-id="../../../region_prefecture/{地方1e/6}">{地域/6}</a></td>
<td>{地域_10万人当たり_1日感染者/6} 人</td>
<td>{地域の合計感染者数_1日感染者/6} 人</td>
</tr>
<tr>
<td>8</td>
<td><a href="../../../region_prefecture/{地方1e/7}" data-type="URL" data-id="../../../region_prefecture/{地方1e/7}">{地域/7}</a></td>
<td>{地域_10万人当たり_1日感染者/7} 人</td>
<td>{地域の合計感染者数_1日感染者/7} 人</td>
</tr>
<tr>
<tr>
<td>9</td>
<td><a href="../../../region_prefecture/{地方1e/8}" data-type="URL" data-id="../../../region_prefecture/{地方1e/8}">{地域/8}</a></td>
<td>{地域_10万人当たり_1日感染者/8} 人</td>
<td>{地域の合計感染者数_1日感染者/8} 人</td>
</tr>
<tr>
<td>合計</td>
<td>全国</td>
<td><strong>{全国10万人あたりの感染者数} 人</strong></td>
<td><strong>{1日合計感染者数} 人</strong></td>
</tr>
</tbody>
</table>
</figure>
';
$i = 0;
foreach ($rows as $row) {
$html= str_replace('{地域/'.$i.'}', $row->地域, $html);
$html= str_replace('{地域_10万人当たり_1日感染者/'.$i.'}', $row->{'地域_10万人当たり_1日感染者'}, $html);
$html= str_replace('{地域の合計感染者数_1日感染者/'.$i.'}', $row->地域の合計感染者数_1日感染者, $html);
$html= str_replace('{地方1e/'.$i.'}', $row->地方1e, $html);
$i++;
}
foreach ($rows2 as $row2) {
$html= str_replace('{1日合計感染者数}', $row2->{'1日合計感染者数'}, $html);
}
foreach ($rows3 as $row3) {
$html= str_replace('{全国10万人あたりの感染者数}', $row3->{'全国10万人あたりの感染者数'}, $html);
}
echo $html;
本当はもう少しスマートに書いたほうが良さそうなので、近々 コーディングは修正する予定ですが、基本的にはSQLでデータを読み取り、組み立てたHTMLファイルを出力しています。
テーブル追加による方法は、データーベースとPHPコーディングの基本的な知識が必要なので、初心者向けではありませんが、アイデア次第で色々な事が試せると思います。