ショートコードで直接ウィジェットを表示する方法

Cocoonカスタマイズ集
この記事は約4分で読めます。
記事内に広告が含まれています。

はじめに

Cocoon 2.8.0での見直しにより、ブロックがウィジェットと同様の独自カスタマイズを廃止し、WordPress標準の仕様に戻されました。
このため、以下のブロックではウィジェットと表示が異なります。

そこで対策として、ブロックを使用せず、独自のショートコードを使用して、ウィジェットを表示させます。
この記事では、この方法について説明します。

現状のブロック表示

  • アーカイブ
  • カテゴリー
  • タグクラウド

Cocoonブロック (1) Cocoonマイクロコピー (1) Cocoon汎用ブロック (1) CSS (125) JavaScript (43) PHP (184) WordPress (91) クラシックエディター (1) スタイル (4) テキストブロック (1) ブロック (8) プラグイン (4) リッチテキスト (1)

完成イメージ

  • アーカイブ
  • カテゴリー
  • タグクラウド

使用方法

以下にショートコードを示します。

[my_widget name="ウィジェット名" options='{"オプション名":値,...}']
ウィジェット名オプション説明初期値
WP_Widget_Archivesdropdownドロップダウンで表示0=非表示 / 1=表示0
count投稿数を表示0=非表示 / 1=表示0
WP_Widget_Categoriesdropdownドロップダウンで表示0=非表示 / 1=表示0
count投稿数を表示0=非表示 / 1=表示0
hierarchical階層を表示0=非表示 / 1=表示0
WP_Widget_Tag_Cloudcount投稿数を表示0=非表示 / 1=表示0

実装手順

以下のコードをfunctions.phpに追加します。

add_shortcode('my_widget', function($atts) {
  $atts = shortcode_atts([
    'name'    => '',
    'options' => '',
  ], $atts);

  if (empty($atts['name'])) {
    return '';
  }

  // 引数をデコード
  $instance = !empty($atts['options']) ? json_decode($atts['options'], true) : [];

  // タイトルを出力しない
  $instance['title'] = '!';

  // ウィジェット出力
  ob_start();
  the_widget($atts['name'], $instance);
  $output = ob_get_clean();

  // 特定のウィジェットに応じた処理
  switch ($atts['name']) {
    case 'WP_Widget_Categories':
    case 'WP_Widget_Archives':
      $output = remove_post_count_parentheses($output, $instance);
      break;

    case 'WP_Widget_Tag_Cloud':
      $instance['show_count'] = isset($instance['count']) && $instance['count'] ? true : false;
      $output = wp_tag_cloud_custom($output, $instance);
      break;
  }

  return $output;
});

補足

今回、直接ウィジェットを呼び出すため、以下のようにショートコード用のウィジェットエリアを新たに設ける必要はありません。

以下の方法で、ウィジェットを直接呼び出すことができます。

[my_widget name="RecentCommentsWidgetItem"]

さいごに

今回紹介した方法を使えば、ショートコードを使用してウィジェットを表示することができます。
ウィジェット名とオプションをショートコードの引数として指定することで、カスタマイズされたウィジェットを記事やページに簡単に埋め込むことが可能です。

タイトルとURLをコピーしました