2026年9月19日

2026年9月19日

WordPressのギャラリーブロックにMasonry・Packeryレイアウトを追加する方法

WordPress標準のギャラリーブロックを、縦長・横長の写真が隙間なく積み重なるレイアウトにしたい場合は、WordPress本体に同梱されているMasonryを読み込み、ギャラリーに付けた独自クラスに対して適用するのが手軽です。大きさの違う画像を混ぜて隙間を詰めたい場合はPackeryを使います。この記事では、両者の違いと選び方、ギャラリーブロック側の準備、CSSとJavaScriptの実装、表示崩れやレイアウトのずれ(CLS)への対策、CSSだけで作る場合の注意点までを説明します。

ここではMasonryレイアウトの一般論ではなく、ブロックエディターのギャラリーブロックに組み込む手順に絞っています。コードは子テーマに置く前提です。親テーマを直接編集すると更新で消えるため、子テーマを用意してから作業し、ステージング環境で表示を確認してから本番に反映してください。

MasonryとPackeryの違い

どちらもMetafizzyが公開しているJavaScriptのレイアウトライブラリで、使い方もよく似ています。

  • Masonry:同じ幅の列を用意し、各画像を「いちばん高さの低い列」に順に積んでいきます。幅がそろった写真ギャラリーに向いています。WordPress本体に同梱されており、スクリプトのハンドル名 masonry で読み込めます(依存関係として imagesloaded も読み込まれます)。ライセンスはMITです。
  • Packery:空いている隙間を探して要素を詰める方式で、2列分の幅を持つ画像など、大きさの違う要素を混ぜても隙間が出にくいのが特徴です。WordPressには同梱されていないため、公式サイトから入手して子テーマに置きます。ライセンスは、オープンソースのプロジェクト向けにGPLv3、商用の利用向けに有償の商用ライセンスが用意されています。条件は変わる可能性があるため、採用前に公式サイトのライセンス説明を確認してください。

同じ幅の写真を並べるだけならMasonryで十分です。「この1枚だけ大きく見せたい」といった要件があるときにPackeryを検討します。なお、どちらのライブラリも近年は大きな更新が行われていません(2026年10月現在)。今の用途で問題なく動きますが、長く使う前提なら、後述のCSSでの実装の動向も合わせて見ておくとよいでしょう。

手順1:ギャラリーブロックを準備する

まず、Masonryを適用したいギャラリーに目印となるクラスを付けます。

  1. 投稿の編集画面でギャラリーブロックを選択する
  2. 右側の設定パネルの「高度な設定」を開き、「追加CSSクラス」に is-masonry と入力する
  3. ギャラリーの設定にある、画像を同じ大きさに切り抜く設定(「画像の切り抜き」などの名称)をオフにする

3つ目が重要です。切り抜きがオンのままだと、画像が同じ高さにそろえて切り取られるため、高さの違いを活かすMasonryの意味がなくなります。設定の名称や位置はWordPressのバージョンによって異なることがあります。

ギャラリーブロックは、WordPress 5.9以降、中の画像が一つずつ独立した画像ブロック(figure.wp-block-image)として出力されます。この後のコードはこの構造を前提にしています。

手順2:CSSで列の幅を決める

Masonryでは、列の幅と列の間隔をCSSで決め、その大きさを測るための空の要素(サイザー)をJavaScriptから参照させる方法が扱いやすくなります。子テーマに css/masonry-gallery.css を作ります。

/* 3列:列幅32%+間隔2% */
.wp-block-gallery.is-masonry {
	display: block;
}
.wp-block-gallery.is-masonry > .masonry-sizer,
.wp-block-gallery.is-masonry > figure.wp-block-image:not(#individual-image) {
	width: 32%;
	margin: 0 0 2% 0;
}
.wp-block-gallery.is-masonry > .masonry-gutter {
	width: 2%;
}
.wp-block-gallery.is-masonry figure.wp-block-image img {
	width: 100%;
	height: auto;
}

/* 狭い画面では2列 */
@media (max-width: 600px) {
	.wp-block-gallery.is-masonry > .masonry-sizer,
	.wp-block-gallery.is-masonry > figure.wp-block-image:not(#individual-image) {
		width: 49%;
	}
}

/* ギャラリー全体のキャプションを最下部に置く */
.wp-block-gallery.is-masonry > .blocks-gallery-caption {
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
}
.wp-block-gallery.is-masonry:has(> .blocks-gallery-caption) {
	margin-bottom: 3em;
}

WordPress本体のギャラリー用CSSは、テーマのCSSに負けないよう詳細度を高めに書かれています。そのため、上の例でも本体と同じ :not(#individual-image) を付けて詳細度を合わせています。それでも幅が効かない場合は、ブラウザーの開発者ツールで画像の figure 要素を選び、どのCSSが勝っているかを確認してください。

列の幅をJavaScriptの実行前から指定しておくのは、レイアウトのずれを小さくするためです。この点は後で説明します。

手順3:JavaScriptでMasonryを適用する

子テーマに js/masonry-gallery.js を作ります。jQueryは不要です。

( function () {
	const reduceMotion = window.matchMedia( '(prefers-reduced-motion: reduce)' ).matches;

	function init() {
		document.querySelectorAll( '.wp-block-gallery.is-masonry' ).forEach( function ( gallery ) {
			const sizer = document.createElement( 'div' );
			sizer.className = 'masonry-sizer';
			sizer.setAttribute( 'aria-hidden', 'true' );

			const gutter = document.createElement( 'div' );
			gutter.className = 'masonry-gutter';
			gutter.setAttribute( 'aria-hidden', 'true' );

			gallery.prepend( sizer, gutter );

			const msnry = new Masonry( gallery, {
				itemSelector: '.wp-block-image',
				columnWidth: '.masonry-sizer',
				gutter: '.masonry-gutter',
				percentPosition: true,
				transitionDuration: reduceMotion ? 0 : '0.2s'
			} );

			// 画像の読み込みが進むたびに配置をやり直す
			imagesLoaded( gallery ).on( 'progress', function () {
				msnry.layout();
			} );
		} );
	}

	if ( document.readyState === 'loading' ) {
		document.addEventListener( 'DOMContentLoaded', init );
	} else {
		init();
	}
} )();

transitionDuration は、画像が移動するときのアニメーション時間です。OSの設定で「視差効果を減らす」などを選んでいる利用者(prefers-reduced-motion: reduce)には、アニメーションなしで配置します。

手順4:functions.phpで読み込む

子テーマの functions.php に、ギャラリーブロックを含むページだけでファイルを読み込む処理を書きます。

add_action( 'wp_enqueue_scripts', function () {
	if ( ! is_singular() || ! has_block( 'core/gallery' ) ) {
		return;
	}

	$dir = get_stylesheet_directory();
	$uri = get_stylesheet_directory_uri();

	wp_enqueue_style(
		'my-masonry-gallery',
		$uri . '/css/masonry-gallery.css',
		array(),
		filemtime( $dir . '/css/masonry-gallery.css' )
	);

	wp_enqueue_script(
		'my-masonry-gallery',
		$uri . '/js/masonry-gallery.js',
		array( 'masonry', 'imagesloaded' ),
		filemtime( $dir . '/js/masonry-gallery.js' ),
		array(
			'in_footer' => true,
			'strategy'  => 'defer',
		)
	);
} );

wp_enqueue_script() の5つ目の引数に配列で strategy を渡す書き方は、WordPress 6.3以降で使えます。バージョンの数値に filemtime() を使うと、ファイルを更新したときにブラウザーのキャッシュが自動で切り替わります。

has_block() は記事本文の中のブロックを調べる関数です。テンプレートパーツやウィジェット、再利用ブロック(パターン)の中に置いたギャラリーは検出できないことがあるため、そうした場所で使う場合は条件を外すか、別の条件で読み込みます。

Packeryに切り替える場合

Packeryを使うときは、公式サイトから入手した packery.pkgd.min.js を子テーマの js/ に置き、独自のハンドル名で登録します。

wp_register_script(
	'packery',
	get_stylesheet_directory_uri() . '/js/packery.pkgd.min.js',
	array( 'imagesloaded' ),
	'2.1.2',
	array( 'in_footer' => true )
);

手順4の依存関係の masonry を packery に置き換え、JavaScriptの new Masonry( を new Packery( に変えます。itemSelector、columnWidth、gutter、percentPosition、transitionDuration の各オプションは同じ名前で使えます。バージョン番号の 2.1.2 は例なので、入手したファイルのものに合わせてください。

大きく見せたい画像には、その画像ブロックの「追加CSSクラス」に is-wide と入れ、2列分の幅を指定します。

.wp-block-gallery.is-masonry > figure.wp-block-image.is-wide:not(#individual-image) {
	width: 66%;
}

3列(32%+間隔2%)の場合、2列分は32%×2+2%=66%です。この計算が合っていないと、Packeryでも隙間が残ります。

レイアウトのずれ(CLS)と表示の確認

MasonryやPackeryは、JavaScriptが動いてから画像の位置を一つずつ指定して並べ直すため、読み込みの途中で画像の位置が動きます。これはCore Web VitalsのCLS(Cumulative Layout Shift)が悪化する原因になります。次の工夫でずれを小さくできます。

  • 列の幅を最初からCSSで決めておく:手順2のように、JavaScriptの実行前から同じ幅にしておけば、変わるのは縦の位置だけになります。
  • 画像に幅と高さの属性を持たせる:WordPressは通常、本文の画像に width と height の属性を付けて出力します。CSSで height: auto にしておくと、画像の読み込み前から縦横比に合った領域が確保されるため、遅延読み込み(loading="lazy")の画像でも配置が大きく崩れません。
  • ページの最上部に置かない:ファーストビューに大きなギャラリーがあると、ずれが目に入りやすく、CLSにも影響しやすくなります。

確認は、PageSpeed InsightsやChromeの開発者ツールのPerformanceパネルで行います。キーボードの操作順序はHTMLの並び順のままなので、Tabキーで画像のリンクを順にたどり、極端に飛ぶ箇所がないかも見ておきます。

CSSだけで作る場合

JavaScriptを使わずに、CSSの段組み(columns)で似た見た目を作ることもできます。

.wp-block-gallery.is-masonry-css {
	display: block;
	columns: 3;
	column-gap: 1rem;
}
.wp-block-gallery.is-masonry-css > figure.wp-block-image:not(#individual-image) {
	width: auto;
	margin: 0 0 1rem;
	break-inside: avoid;
}

この方法はずれが起きない反面、画像が「左の列を上から下へ、次に隣の列へ」という順に並ぶため、見た目の順序が横方向になりません。時系列に並べたい写真には向きません。CSS Gridを使ったMasonry形式のレイアウトは仕様の検討とブラウザーへの実装が進んでいる段階で、対応状況はブラウザーによって異なります。採用する場合は、MDNやCan I useで最新の対応状況を確認し、未対応のブラウザーでも通常のグリッドとして読める形にしておきます。

まとめ

  • 同じ幅の写真を積むならWordPress同梱のMasonry、大きさの違う画像を混ぜるならPackeryを使う
  • Packeryは同梱されておらず、商用利用ではライセンスの確認が必要
  • ギャラリーブロックに is-masonry クラスを付け、画像の切り抜き設定をオフにする
  • 列の幅と間隔はCSSで決め、本体CSSの詳細度に合わせて上書きする
  • スクリプトはギャラリーのあるページだけで strategy 付きで読み込み、prefers-reduced-motion に配慮する
  • 幅を先に決めておくこと、画像の幅・高さ属性を活かすことでCLSを抑える

お気軽にご相談ください

お見積りへ お問い合わせへ
▲