🛡️

【WordPress】特定のカスタムブロックのみを出力するショートコード

2024/03/17に公開

https://zenn.dev/210neon/articles/95d3daf246281a

カスタムブロックを作ったついでに、投稿から特定のカスタムブロックのみを出力するショートコードを作った。

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