Personal WP Customization Notes (PWCN)

WordPressで実際に行ったカスタマイズの記録、発生した問題への対処時のメモ、ブロックテーマのカスタマイズなど

Swiperを利用したヒーロースライダーの作り方

ヘッダー部分で大きな全幅画像スライダーの中にサイトタイトルやメニューなどが配置されているサイトを見かけることありますよね。

このコンテンツを世界的には「ヒーロースライダー」と呼んでいて、特に企業や商店などのサイトでは企業イメージをドーンと表示させてアピールするのにちょうどいい演出なのではないかと思います。

また、このコンテンツは、有料・無料テーマのウリとして導入されているものが多く、あまり知らない方はそのテーマでないと使えない、もしくはSmart Slider 3などの専用プラグインを使わないと実装できないと思われている方も多いのではないかと思います。

ただ、テーマやプラグインの仕様の多くは、専用の編集画面があってショートコードやブロックとして挿入するようになっていて、いろいろなユースケースに対応させるために大きなJSやCSSのファイルを読み込む必要があり、サイトの表示速度を低下させたり、サーバーに負荷をかけたりすることがあります。

そこで今回は以下のような機構と仕様でヒーロースライダーを比較的軽量に実装する方法を紹介します。

  • スライド動作させるJavaScriptライブラリにはSwiperを利用する(CDNから読み込み)
  • 全幅スライダー表示と全面に固定するコンテンツを表示する軽量なCSSの読み込み
  • ショートコードパラメーターで以下のような調整ができるようにする
    • 画像のIDを列記することで、画像の枚数と順番を自由に変更できる
    • パターンのIDを指定することで、全面に表示するコンテンツをパターンの編集画面からいつでも簡単に編集できる
    • 画像を表示させる時間、画像遷移時の時間指定ができる
    • パソコン表示時の高さ、モバイル表示時の高さ調整ができる

細かなことは調整が必要ではあるものの、専用テーマを使わなくても、専用プラグインを使わなくても実装できますので試してみてはいかがでしょうか?

HA Canvasという私が作成したブロックテーマを使って動作の検証を行ったものです。クラシックテーマや他のブロックテーマでは、構造により表示の調整などが必要な場合があります

私が開発・配布しているHima Art Utilityプラグインの紹介サイトのトップページでこのヒーロースライダーを使っていますので、デモ代わりにご覧ください(Hima Art Utilityプラグインのバージョン6.2以降ではこのヒーロースライダーショートコードを利用できます)。

Swiperを利用したヒーロースライダーの実装手順

前準備(環境)

本機能を実装するためには以下の環境が必要です。

  • フロントエンドでスタイルコードを適用させるためのコードとファイル(テーマのstyle.cssなど)
  • フロントエンドでスクリプトを実行させるためのファイル(テーマのcustom.jsなど)

これらを実装する方法は割愛しますので、もしも有効化しているテーマにそのような機構がない場合には自前で実装するか、以下のプラグインを使って試してみてください。

以降、Hima Art My Functionsプラグインを使用した前提で説明していきます

プログラムの追加

Swiperライブラリの読み込みと、ヒーロースライダーショートコードを実装するコードを、「custom-functions.phpへ追加します。

Swiperの読み込み

以下のコードを追加して、Swiper公式のCDN(Content Delivery Network)からスクリプトとCSSを都度読み込むようにします。

function pwcn_enqueue_swiper_assets() {
	// Swiper CSS
	wp_enqueue_style(
		'pwcn-swiper-css',
		'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css',
		array(),
		'11.0.0'
	);

	// Swiper JS
	wp_enqueue_script(
		'pwcn-swiper-js',
		'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js',
		array(),
		'11.0.0',
		true
	);
}
add_action('wp_enqueue_scripts', 'pwcn_enqueue_swiper_assets');

ショートコード生成プログラムの追加

以下のコードを追加して、ショートコードを使ってヒーロースライダーが表示されるようになるプログラムを追加します。

function pwcn_hero_slider_component_shortcode($atts) {
	$atts = shortcode_atts(array(
		'slide_ids'  => '',
		'content_id' => '',
		'speed'      => '1000',
		'delay'      => '5000',
		'effect'     => 'fade',
		'pc_height' => '600',
		'mobile_height' => '300',
	), $atts);

	// 属性のエスケープと値の取得
	$speed  = esc_attr($atts['speed']);
	$delay  = esc_attr($atts['delay']);
	$effect = esc_attr($atts['effect']);

	if(empty( $atts['pc_height'] )){
	$pc_height = absint(600);
	}else{
		$pc_height = absint($atts['pc_height']);
	}

	if(empty( $atts['mobile_height'] )){
		$mobile_height = absint(300);
	}else{
		$mobile_height = absint($atts['mobile_height']);
	}
    

	// data属性としてHTMLに埋め込む
	if( wp_is_mobile() ){
		$output = '<div class="hero-wrapper" data-speed="' . $speed . '" data-delay="' . $delay . '" data-effect="' . $effect . '" style="height:'.$mobile_height.'px; min-height:'.$mobile_height.'px;">';
	}else{
		$output = '<div class="hero-wrapper" data-speed="' . $speed . '" data-delay="' . $delay . '" data-effect="' . $effect . '" style="height:'.$pc_height.'px;">';
	}
    
    
	// 背景スライダー
	$output .= '<div class="swiper js-swiper-slider"><div class="swiper-wrapper">';
	$slide_ids = array_map('trim', explode(',', $atts['slide_ids']));
	foreach ($slide_ids as $img_id) {
		$output .= '<div class="swiper-slide">';
		$output .= wp_get_attachment_image($img_id, 'full', false, array('class' => 'hero-slide-img'));
		$output .= '</div>';
	}
	$output .= '</div></div>';

	// 固定コンテンツ(パターン)
	if (!empty($atts['content_id'])) {
		$pattern_post = get_post($atts['content_id']);
		if ($pattern_post && $pattern_post->post_type === 'wp_block') {
			$output .= '<div class="fixed-content">';
			$output .= do_blocks($pattern_post->post_content);
			$output .= '</div>';
		}
	}

	$output .= '</div>';

	return $output;
}
add_shortcode('pwcn_hero_slider_component', 'pwcn_hero_slider_component_shortcode');

スクリプトとスタイルコードの追加

今回のヒーロースライダーが動作するためのJSコードと、表示の体裁を整えるためのスタイルコードを追加します。

JSコードの追加

「custom-js.js」へ以下のコードを追加します。

/*** Heroスライダー ***/
document.addEventListener('DOMContentLoaded', function () {
	const sliderElements = document.querySelectorAll('.hero-wrapper');
    
	sliderElements.forEach(function (wrapperEl) {
		const sliderEl = wrapperEl.querySelector('.js-swiper-slider');
        
		// HTMLの data 属性から値を取得(指定がない場合はデフォルト値)
		const speed = parseInt(wrapperEl.dataset.speed, 10) || 1000;
		const delay = parseInt(wrapperEl.dataset.delay, 10) || 5000;
		const effect = wrapperEl.dataset.effect || 'fade';

		// Swiperオプションの構築
		const swiperOptions = {
			loop: true,
			speed: speed,
			effect: effect,
			autoplay: {
				delay: delay,
				disableOnInteraction: false,
			},
		};

		// フェードの場合の設定
		if (effect === 'fade') {
			swiperOptions.fadeEffect = { crossFade: true };
		}

		new Swiper(sliderEl, swiperOptions);
	});
});

スタイルコードの追加

「custom-style.css」へ以下のコードを追加します。

/*** スライダー全体のレイアウト ***/
.hero-wrapper {
	position: relative;
	width: 100vw;
	left: 50%;
	margin-left: -50vw !important;
	max-width: 100vw;
}

/* 背景スライダー */
.hero-wrapper .js-swiper-slider {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	z-index: 1;
}

.hero-wrapper .swiper-slide img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* 上に重ねる固定コンテンツ(縦方向の中央配置) */
.hero-wrapper .fixed-content {
	position: absolute;
	top: 50%;
	left: 0;
	transform: translate(0%, -50%);
	width: 100%;
	z-index: 10;
	pointer-events: none; /* マウス操作を後ろのスライドに抜かす */
}

/* 固定コンテンツ内のリンクやボタンはクリック可能にする */
.hero-wrapper .fixed-content a,
.hero-wrapper .fixed-content button {
	pointer-events: auto;
}

表示テスト

ここまでで必要なコードの追加は終了です。以下の手順で動作確認をしていきましょう。

今回のヒーロースライダーショートコードでは、パラメーターに画像や内部コンテンツのIDを指定する必要がありますので、メディアやパターン一覧でIDを表示する方法は以下を参考にしてください。

また、内部の固定コンテンツについてはパターンで作成しますので、以下のコードを「custom-functions.php」へ追加して、管理画面のメインメニューへパターン一覧へのリンクメニューを作っておくと便利です。

/***** 管理画面のサイドバーメニューに「パターン」リンクを追加 *****/
function pwcn_add_reuse_list_admin_menu() {
	add_menu_page( __('Pattern','hima-art-utility'), __('Pattern','hima-art-utility'), 'manage_options', 'edit.php?post_type=wp_block', '', 'dashicons-screenoptions', 6 );
}
add_action( 'admin_menu', 'pwcn_add_reuse_list_admin_menu' );

テストはテスト用の投稿を作って追加しても、ヘッダーに直接追加しても可能ですが、通常のサイトで表示させるのはヘッダーですので、できればブロックテーマのサイトエディターからヘッダーパーツへ追加して試すことをおすすめします

スライダーとして表示する画像をアップロードし、IDを控えておきます。

新規に非同期のパターンを1つ作成し、IDを控えておきます(中身はひとまず段落ブロックに「固定コンテンツ」と書いて保存しておけばいいでしょう)。

以下のショートコードを追加します。

[pwcn_hero_slider_component slide_ids="" content_id="" speed="" delay="" effect="" pc_height="" mobile_height=""]

以下がショートコードの各パラメーターです。まずは画像のID(「,」区切りで指定)と、パターンのIDを設定して、保存後、プレビュー表示してみてください。

画像が表示され、一定期間過ぎたらフェードアウト&フェードインで切り替わり、中に「固定コンテンツ」という文字列が常時表示されれば実装自体は完了です。

パラメーター役割デフォルト値
slide_ids画像のIDです。スライド切り替えする画像のIDを「,」区切りで指定します
content_idスライダー内部に固定表示させるパターンのIDを指定します
speed画像が切り替わる速度をミリ秒単位で指定します1000
delay1つの画像の表示時間をミリ秒単位で指定します5000
effect画像遷移の方法を指定します(fade:フェード、slide:スライド など)fade
pc_heightパソコン表示時のヒーロースライダーの高さをpx単位で指定します600
mobile_heightモバイル・タブレット表示時のヒーロースライダーの高さをpx単位で指定します300

きちんと動作したらパラメーターでいろいろと変更ができるかを試してください。

また、パターンの中に書いた「固定コンテンツ」の内容を変えたり、見出しを足したり、配置を変えたり、メニューを追加したり..などしていい感じに表示されるかを確認してみてください(冒頭で書きましたが、テーマによってはスタイルの調整が必要な場合があります)。

もしも動作しない場合には、ブラウザキャッシュのクリア(Ctrl+F5)をしてみて、それでも動作しなければデベロッパーツールなどを使用してスクリプトやCSSがきちんと読み込まれているかを確認ください

コメントを残す

メールアドレスが公開されることはありません。※ が付いている欄は必須項目です

※リンクやURLの挿入されているコメントは無視します