サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

プラグイン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メイン皿焼き魚3001
6メイン皿からあげ3502
13メイン皿おつくり4003
4メイン皿ハンバーグ4003
14メイン皿ステーキ5005
1主食白ごはん2001
3主食かやくご飯2502
9副菜納豆1001
10副菜だし巻き卵1302
7副菜冷奴2003
8副菜煮物2404
2汁物季節の味噌汁801

以上。
というように2段階ステップでコードを作ります。
テーブルを読んでそれをtable表示するのもできるのですが、t_testとかは一時的なテーブルなのでいつか消される運命。そのときエラーにならないように、いまの時点で値をハードコーディングする必要があります。
そのために2段階。
値は見えないところ、カスタムフィールドに置かれるという訳です。
最初のデータはSQLでなくても、カンマ区切りやTAB区切りのデータでもOKです。
一投稿内に2箇所のtable表記があった場合は、ソースからhtmlとしてコピーして、htmlコードブロックとして配置する、という暫定対応にしておきます。

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog