やりたいこと

メインビジュアルがスライダーになっていて、そのスライド1枚1枚の追加や各種設定を管理画面から行いたいケースはよくありますね。

例えば、以下のような仕様です。

Smart Custom Fieldsを使ってWordPressでスライダーを動的にする方法

実装方法

以下のような流れで実装を進めます。

ただし、HTML・CSS・JSを含めたスライダー実装自体は完了している状態が前提となります。
以下の記事のSample05が今回の実装に近いのかなと思います。
https://tips-web.net/slick-slider-sample/

Smart Custom Fieldsを使ってWordPressでスライダーを動的にする方法

01. Smart Custom Fields をインストールして有効化

まずはWordPressの管理画面にてSmart Custom Fieldsをインストールして有効化してください。

Smart Custom Fields

02. オプションページを作成

functions.phpにて、オプションページを作成するための記述をします。

引数は全部で6つありますが、前半の4つが必須項目です。

👇オプションページを作成

//TOPスライダー設定
/**
 * @param string $page_title ページのtitle属性値 (必須)
 * @param string $menu_title 管理画面のメニューに表示するタイトル (必須)
 * @param string $capability メニューを操作できる権限 (必須)
 * @param string $menu_slug オプションページのスラッグ (必須)
 * @param string|null $icon_url メニューに表示するアイコンの URL
 * @param int $position メニューの位置
 */
SCF::add_options_page( 'TOPスライダー', 'TOPスライダー', 'edit_posts', 'top_slider' , 'dashicons-admin-generic' , 11);

これで管理画面を再読み込みすると、以下のように「TOPスライダー」という名前でページができています。

Smart Custom Fieldsを使ってWordPressでスライダーを動的にする方法

03. オプションページにカスタムフィールドを定義

続いて、作成したオプションページにカスタムフィールドを定義します。

管理画面から項目を設定してもいいのですが、functions.phpに書いて定義する方法を紹介します。

👇functions.phpに記述

/**
 * カスタムフィールドを定義
 * 
 * @param array  $settings  MW_WP_Form_Setting オブジェクトの配列
 * @param string $type      投稿タイプ or ロール
 * @param int    $id        投稿ID or ユーザーID
 * @param string $meta_type post | user
 * @return array
 * 
 */
function my_add_meta_box($settings, $type, $id, $meta_type)
{
  if ('top_slider' == $type) {
    $setting = SCF::add_setting('id-top_slider', 'TOPスライダー設定');
    $items = array(
      array(
        'type'        => 'image', //*タイプ
        'name'        => 'top_slider_img_pc', //*名前
        'label'       => '【PC】スライダー画像', //ラベル
        'size'        => 'medium' // プレビューサイズ
      ),
      array(
        'type'        => 'image', //*タイプ
        'name'        => 'top_slider_img_sp', //*名前
        'label'       => '【SP】スライダー画像', //ラベル
        'size'        => 'medium' // プレビューサイズ
      ),
      array(
        'type'        => 'textarea',                      // タイプ
        'name'        => 'top_slider_text',                   // 名前
        'label'       => 'スライダーテキスト設定',        // ラベル
        'rows'        => 3,                               // 行数
      ),
      array(
        'type'        => 'text', //*タイプ
        'name'        => 'top_slider_link', //*名前
        'label'       => 'リンク設定', //ラベル
      ),
    );
    $setting->add_group('top_slider_group', true, $items);
    $settings[] = $setting;
  }
  return $settings;
}
add_filter('smart-cf-register-fields', 'my_add_meta_box', 10, 4);

これで、先ほど作成したオプションページに移動すると、カスタムフィールドが出現します!

Smart Custom Fieldsを使ってWordPressでスライダーを動的にする方法

※デバッグモードをtrueにしている場合、以下のような警告(Warning)がでますが、いったん無視してOKです。
邪魔な場合はデバッグモードをfalseにしましょう。
それでも消えない場合は、error_reporting(0);という記述をfunctions.phpに追記すればOKです。

Declaration of Smart_Custom_Fields_Controller_Option::admin_enqueue_scripts($hook) should be compatible with Smart_Custom_Fields_Controller_Base::admin_enqueue_scripts() in hoge\wp-content\plugins\smart-custom-fields\classes\controller\class.option.php on line 27
  • カスタムフィールドをfunctions.phpで管理する方法については以下の記事を参考にしてください。

https://yosiakatsuki.net/blog/smart-custom-fields-code-base/

04. 作成したオプションページにて各項目を設定

作成したオプションページにて、先ほど定義したカスタムフィールドの各項目に値を設定していきます。

Smart Custom Fieldsを使ってWordPressでスライダーを動的にする方法

05. phpファイルにて値を取得し出力

最後に、カスタムフィールドに設定した値を取得して表示したい場所に出力します。

<?php
$top_slider = SCF::get_option_meta('top_slider');
$top_slider_group = $top_slider['top_slider_group'];
if (!empty($top_slider_group)) :
?>

  <div class="mv-block">
    <div class="mv-slider">
      <?php foreach ($top_slider_group as $item) :
        //画像
        $top_img_pc_id = $item['top_slider_img_pc'];
        $top_img_pc_src = wp_get_attachment_url($top_img_pc_id);
        $top_img_sp_id = $item['top_slider_img_sp'];
        $top_img_sp_src = wp_get_attachment_url($top_img_sp_id);

        //alt
        $alt_pc = get_post_meta($top_img_pc_id, '_wp_attachment_image_alt', true);

        //テキスト
        $top_slider_text = $item['top_slider_text'];

        //ボタンリンク
        $top_slider_link = $item['top_slider_link'];
      ?>
        <div class="slider-item">
          <div class="slider-img">
            <picture>
              <source srcset="<?php echo $top_img_pc_src;?>" media="(min-width: 768px)" /><!-- 幅768px以上なら表示 -->
              <img src="<?php echo $top_img_sp_src;?>" alt="<?php echo $alt_pc;?>" />
            </picture>
          </div>
          <div class="slider-text slider-text01">
            <?php echo nl2br($top_slider_text);?>
          </div>
          <a href="<?php echo $top_slider_link;?>" class="slider-button">
            ボタン
          </a>
        </div>
      <?php endforeach; ?>
    </div>
  </div>
<?php endif; ?>

👇HTMLのマークアップは、以下の記事のSample05をベースにしています。
https://tips-web.net/slick-slider-sample/