Advanced Custom Fieldsのテキストエリアをテーブルとして使う方法
PHP 8.3では、null を文字列関数に渡すことが非推奨になっているので「null チェック」を入れる必要がある
テーブルはthとtdの2列だけで、行は何行になってもOK。thとtdの値は半角の@(アットマーク)で区切る
※当初:(コロン)で区切っていたが時間表示でコロンが使われる可能性があるので@に変更した
<?php
// データを取得(nullの可能性がある)
$field = get_field('catering_option') ?? '';
// 連続した改行を1つの改行にまとめる
$field = preg_replace('/(\n|\r|\r\n)+/us', '\n', $field);
// もし全角の:があれば半角の:に変換する
$field = str_replace('@', '@', $field);
// 1行ごとに<tr>、「@」で<th>と<td>に区切る
echo '<table>
<tr>
<th>' .
str_replace(
array('\n', '@'),
array('</td></tr><tr><th>', '</th><td>'),
$field
) .
'</td>
</tr>
</table>';
?>
これに以下の処理を追加
・@を付けない行はテーブルのセルtdを結合する処理を行う(colspan=”2″)
・結合したtdにclass=”td_comment”を付ける
・空の行は無視する
<?php
$field = get_field('catering_info') ?? '';
$field = preg_replace('/(\n|\r|\r\n)+/us', "\n", $field);
$field = str_replace('@', '@', $field);
$lines = explode("\n", $field);
echo '<table>';
foreach ($lines as $line) {
$line = trim($line);
if ($line === '') {
continue;
}
echo '<tr>';
if (strpos($line, '@') !== false) {
list($th, $td) = explode('@', $line, 2);
echo '<th>' . htmlspecialchars($th) . '</th>';
echo '<td>' . htmlspecialchars($td) . '</td>';
} else {
// class="td_comment" を追加
echo '<td colspan="2" class="td_comment">' . htmlspecialchars($line) . '</td>';
}
echo '</tr>';
}
echo '</table>';
?>