2026年5月20日
2026年5月20日
WordPressでCSSカスタムプロパティ(CSS変数)を使う方法|theme.jsonとの関係
CSS カスタムプロパティ(CSS 変数)は、--color-primary: #2271b1; のように名前を付けた値を定義し、var(--color-primary) で参照する CSS の仕組みです。色や余白を1か所で決めておけば、変えるときもその1か所を直すだけで済みます。
WordPress では、自分で定義する変数のほかに、テーマの theme.json に書いた色や文字サイズから WordPress が自動で作る変数(--wp--preset--…)も使えます。この記事では両方の使い方と、カスタマイザーや JavaScript との組み合わせ方を説明します。theme.json の仕様は、2026年10月時点の WordPress 開発者向けドキュメント(theme.json バージョン3)で確認しています。
基本: :rootで定義してvar()で参照する
子テーマの style.css か、「外観」→「カスタマイズ」→「追加 CSS」に書きます(ブロックテーマでは、サイトエディターの「スタイル」から開ける「追加 CSS」)。
:root {
/* 色 */
--color-primary: #2271b1;
--color-primary-dark: #135e96;
--color-text: #1d2327;
--color-bg-alt: #f0f0f1;
/* 余白 */
--space-sm: 1rem;
--space-md: 1.5rem;
/* 角の丸み */
--radius: 4px;
}
.site-header {
background: var(--color-primary);
padding: var(--space-sm) var(--space-md);
}
.notice-box {
background: var(--color-bg-alt);
border-left: 4px solid var(--color-primary);
border-radius: var(--radius);
/* 2つ目の値は、変数が定義されていないときに使われる */
color: var(--color-note, var(--color-text));
}
:rootは HTML 全体(<html>要素)を指します。ここで定義した変数は、ページのどこからでも参照できます。- 変数は子の要素に引き継がれます。
.dark-section { --color-text: #fff; }のように、一部の範囲だけ値を変えることもできます。 - 名前は
--で始め、大文字と小文字は区別されます。 - 現在の主要なブラウザーはすべて対応しています。Internet Explorer は対応していませんが、WordPress も 5.8 で Internet Explorer 11 のサポートを終えています。
theme.jsonのプリセットから作られる変数
theme.json の settings に色・文字サイズ・余白のプリセット(エディターで選べる候補)を書くと、WordPress はそれぞれに対応する CSS 変数を作り、ページに出力します。プリセットの名前(name)はエディターに表示され、slug が変数名の一部になります。
{
"$schema": "https://schemas.wp.org/trunk/theme.json",
"version": 3,
"settings": {
"color": {
"palette": [
{ "slug": "primary", "color": "#2271b1", "name": "Primary" },
{ "slug": "accent", "color": "#d63638", "name": "Accent" }
]
},
"typography": {
"fontSizes": [
{ "slug": "small", "size": "0.875rem", "name": "Small" },
{ "slug": "large", "size": "1.5rem", "name": "Large" }
]
},
"spacing": {
"spacingSizes": [
{ "slug": "40", "size": "1rem", "name": "Medium" },
{ "slug": "60", "size": "2.5rem", "name": "Large" }
]
}
}
}
この設定から作られる変数は次のとおりです。
| 設定 | 作られる変数 | 例 |
|---|---|---|
color.palette |
--wp--preset--color--{slug} |
--wp--preset--color--primary |
typography.fontSizes |
--wp--preset--font-size--{slug} |
--wp--preset--font-size--large |
spacing.spacingSizes |
--wp--preset--spacing--{slug} |
--wp--preset--spacing--40 |
色のプリセットからは、変数に加えて .has-primary-color(文字色)や .has-primary-background-color(背景色)のようなクラスも作られます。エディターで色を選ぶと、ブロックにこのクラスが付きます。文字サイズからは .has-large-font-size のようなクラスが作られます。
テーマの CSS からは、これらの変数をそのまま参照できます。
.site-header {
background: var(--wp--preset--color--primary);
padding: var(--wp--preset--spacing--40);
}
.site-title {
font-size: var(--wp--preset--font-size--large);
}
- 色の値は
theme.jsonで変えます。CSS で--wp--preset--color--primaryを直接上書きすると、エディターで選べる色とページの色が食い違います。 - 自分で決めた名前を使いたい場合は、
:root { --color-primary: var(--wp--preset--color--primary); }のように、プリセットの変数を参照する形にすると、値をtheme.jsonの1か所で管理できます。 - WordPress が用意している既定の文字サイズや余白のプリセットも、
--wp--preset--…の変数として出力されます。既定のプリセットを使わない場合は、typography.defaultFontSizesやspacing.defaultSpacingSizesをfalseにします。
theme.jsonのcustomで独自の変数を作る
プリセットに当たらない値(行の高さ、角の丸みなど)は、settings.custom に書くと変数として出力されます。
{
"$schema": "https://schemas.wp.org/trunk/theme.json",
"version": 3,
"settings": {
"custom": {
"lineHeight": {
"body": "1.8",
"heading": "1.3"
},
"radius": "4px"
}
}
}
作られる変数は次のとおりです。
--wp--custom--line-height--body: 1.8;
--wp--custom--line-height--heading: 1.3;
--wp--custom--radius: 4px;
キーは --wp--custom-- の後ろに、入れ子ごとに -- でつながれます。lineHeight のような大文字を含む名前は、line-height のようにハイフンでつないだ小文字に変わります。
カスタマイザーで選んだ色を変数にする
クラシックテーマで、「外観」→「カスタマイズ」の色の設定から主な色を変えられるようにし、その値を CSS 変数として出力する例です。子テーマの functions.php に追加します。
<?php
add_action( 'customize_register', function ( WP_Customize_Manager $wp_customize ): void {
$wp_customize->add_setting( 'wpdr_primary_color', array(
'default' => '#2271b1',
'sanitize_callback' => 'sanitize_hex_color',
'transport' => 'refresh',
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'wpdr_primary_color', array(
'label' => 'メインの色',
'section' => 'colors',
) ) );
} );
add_action( 'wp_head', function (): void {
$color = sanitize_hex_color( get_theme_mod( 'wpdr_primary_color', '#2271b1' ) );
if ( ! $color ) {
return;
}
printf( '<style id="wpdr-custom-properties">:root { --color-primary: %s; }</style>' . "\n", esc_html( $color ) );
} );
colorsは WordPress が用意しているカスタマイザーの「色」セクションの ID です。sanitize_hex_colorは、#2271b1のような16進数の色だけを通し、それ以外は空にします。出力の前にも同じ関数を通しているので、不正な値が CSS に入りません。- テーマの CSS が
var(--color-primary)を参照していれば、カスタマイザーで色を変えるだけでサイト全体の色が変わります。 'transport' => 'refresh'は、色を変えるたびにプレビューを読み込み直す設定です。読み込み直さずに即座に反映させる'postMessage'にする場合は、プレビュー側で値を受け取る JavaScript も必要です。- ブロックテーマでは、「外観」に「カスタマイズ」が通常は表示されません。ブロックテーマでは、
theme.jsonのプリセットと、サイトエディターの「スタイル」で色を変えます。
JavaScriptから読み書きする
CSS 変数は JavaScript から読み書きできます。ダークモードの切り替えなどに使えます。
const root = document.documentElement;
// 現在の値を読む(前後の空白を除く)
const primary = getComputedStyle( root ).getPropertyValue( '--color-primary' ).trim();
console.log( primary ); // 例: "#2271b1"
// 値を変える(<html> 要素の style 属性に書き込まれる)
root.style.setProperty( '--color-primary', '#d63638' );
// まとめて変える
const darkTheme = {
'--color-text': '#f0f0f1',
'--color-bg-alt': '#1d2327',
};
Object.entries( darkTheme ).forEach( function ( [ name, value ] ) {
root.style.setProperty( name, value );
} );
// 元に戻す(style 属性から取り除くと、CSS の値に戻る)
root.style.removeProperty( '--color-primary' );
setProperty() で書き込んだ値は <html> 要素の style 属性に入るため、:root に書いた CSS の値より優先されます。ページを移動すると消えるので、切り替えを覚えておく場合は localStorage などに保存し、次のページで読み込み直す処理が必要です。
まとめ
- CSS 変数は
:rootで--名前: 値;と定義し、var(--名前)で参照する。var()の2つ目の値は、変数が無いときの代わりの値になる。 theme.jsonのプリセットからは--wp--preset--color--{slug}・--wp--preset--font-size--{slug}・--wp--preset--spacing--{slug}が、settings.customからは--wp--custom--…が作られる。プリセットの値はtheme.jsonで変え、CSS で直接上書きしない。- クラシックテーマでは、カスタマイザーの値を
wp_headで:rootの変数として出力すると、CSS を変えずに色を切り替えられる。 - JavaScript では
getComputedStyle().getPropertyValue()で読み、style.setProperty()で書き換える。