「新着記事」ブロックがを横並びのときカテゴリーページへのリンクを追加する方法

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

はじめに

「新着記事」ブロックを単一カテゴリーで横並び表示した際、各エントリーカードの末尾にカテゴリーのページへのリンクを追加します。

以下ではJavaScriptで実現しており、動的に追加されるため画面がチラつく問題があります。

そこで、PHP側で生成する方法に変更します。

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

実装手順

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

add_filter('render_block_cocoon-blocks/new-list', function ($block_content, $block) {
  // サムネイル画像を設定
  $image_url = '画像URL';

  $attrs = $block['attrs'];

  if (
    !isset($attrs['cats'], $attrs['horizontal']) ||
    strpos($attrs['cats'], ',') !== false ||
    $attrs['horizontal'] !== true
  ) {
    return $block_content;
  }

  $cat_id = intval($attrs['cats']);
  $category = get_category($cat_id);
  $cat_url = get_category_link($cat_id);
  $cat_name = $category->name;

  ob_start();
  ?>
  <a href="<?= esc_url($cat_url); ?>" class="new-entry-card-link widget-entry-card-link a-wrap swiper-slide" title="<?= esc_attr($cat_name); ?>">
    <div class="new-entry-card widget-entry-card e-card cf">
      <figure class="new-entry-card-thumb widget-entry-card-thumb card-thumb">
        <img src="<?= esc_url($image_url); ?>" alt="<?= esc_attr($cat_name); ?>">
      </figure>
      <div class="new-entry-card-content widget-entry-card-content card-content">
        <div class="new-entry-card-title widget-entry-card-title card-title"><?= esc_html($cat_name); ?>一覧へ</div>
      </div>
    </div>
  </a>
  <?php
  $html = ob_get_clean();

  // 最後の</a>の後に挿入
  $pos = strrpos($block_content, '</a>');
  if ($pos === false) {
    return $block_content;
  }

  $before = substr($block_content, 0, $pos + 4);
  $after = substr($block_content, $pos + 4);

  return $before . $html . $after;
}, 10, 2);

さいごに

今回紹介した方法を使えば、「新着記事」ブロックで単一カテゴリーを横並び表示した際に、各エントリーカードの末尾にカテゴリーへのリンクを安全に追加できます。
PHP側で生成するため、JavaScriptによる動的追加のように画面がチラつく心配もなく、サイトの表示が安定します。

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