🛡️
【WordPress】特定のカスタムブロックのみを出力するショートコード
カスタムブロックを作ったついでに、投稿から特定のカスタムブロックのみを出力するショートコードを作った。
functions.php
// 任意のカスタムブロックを表示するショートコード作成
function search_custom_block($params = array())
{
extract(shortcode_atts(array(
'name' => '0'
), $params));
// 投稿やページの本文を取得
$content = get_the_content();
if($content) {
// HTMLを解析してDOMオブジェクトを作成
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
$custom_blocks = array();
// 全てのブロックエリアを取得
$blocks = $dom->getElementsByTagName('*');
foreach ($blocks as $block) {
$className = $block->getAttribute('class');
if (false !== strpos($className,"wp-block-custom-block-$name-section")) {
// 目的のカスタムブロックの出力を取得し、配列に追加
$custom_blocks[] = $dom->saveHTML($block);
}
}
// $custom_blocksを改行で連結して出力
return implode("\n", $custom_blocks);
}
}
add_shortcode('echo_custom_block', 'search_custom_block');
// [echo_custom_block name="{block-name}"]
呼び出すときはこれ。
single.php
<?php echo do_shortcode('[echo_custom_block name="faq"]') ?>
補足
要素があっても要素以下に中身が無い場合はnullを返すようにする。
functions.php
// 任意のカスタムブロックを表示するショートコード作成
function search_custom_block($params = array())
{
extract(shortcode_atts(array(
'name' => '0'
), $params));
// 投稿やページの本文を取得
$content = get_the_content();
if($content) {
// HTMLを解析してDOMオブジェクトを作成
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
$custom_blocks = array();
// PHPのDOMDocumentはJSほど高機能じゃない
// 全てのブロックエリアを取得
$blocks = $dom->getElementsByTagName('*');
foreach ($blocks as $block) {
$className = $block->getAttribute('class');
if (false !== strpos($className,"wp-block-custom-block-$name-section")) {
+ // 目的のカスタムブロックの出力を取得し、div以下に中身があれば配列に追加
+ if($block -> childElementCount > 0) {
$custom_blocks[] = $dom->saveHTML($block);
+ }
}
}
+ // 配列が空ならnullを返す
+ if(empty($custom_blocks)) {
+ return null;
+ } else {
return implode("\n", $custom_blocks);
+ }
}
}
add_shortcode('echo_custom_block', 'search_custom_block');
// [echo_custom_block name="{block-name}"]
Discussion