カルーセルに指定した投稿を表示する方法

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

はじめに

カルーセルはデフォルトで人気記事をランダムに表示するため、特定の投稿を意図した通りにカードに表示することはできません。

そこで、特定の投稿IDを指定して、意図したカードを表示させます。

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

実装手順

以下の手順で実装します。

  • ラベル
    Cocoon設定

    表1に示す項目を設定をします。

    Cocoon設定
    設定大項目項目設定値
    カルーセルカルーセル設定人気記事オン
  • ラベル
    PHPを追加

    以下のコードをfunctions.phpに追加します。
    例えば、投稿ID=123、456、789を表示します。

    add_filter('cocoon_carousel_args', function ($args) {
      $args['orderby'] = 'post__in';
      $args['post__in'] = [123, 456, 789];
    
      // 投稿・固定ページを表示対象
      $args['post_type'] = ['post', 'page'];
    
      return $args;
    });

指定した投稿IDが6件以下で、全てのカードが表示されている場合、スクロールは発生しません。

参考:Cocoon設定画面に投稿ID入力フォームを追加する方法

Cocoonの設定→カルーセルに、投稿IDを入力するフォームを追加します。

完成イメージ

実装手順

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

/**
 * Cocoonのカスタム設定一覧(設定キー => デフォルト値)を定義
 *
 * @return array 設定キーとデフォルト値の配列
 */
if (!function_exists('my_cocoon_options')):
function my_cocoon_options() {
  return [
    'my_comment_toggle_enable'   => 0,
    'my_carousel_extra_post_ids' => [],
  ];
}
endif;


/**
 * Cocoonのカスタム設定を取得
 *
 * @param string $key 設定キー名
 * @return mixed 設定値(未設定の場合はデフォルト値)
 */
if (!function_exists('my_get_cocoon_option')):
function my_get_cocoon_option($key) {
  $options = my_cocoon_options();

  return get_theme_option($key, $options[$key]);
}
endif;


// Cocoonのカスタム設定を保存
add_action('cocoon_settings_after_save', function () {
  foreach (array_keys(my_cocoon_options()) as $key) {
    update_theme_option($key);
  }
});


// Cocoon設定にメニューを追加
add_action('admin_menu', function () {
  $page_hook = get_plugin_page_hookname('theme-settings', '');

  if ($page_hook) {
    add_action($page_hook, 'add_single_carousel_field');
  }
}, 99);


/**
 * Cocoon設定(カルーセル)のメニュー項目を追加
 *
 * @return void
 */
if (!function_exists('add_single_carousel_field')):
function add_single_carousel_field() {
  $checks = my_get_cocoon_option('my_carousel_extra_post_ids');

  // 文字列で渡された場合は配列へ変換
  if (is_string($checks)) {
    $checks = explode(',', $checks);
  }

  // 選択中IDリストの数値変換
  $checks = array_map('intval', (array) $checks);

  // 選択肢用投稿一覧の取得
  $posts = get_posts([
    'post_type'      => 'post',
    'posts_per_page' => -1,
    'orderby'        => 'date',
    'order'          => 'DESC',
  ]);

  ob_start();
  ?>
  投稿<br>
  <div id="carousel-extra-post-selector" style="max-height:300px; overflow:auto; border:1px solid #ccc; padding:5px;width:100%">
    <?php if ($posts) : ?>
      <?php foreach ($posts as $post) : ?>
        <?php
          $checked  = in_array((int) $post->ID, $checks, true) ? ' checked="checked"' : '';
          $input_id = 'carousel-extra-post-' . $post->ID;
        ?>
        <label style="display:block; margin-bottom:3px;" for="<?= $input_id; ?>">
          <input type="checkbox" id="<?= $input_id; ?>" name="my_carousel_extra_post_ids[]" value="<?= $post->ID; ?>"<?= $checked; ?>>
          <?= esc_html($post->post_title); ?>
        </label>
      <?php endforeach; ?>
    <?php endif; ?>
  </div>
  <?php echo generate_tips_tag('投稿を選択すると、その記事のみが表示されます。', false); ?>
  <?php
  $html = ob_get_clean();

  ?>
  <script>
  jQuery(function ($) {
    const $td = $('input[name="carousel_popular_posts_enable"]').closest('td');
    const postListHtml = <?= json_encode($html); ?>;

    if ($td.length) {
      $td.append(postListHtml);
    }
  });
  </script>
  <?php
}
endif;


// カルーセルのクエリを設定
add_filter('cocoon_carousel_args', function ($args) {
  $ids = my_get_cocoon_option('my_carousel_extra_post_ids');

  if (is_array($ids)) {
    $ids = array_filter(array_map('intval', $ids));

    if (!empty($ids)) {
      $args['orderby']   = 'post__in';
      $args['post__in']  = $ids;
      $args['post_type'] = ['post'];
    }
  }

  return $args;
});

参考:メニュー画面にカルーセル用のメニュー位置を追加する方法

外観→メニューにカルーセル専用のメニュー位置を追加します。
ここで設定したメニュー項目(投稿や固定ページ)を、カルーセルとして表示させます。

完成イメージ

実装手順

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

// メニュー位置を追加
add_action('init', function () {
  register_nav_menus([
    'my-carousel-menu' => 'カルーセル',
  ]);
});


// カルーセルのクエリを設定
add_filter('cocoon_carousel_args', function ($args) {
  // メニュー位置を取得
  $locations = get_nav_menu_locations();
  if (empty($locations['my-carousel-menu'])) {
    return $args;
  }

  // メニューアイテムを取得
  $menu_items = wp_get_nav_menu_items($locations['my-carousel-menu']);
  if (empty($menu_items)) return $args;

  // 投稿・固定ページのIDを取得
  $post_ids = [];
  foreach ($menu_items as $item) {
    if (in_array($item->object, ['post', 'page'], true)) {
      $post_ids[] = (int)$item->object_id;
    }
  }

  // カルーセルのクエリを変更
  if (!empty($post_ids)) {
    $args['orderby']   = 'post__in';
    $args['post__in']  = $post_ids;
    $args['post_type'] = ['post', 'page'];
  }

  return $args;
});

参考:ノーコードで指定した投稿を表示する方法

任意のカテゴリー(例:「おすすめ」)を作成し、カルーセルに表示したい投稿にそのカテゴリーを設定します。

次にCocoon設定→カルーセル→表示内容で作成したカテゴリー「おすすめ」を選択します。

これで、カテゴリー「おすすめ」を設定した投稿をカルーセルに表示できます。

さいごに

今回紹介した方法を使えば、カルーセルに特定の投稿を表示できます。
意図した投稿を表示することで、閲覧者の関心を引きつけることができます。

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