通知エリアのメッセージをメニュー設定から複数登録して縦スクロールする方法

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

記事に記載したコードは、スキンに追加されています。

はじめに

テーマ「Cocoon」には、サイト上部に重要な案内を表示できる便利な「通知エリア」機能が備わっています。
しかし、標準機能では1つのテキストと1つのリンクしか設定できず、複数の案内を表示することはできません。

そこで、WordPressのメニュー画面を活用し、複数の通知メッセージを登録して、Swiperによる滑らかな縦スクロールでループ再生させるカスタマイズを行います。

この記事では、この方法について説明します。

完成イメージ

実装手順

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

// メニュー位置を追加
add_action('init', function () {
  register_nav_menus([
    'notice-menu' => '通知エリア',
  ]);
});


// Cocoon設定(通知)の通知メッセージを変更
add_filter('get_notice_area_message', function ($msg) {
  $GLOBALS['notice_swiper_enabled'] = false;

  if (is_admin()) {
    return $msg;
  }

  // メニュー位置を取得
  $locations = get_nav_menu_locations();
  if (empty($locations['notice-menu'])) {
    return $msg;
  }

  // メニューに登録されているアイテムを取得
  $menu_items = wp_get_nav_menu_items($locations['notice-menu']);
  if (empty($menu_items)) {
    return $msg;
  }

  // 各メニューアイテムのHTML化処理
  $target_attr = is_notice_link_target_blank() ? ' target="_blank" rel="noopener"' : '';
  $items_html  = [];

  foreach ($menu_items as $item) {
    $url   = trim($item->url);
    $title = esc_html($item->title);

    if ($url !== '' && $url !== '#') {
      $items_html[] = '<a href="' . esc_url($url) . '"' . $target_attr . '>' . $title . '</a>';
    } else {
      $items_html[] = $title;
    }
  }

  $count = count($items_html);
  if ($count === 0) {
    return $msg;
  }

  // アイテム数に応じた出力切り替え
  if ($count === 1) {
    $msg = $items_html[0];
  } else {
    global $_IS_SWIPER_ENABLE;

    $_IS_SWIPER_ENABLE = true;
    $GLOBALS['notice_swiper_enabled'] = true;

    $slides_html = '';
    foreach ($items_html as $item_html) {
      $slides_html .= '<div class="swiper-slide">' . $item_html . '</div>';
    }

    $msg = '<div class="swiper swiper-vertical"><div class="swiper-wrapper">' . $slides_html . '</div></div>';
  }

  // Cocoon設定を無効化
  global $_THEME_OPTIONS;
  $_THEME_OPTIONS['notice_area_url'] = '';

  return $msg;
});


// テンプレート(カスタムJavaScript)の直後に追加
add_action('cocoon_part_after__tmp/footer-javascript', function () {
  if (empty($GLOBALS['notice_swiper_enabled'])) {
    return;
  }
  ?>
  <script>
  const noticeSwiper = new Swiper('.notice-area-message .swiper', {
    loop: true,
    direction: 'vertical',
    autoplay: {
      delay: 8000
    },
    speed: 2000
  });
  </script>

  <style>
  .notice-area {
    line-height: 1.8em;
  }

  .notice-area .swiper-wrapper {
    height: 1.8em;
    margin: 0;
  }
  </style>
  <?php
});

解説

Cocoon設定→通知のメッセージやURLの代わりに、作成したメニューの内容を反映させます。
通知エリアの表示は、メニューの登録状況に合わせて以下のように自動で切り替わります。

  • メニューアイテムが1つだけの場合
    スクロールはせず、その1件のみが固定表示されます。
  • メニューを何も設定していない場合
    従来通り、Cocoon設定に入力されているメッセージがそのまま表示されます。

また、メニューの中で「リンクなしのメッセージ」を流したい場合は、メニュー追加時にカスタムリンクを選び、URL欄に「#」を入力します。

さいごに

今回紹介した方法を使えば、Cocoonの標準機能だけでは難しかった「複数メッセージの柔軟な切り替え」が、使い慣れたWordPressのメニュー画面からいつでも簡単に行えるようになります。
サイト訪問者の目を引きつつ、限られたスペースを有効活用して多くの情報を届けることができるため、お知らせやキャンペーン情報が多いサイトはぜひ試してみてください。

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