プラグインXYZ PHP Codeとカスタムフィールドを用いてDB-tableブロック
2023-11-23 記載
概要 : データベースの値を楽にきれいにtable表記できるようにしました
Keyword : XYZ PHP Code, SQL, tableタグ, カスタムフィールド, PDO,
ブロックエディタのテーブルがデータベースとフレンドリーではないので、自作PHPで対処しました。プラグインXYZ PHP Codeを使います。
管理画面 XYZ PHP Code メニューより PHP Code Snippets
[Add New PHP Code Snippet]
で
DBRTagTable
を作成。
コードは以下のみ。
※このテキストエリア内ではコード編集が不便なので別ファイルに記述。
VSCodeで編集します。
<?php
require $_SERVER['DOCUMENT_ROOT'].'/yourfolder/dbrtagtable.php';
dbrtagtable.php の内容は以下。
<?php
mb_language('Japanese');
mb_internal_encoding('UTF-8');
date_default_timezone_set('Asia/Tokyo');
setlocale(LC_ALL, 'ja_JP.UTF-8');
$mode = '';
$output = '';
//固定ページのカスタム
$custom_key = 'xyz_param'.get_the_ID();
if (!isset(get_post_custom()[$custom_key])) {
echo <<<EOT
<pre>
カスタムフィールド xyz_param+投稿ID を設定してください
値:(SQL)
select * from t_test where 価格 > 200;
値:(CSV)
1,主食,白ごはん,200
2,汁物,季節の味噌汁,80
3,主食,かやくご飯,250
値:(TSV)
1 主食 白ごはん 200
2 汁物 季節の味噌汁 80
3 主食 かやくご飯 250
値:(HTML)
<table>……</table>
</pre>
EOT;
return;
}
$xyz_param1 = get_post_custom()[$custom_key][0];
if (strpos($xyz_param1, 'select') === 0 || strpos($xyz_param1, 'with') === 0) {
$mode = 'SQL';
$sth = $wpdb->prepare($xyz_param1);
$sth->execute();
$output .= '<table><tr>';
for($col = 0; $col < $sth->columnCount(); $col++) {
$output .= '<th>'.$sth->getColumnMeta($col)['name'].'</th>';
}
$output .= '</tr>';
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach($result as $rec) {
$output .= '<tr>';
foreach($rec as $col) {
$output .= "<td>$col</td>";
}
$output .= '</tr>';
}
$output .= '</table>';
} else if (strpos($xyz_param1, ',') !== false) {
$mode = 'CSV';
$output = str_replace(',', '</td><td>', $xyz_param1);
} else if (strpos($xyz_param1, "\t") !== false) {
$mode = 'TSV';
$output = str_replace("\t", '</td><td>', $xyz_param1);
} else {
$mode = 'HTML';
$output = '<style>.xyz-table001 td, .xyz-table001 th ';
$output .= '{ border: 1px solid #ccc; padding: 2px 16px;} ';
$output .= ' .xyz-table001 th { background-color: #ccc}</style>';
$output .= str_replace('<table>', '<table class="xyz-table001">', $xyz_param1);
}
if ($mode == 'CSV' || $mode == 'TSV') {
$output = str_replace("\r\n", '</td></tr><tr><td>', $output);
$output = '<table><tr><td>'.$output.'</tr></table>';
$output = str_replace('<tr><td></tr>', '', $output);
}
if ($mode != 'HTML') {
$output = htmlspecialchars($output);
}
echo $output;
カスタムフィールドを作成します。

名前は xyz_param+投稿ID (post.php?post=695 なら xyz_param695)
値は (最初はSQL文)
select * , RANK() over (PARTITION by 区分 ORDER by 価格) as 安い順 from t_test;
投稿文にスニペット (↓変換されないようにこれは全角文字ブラケットです)
[xyz-ips snippet=”DBRTagTable”]
を記述。
プレビューをとりますとtableのHTML文が出力されます。

HTML文をまるごとコピーして、カスタムフィールド xyz_param1 の値、SQL文を上書きするようにペーストします。

ふたたびプレビューをとりますと
auto_id | 区分 | 品名 | 価格 | 安い順 |
---|---|---|---|---|
5 | メイン皿 | 焼き魚 | 300 | 1 |
6 | メイン皿 | からあげ | 350 | 2 |
13 | メイン皿 | おつくり | 400 | 3 |
4 | メイン皿 | ハンバーグ | 400 | 3 |
14 | メイン皿 | ステーキ | 500 | 5 |
1 | 主食 | 白ごはん | 200 | 1 |
3 | 主食 | かやくご飯 | 250 | 2 |
9 | 副菜 | 納豆 | 100 | 1 |
10 | 副菜 | だし巻き卵 | 130 | 2 |
7 | 副菜 | 冷奴 | 200 | 3 |
8 | 副菜 | 煮物 | 240 | 4 |
2 | 汁物 | 季節の味噌汁 | 80 | 1 |
以上。
というように2段階ステップでコードを作ります。
テーブルを読んでそれをtable表示するのもできるのですが、t_testとかは一時的なテーブルなのでいつか消される運命。そのときエラーにならないように、いまの時点で値をハードコーディングする必要があります。
そのために2段階。
値は見えないところ、カスタムフィールドに置かれるという訳です。
最初のデータはSQLでなくても、カンマ区切りやTAB区切りのデータでもOKです。
一投稿内に2箇所のtable表記があった場合は、ソースからhtmlとしてコピーして、htmlコードブロックとして配置する、という暫定対応にしておきます。