Rationale

ブロックエディタAPIは異なる速度で進化しており、特にテーマに影響を与える領域では成長痛が見られます。これに関する例としては、エディタをプログラム的に制御する能力や、ユーザー、テーマ、コアスタイルの好みを容易にするブロックスタイルシステムがあります。

これは、スタイルに関連するさまざまなAPIを単一のポイントに統合するための現在の取り組みを説明しています。これは、テーマディレクトリのルート内に配置されるべきtheme.jsonファイルです。

Settings for the block editor

テーマサポートフラグや代替手段の増加の代わりに、theme.jsonファイルはブロックエディタの設定を定義するための標準的な方法を提供します。これらの設定には、次のようなものが含まれます:

  • ユーザーに対してどのカスタマイズオプションを利用可能または非表示にするか。
  • ユーザーに利用可能なデフォルトの色、フォントサイズなど。
  • エディタのデフォルトレイアウト(幅と利用可能な配置)を定義します。

Settings can be controlled per block

より細かい制御のために、これらの設定はtheme.json内のブロックレベルでも機能します。

達成できる例は次のとおりです:

  • 特定のプリセットをブロック(例:テーブル)に使用し、他のブロックには共通のものを使用する。
  • 見出しブロック以外のすべてのブロックにフォントサイズのUIコントロールを有効にする。
  • その他。

Styles are managed

  1. いくつかの利点は次のとおりです:
  2. - エンキューされるCSSの量を減らす。
  3. - 特異性の戦争を防ぐ。
  4. <a name="css-custom-properties-presets-custom"></a>
  5. ### CSS Custom Properties: presets &amp; custom
  6. サイト全体で変更できる共有値を持つことが利益となるスタイリングの領域があります。
  7. このニーズに対処するために、私たちはいくつかの場所でCSSカスタムプロパティ、別名CSS変数を使った実験を始めました:
  8. - **プリセット**:テーマによって宣言された[カラーパレット](a79eb3e4eb9df7a2.md#block-color-palettes)、[フォントサイズ](a79eb3e4eb9df7a2.md#block-font-sizes)、または[グラデーション](a79eb3e4eb9df7a2.md#block-gradient-presets)はCSSカスタムプロパティに変換され、フロントエンドとエディタの両方にエンキューされます。
  9. ``````bash
  10. {
  11. "version": 3,
  12. "settings": {
  13. "color": {
  14. "palette": [
  15. {
  16. "name": "Black",
  17. "slug": "black",
  18. "color": "#000000"
  19. },
  20. {
  21. "name": "White",
  22. "slug": "white",
  23. "color": "#ffffff"
  24. }
  25. ]
  26. }
  27. }
  28. }
  29. `
  1. body {
  2. --wp--preset--color--black: #000000;
  3. --wp--preset--color--white: #ffffff;
  4. }
  • カスタムプロパティ:独自のCSSカスタムプロパティを作成するためのメカニズムもあります。
  1. {
  2. "version": 3,
  3. "settings": {
  4. "custom": {
  5. "line-height": {
  6. "body": 1.7,
  7. "heading": 1.3
  8. }
  9. }
  10. }
  11. }
  1. body {
  2. --wp--custom--line-height--body: 1.7;
  3. --wp--custom--line-height--heading: 1.3;
  4. }

Specification

この仕様は、この形式を使用する3つの異なる起源(コア、テーマ、ユーザー)に対して同じです。テーマは、theme.jsonというファイルを作成することでコアのデフォルトをオーバーライドできます。ユーザーは、サイトエディタを介して、作業中のユーザーインターフェースを介してテーマやコアの設定をオーバーライドすることもできます。

  1. {
  2. "version": 3,
  3. "settings": {},
  4. "styles": {},
  5. "customTemplates": {},
  6. "templateParts": {}
  7. }

Version

このフィールドはtheme.jsonファイルのフォーマットを説明します。最新のバージョンは、WordPress 6.6で導入されたバージョン3です。

破壊的な変更が必要な場合に新しいバージョンが導入されます。これにより、テーマの著者は破壊的な変更にオプトインするタイミングを選択し、theme.jsonファイルを新しいフォーマットに移行できます。

古いバージョンのtheme.jsonは後方互換性があり、新しいバージョンのWordPressやGutenbergプラグインでも引き続き機能します。ただし、新機能は最新のバージョンで開発されます。

最新バージョンへの更新の詳細については、新しいバージョンへの移行手順を参照してください。

Settings

Gutenbergプラグインは、WordPress 5.8から利用可能な設定を拡張し、他のWordPressバージョンでも使用できるようにし、コアに移植される前に成熟プロセスを経ます。

以下のタブは、WordPress 5.8でサポートされている設定とGutenbergプラグインでサポートされている設定を示しています。

設定セクションは次の構造を持っています:

  1. {
  2. "version": 3,
  3. "settings": {
  4. "border": {
  5. "radius": false,
  6. "color": false,
  7. "style": false,
  8. "width": false
  9. },
  10. "color": {
  11. "custom": true,
  12. "customDuotone": true,
  13. "customGradient": true,
  14. "duotone": [],
  15. "gradients": [],
  16. "link": false,
  17. "palette": [],
  18. "text": true,
  19. "background": true,
  20. "defaultGradients": true,
  21. "defaultPalette": true
  22. },
  23. "custom": {},
  24. "layout": {
  25. "contentSize": "800px",
  26. "wideSize": "1000px"
  27. },
  28. "spacing": {
  29. "margin": false,
  30. "padding": false,
  31. "blockGap": null,
  32. "units": [ "px", "em", "rem", "vh", "vw" ]
  33. },
  34. "typography": {
  35. "customFontSize": true,
  36. "lineHeight": false,
  37. "dropCap": true,
  38. "fluid": false,
  39. "fontStyle": true,
  40. "fontWeight": true,
  41. "letterSpacing": true,
  42. "textDecoration": true,
  43. "textTransform": true,
  44. "fontSizes": [],
  45. "fontFamilies": []
  46. },
  47. "blocks": {
  48. "core/paragraph": {
  49. "color": {},
  50. "custom": {},
  51. "layout": {},
  52. "spacing": {},
  53. "typography": {}
  54. },
  55. "core/heading": {},
  56. "etc": {}
  57. }
  58. }
  59. }
  1. {
  2. "version": 3,
  3. "settings": {
  4. "appearanceTools": false,
  5. "border": {
  6. "color": false,
  7. "radius": false,
  8. "style": false,
  9. "width": false
  10. },
  11. "color": {
  12. "background": true,
  13. "custom": true,
  14. "customDuotone": true,
  15. "customGradient": true,
  16. "defaultGradients": true,
  17. "defaultPalette": true,
  18. "duotone": [],
  19. "gradients": [],
  20. "link": false,
  21. "palette": [],
  22. "text": true
  23. },
  24. "custom": {},
  25. "dimensions": {
  26. "aspectRatio": false,
  27. "minHeight": false,
  28. },
  29. "layout": {
  30. "contentSize": "800px",
  31. "wideSize": "1000px"
  32. },
  33. "spacing": {
  34. "blockGap": null,
  35. "margin": false,
  36. "padding": false,
  37. "customSpacingSize": true,
  38. "units": [ "px", "em", "rem", "vh", "vw" ],
  39. "spacingScale": {
  40. "operator": "*",
  41. "increment": 1.5,
  42. "steps": 7,
  43. "mediumStep": 1.5,
  44. "unit": "rem"
  45. },
  46. "spacingSizes": []
  47. },
  48. "typography": {
  49. "customFontSize": true,
  50. "dropCap": true,
  51. "fluid": false,
  52. "fontFamilies": [],
  53. "fontSizes": [],
  54. "fontStyle": true,
  55. "fontWeight": true,
  56. "letterSpacing": true,
  57. "lineHeight": false,
  58. "textAlign": true,
  59. "textColumns": false,
  60. "textDecoration": true,
  61. "textTransform": true
  62. },
  63. "blocks": {
  64. "core/paragraph": {
  65. "border": {},
  66. "color": {},
  67. "custom": {},
  68. "layout": {},
  69. "spacing": {},
  70. "typography": {}
  71. },
  72. "core/heading": {},
  73. "etc": {}
  74. }
  75. }
  76. }

各ブロックは、add_theme_supportを介して存在するこれらの設定のいずれかを個別に構成でき、すべてのブロックを一度に構成する方法を提供します。トップレベルで宣言された設定は、特定のブロックがそれを上書きしない限り、すべてのブロックに影響します。これは、継承を提供し、すべてのブロックを一度に構成する方法です。

ただし、すべての設定がすべてのブロックに関連するわけではないことに注意してください。設定セクションは、テーマに対してオプトイン/オプトアウトメカニズムを提供しますが、ブロックが関連する機能のサポートを追加する責任があります。たとえば、ブロックがdropCap機能を実装していない場合、テーマはtheme.jsonを介してそのブロックに対してそれを有効にすることはできません。

Opt-in into UI controls

特別な設定プロパティappearanceToolsがあり、これはブール値でデフォルト値はfalseです。テーマはこの設定を使用して次のものを有効にできます:

  • 背景:backgroundImage、backgroundSize
  • ボーダー:color、radius、style、width
  • 色:link
  • 寸法:aspectRatio、minHeight
  • 位置:sticky
  • スペーシング:blockGap、margin、padding
  • タイポグラフィ:lineHeight

Backward compatibility with add_theme_support

後方互換性を維持するために、ブロックエディタを構成する既存のadd_theme_support宣言は、トップレベルセクションの適切なカテゴリにレトロフィットされます。たとえば、テーマがadd_theme_support('disable-custom-colors')を使用している場合、settings.color.customfalseに設定するのと同じになります。theme.jsonに設定が含まれている場合、これらはadd_theme_supportを介して宣言された値よりも優先されます。これは完全な等価リストです:

add_theme_support theme.json設定
custom-line-height typography.lineHeighttrueに設定します。
custom-spacing spacing.paddingtrueに設定します。
custom-units spacing.unitsを介して単位のリストを提供します。
disable-custom-colors color.customfalseに設定します。
disable-custom-font-sizes typography.customFontSizefalseに設定します。
disable-custom-gradients color.customGradientfalseに設定します。
editor-color-palette color.paletteを介して色のリストを提供します。
editor-font-sizes typography.fontSizesを介してフォントサイズのリストを提供します。
editor-gradient-presets color.gradientsを介してグラデーションのリストを提供します。
editor-spacing-sizes spacing.spacingSizesを介してスペーシングサイズのリストを提供します。
appearance-tools appearanceToolstrueに設定します。
border border: color, radius, style, widthtrueに設定します。
link-color color.linktrueに設定します。

Presets

プリセットは設定セクションの一部です。これらは、いくつかのUIコントロールを介してユーザーに表示される値です。theme.jsonを介して定義することにより、エンジンはテーマのためにより多くのことを行うことができ、プリセット名を自動的に翻訳したり、対応するCSSクラスやカスタムプロパティをエンキューしたりできます。

次のプリセットはtheme.jsonを介して定義できます:

  • color.duotone:クラスやカスタムプロパティを生成しません。
  • color.gradients:プリセット値ごとに単一のクラスとカスタムプロパティを生成します。
  • color.palette
    • プリセット値ごとに3つのクラスを生成します:color、background-color、border-color。
    • プリセット値ごとに単一のカスタムプロパティを生成します。
  • spacing.spacingSizes/spacing.spacingScale:プリセット値ごとに単一のカスタムプロパティを生成します。
  • typography.fontSizes:プリセット値ごとに単一のクラスとカスタムプロパティを生成します。
  • typography.fontFamilies:プリセット値ごとに単一のカスタムプロパティを生成します。

クラスとカスタムプロパティの命名スキーマは次のとおりです:

  • カスタムプロパティ:--wp--preset--{preset-category}--{preset-slug}--wp--preset--color--blackのように
  • クラス:.has-{preset-slug}-{preset-category}.has-black-colorのように。
  1. {
  2. "version": 3,
  3. "settings": {
  4. "color": {
  5. "duotone": [
  6. {
  7. "colors": [ "#000", "#FFF" ],
  8. "slug": "black-and-white",
  9. "name": "Black and White"
  10. }
  11. ],
  12. "gradients": [
  13. {
  14. "slug": "blush-bordeaux",
  15. "gradient": "linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%)",
  16. "name": "Blush bordeaux"
  17. },
  18. {
  19. "slug": "blush-light-purple",
  20. "gradient": "linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%)",
  21. "name": "Blush light purple"
  22. }
  23. ],
  24. "palette": [
  25. {
  26. "slug": "strong-magenta",
  27. "color": "#a156b4",
  28. "name": "Strong magenta"
  29. },
  30. {
  31. "slug": "very-dark-grey",
  32. "color": "rgb(131, 12, 8)",
  33. "name": "Very dark grey"
  34. }
  35. ]
  36. },
  37. "typography": {
  38. "fontFamilies": [
  39. {
  40. "fontFamily": "-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell, \"Helvetica Neue\",sans-serif",
  41. "slug": "system-font",
  42. "name": "System Font"
  43. },
  44. {
  45. "fontFamily": "Helvetica Neue, Helvetica, Arial, sans-serif",
  46. "slug": "helvetica-arial",
  47. "name": "Helvetica or Arial"
  48. }
  49. ],
  50. "fontSizes": [
  51. {
  52. "slug": "big",
  53. "size": 32,
  54. "name": "Big"
  55. },
  56. {
  57. "slug": "x-large",
  58. "size": 46,
  59. "name": "Large"
  60. }
  61. ]
  62. },
  63. "spacing": {
  64. "spacingScale": {
  65. "operator": "*",
  66. "increment": 1.5,
  67. "steps": 7,
  68. "mediumStep": 1.5,
  69. "unit": "rem"
  70. },
  71. "spacingSizes": [
  72. {
  73. "slug": "40",
  74. "size": "1rem",
  75. "name": "Small"
  76. },
  77. {
  78. "slug": "50",
  79. "size": "1.5rem",
  80. "name": "Medium"
  81. },
  82. {
  83. "slug": "60",
  84. "size": "2rem",
  85. "name": "Large"
  86. }
  87. ]
  88. },
  89. "blocks": {
  90. "core/group": {
  91. "color": {
  92. "palette": [
  93. {
  94. "slug": "black",
  95. "color": "#000000",
  96. "name": "Black"
  97. },
  98. {
  99. "slug": "white",
  100. "color": "#ffffff",
  101. "name": "White"
  102. }
  103. ]
  104. }
  105. }
  106. }
  107. }
  108. }
  1. /* Top-level custom properties */
  2. body {
  3. --wp--preset--color--strong-magenta: #a156b4;
  4. --wp--preset--color--very-dark-grey: #444;
  5. --wp--preset--gradient--blush-bordeaux: linear-gradient( 135deg, rgb( 254, 205, 165 ) 0%, rgb( 254, 45, 45 ) 50%, rgb( 107, 0, 62 ) 100% );
  6. --wp--preset--gradient--blush-light-purple: linear-gradient( 135deg, rgb( 255, 206, 236 ) 0%, rgb( 152, 150, 240 ) 100% );
  7. --wp--preset--font-size--x-large: 46;
  8. --wp--preset--font-size--big: 32;
  9. --wp--preset--font-family--helvetica-arial: Helvetica Neue, Helvetica, Arial, sans-serif;
  10. --wp--preset--font-family--system: -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell, \"Helvetica Neue\",sans-serif;
  11. --wp--preset--spacing--20: 0.44rem;
  12. --wp--preset--spacing--30: 0.67rem;
  13. --wp--preset--spacing--40: 1rem;
  14. --wp--preset--spacing--50: 1.5rem;
  15. --wp--preset--spacing--60: 2.25rem;
  16. --wp--preset--spacing--70: 3.38rem;
  17. --wp--preset--spacing--80: 5.06rem;
  18. }
  19. /* Block-level custom properties (bounded to the group block) */
  20. .wp-block-group {
  21. --wp--preset--color--black: #000000;
  22. --wp--preset--color--white: #ffffff;
  23. }
  24. /* Top-level classes */
  25. .has-strong-magenta-color { color: #a156b4 !important; }
  26. .has-strong-magenta-background-color { background-color: #a156b4 !important; }
  27. .has-strong-magenta-border-color { border-color: #a156b4 !important; }
  28. .has-very-dark-grey-color { color: #444 !important; }
  29. .has-very-dark-grey-background-color { background-color: #444 !important; }
  30. .has-very-dark-grey-border-color { border-color: #444 !important; }
  31. .has-blush-bordeaux-background { background: linear-gradient( 135deg, rgb( 254, 205, 165 ) 0%, rgb( 254, 45, 45 ) 50%, rgb( 107, 0, 62 ) 100% ) !important; }
  32. .has-blush-light-purple-background { background: linear-gradient( 135deg, rgb( 255, 206, 236 ) 0%, rgb( 152, 150, 240 ) 100% ) !important; }
  33. .has-big-font-size { font-size: 32; }
  34. .has-normal-font-size { font-size: 16; }
  35. /* Block-level classes (bounded to the group block) */
  36. .wp-block-group.has-black-color { color: #a156b4 !important; }
  37. .wp-block-group.has-black-background-color { background-color: #a156b4 !important; }
  38. .wp-block-group.has-black-border-color { border-color: #a156b4 !important; }
  39. .wp-block-group.has-white-color { color: #444 !important; }
  40. .wp-block-group.has-white-background-color { background-color: #444 !important; }
  41. .wp-block-group.has-white-border-color { border-color: #444 !important; }

後方互換性を維持するために、add_theme_supportを介して宣言されたプリセットは、CSSカスタムプロパティも生成します。theme.jsonにプリセットが含まれている場合、これらはadd_theme_supportを介して宣言されたものよりも優先されます。

プリセットクラスは、ユーザーのアクションによって投稿のコンテンツに添付されます。これが理由で、エンジンはこれらに!importantを追加します。ユーザースタイルはテーマスタイルよりも優先されるべきです。

Custom

プリセットのためにCSSカスタムプロパティを作成することに加えて、theme.jsonはテーマが独自のプロパティを作成することも許可します。これにより、別々にエンキューする必要がなくなります。customフィールド内で宣言された値は、次の命名スキーマに従ってCSSカスタムプロパティに変換されます:--wp--custom--<variable-name>

たとえば:

  1. {
  2. "version": 3,
  3. "settings": {
  4. "custom": {
  5. "baseFont": 16,
  6. "lineHeight": {
  7. "small": 1.2,
  8. "medium": 1.4,
  9. "large": 1.8
  10. }
  11. },
  12. "blocks": {
  13. "core/group": {
  14. "custom": {
  15. "baseFont": 32
  16. }
  17. }
  18. }
  19. }
  20. }
  1. body {
  2. --wp--custom--base-font: 16;
  3. --wp--custom--line-height--small: 1.2;
  4. --wp--custom--line-height--medium: 1.4;
  5. --wp--custom--line-height--large: 1.8;
  6. }
  7. .wp-block-group {
  8. --wp--custom--base-font: 32;
  9. }

変数の名前は、各ネストレベルの間に--を追加することによって作成され、camelCaseフィールドはkebab-caseに変換されます。

Settings examples

  • 段落ブロックのみにカスタムカラーを有効にする:
  1. {
  2. "version": 3,
  3. "settings": {
  4. "color": {
  5. "custom": false
  6. },
  7. "blocks": {
  8. "core/paragraph": {
  9. "color": {
  10. "custom": true
  11. }
  12. }
  13. }
  14. }
  15. }
  • ボタンブロックのボーダー半径を無効にする:
  1. {
  2. "version": 3,
  3. "settings": {
  4. "blocks": {
  5. "core/button": {
  6. "border": {
  7. "radius": false
  8. }
  9. }
  10. }
  11. }
  12. }
  • グループブロックに他のブロックとは異なるパレットを提供する:
  1. {
  2. "version": 3,
  3. "settings": {
  4. "color": {
  5. "palette": [
  6. {
  7. "slug": "black",
  8. "color": "#000000",
  9. "name": "Black"
  10. },
  11. {
  12. "slug": "white",
  13. "color": "#FFFFFF",
  14. "name": "White"
  15. },
  16. {
  17. "slug": "red",
  18. "color": "#FF0000",
  19. "name": "Red"
  20. },
  21. {
  22. "slug": "green",
  23. "color": "#00FF00",
  24. "name": "Green"
  25. },
  26. {
  27. "slug": "blue",
  28. "color": "#0000FF",
  29. "name": "Blue"
  30. }
  31. ]
  32. },
  33. "blocks": {
  34. "core/group": {
  35. "color": {
  36. "palette": [
  37. {
  38. "slug": "black",
  39. "color": "#000000",
  40. "name": "Black"
  41. },
  42. {
  43. "slug": "white",
  44. "color": "#FFF",
  45. "name": "White"
  46. }
  47. ]
  48. }
  49. }
  50. }
  51. }
  52. }

Styles

Gutenbergプラグインは、WordPress 5.8から利用可能なスタイルを拡張し、他のWordPressバージョンでも使用できるようにし、コアに移植される前に成熟プロセスを経ます。

以下のタブは、WordPress 5.8でサポートされているスタイルとGutenbergプラグインでサポートされているスタイルを示しています。

各ブロックは、ブロックサポートメカニズムを介して公開するスタイルプロパティを宣言します。サポート宣言は、エディタ内のブロックのUIコントロールを自動的に生成するために使用されます。テーマは、theme.jsonを介して任意のブロックの任意のスタイルプロパティを使用できます。これは、テーマがブロックのマークアップに従って正しく機能することを確認する責任があります。

  1. {
  2. "version": 3,
  3. "styles": {
  4. "border": {
  5. "radius": "value",
  6. "color": "value",
  7. "style": "value",
  8. "width": "value"
  9. },
  10. "filter": {
  11. "duotone": "value"
  12. },
  13. "color": {
  14. "background": "value",
  15. "gradient": "value",
  16. "text": "value"
  17. },
  18. "spacing": {
  19. "blockGap": "value",
  20. "margin": {
  21. "top": "value",
  22. "right": "value",
  23. "bottom": "value",
  24. "left": "value",
  25. },
  26. "padding": {
  27. "top": "value",
  28. "right": "value",
  29. "bottom": "value",
  30. "left": "value"
  31. }
  32. },
  33. "typography": {
  34. "fontSize": "value",
  35. "fontStyle": "value",
  36. "fontWeight": "value",
  37. "letterSpacing": "value",
  38. "lineHeight": "value",
  39. "textDecoration": "value",
  40. "textTransform": "value"
  41. },
  42. "elements": {
  43. "link": {
  44. "border": {},
  45. "color": {},
  46. "spacing": {},
  47. "typography": {}
  48. },
  49. "h1": {},
  50. "h2": {},
  51. "h3": {},
  52. "h4": {},
  53. "h5": {},
  54. "h6": {}
  55. },
  56. "blocks": {
  57. "core/group": {
  58. "border": {},
  59. "color": {},
  60. "spacing": {},
  61. "typography": {},
  62. "elements": {
  63. "link": {},
  64. "h1": {},
  65. "h2": {},
  66. "h3": {},
  67. "h4": {},
  68. "h5": {},
  69. "h6": {}
  70. }
  71. },
  72. "etc": {}
  73. }
  74. }
  75. }
  1. {
  2. "version": 3,
  3. "styles": {
  4. "border": {
  5. "color": "value",
  6. "radius": "value",
  7. "style": "value",
  8. "width": "value"
  9. },
  10. "color": {
  11. "background": "value",
  12. "gradient": "value",
  13. "text": "value"
  14. },
  15. "dimensions": {
  16. "aspectRatio": "value",
  17. "minHeight": "value"
  18. },
  19. "filter": {
  20. "duotone": "value"
  21. },
  22. "spacing": {
  23. "blockGap": "value",
  24. "margin": {
  25. "top": "value",
  26. "right": "value",
  27. "bottom": "value",
  28. "left": "value"
  29. },
  30. "padding": {
  31. "top": "value",
  32. "right": "value",
  33. "bottom": "value",
  34. "left": "value"
  35. }
  36. },
  37. "typography": {
  38. "fontFamily": "value",
  39. "fontSize": "value",
  40. "fontStyle": "value",
  41. "fontWeight": "value",
  42. "letterSpacing": "value",
  43. "lineHeight": "value",
  44. "textColumns": "value",
  45. "textDecoration": "value",
  46. "textTransform": "value"
  47. },
  48. "elements": {
  49. "link": {
  50. "border": {},
  51. "color": {},
  52. "spacing": {},
  53. "typography": {}
  54. },
  55. "h1": {},
  56. "h2": {},
  57. "h3": {},
  58. "h4": {},
  59. "h5": {},
  60. "h6": {},
  61. "heading": {},
  62. "button": {},
  63. "caption": {}
  64. },
  65. "blocks": {
  66. "core/group": {
  67. "border": {},
  68. "color": {},
  69. "dimensions": {},
  70. "spacing": {},
  71. "typography": {},
  72. "elements": {
  73. "link": {},
  74. "h1": {},
  75. "h2": {},
  76. "h3": {},
  77. "h4": {},
  78. "h5": {},
  79. "h6": {}
  80. }
  81. },
  82. "etc": {}
  83. }
  84. }
  85. }

Top-level styles

トップレベルで見つかったスタイルは、bodyセレクタを使用してエンキューされます。

  1. {
  2. "version": 3,
  3. "styles": {
  4. "color": {
  5. "text": "var(--wp--preset--color--primary)"
  6. }
  7. }
  8. }
  1. body {
  2. color: var( --wp--preset--color--primary );
  3. }

Block styles

ブロック内で見つかったスタイルは、ブロックセレクタを使用してエンキューされます。

デフォルトでは、ブロックセレクタはその名前に基づいて生成されます(例:.wp-block-<blockname-without-namespace>)。たとえば、.wp-block-groupcore/groupブロックのためのものです。このデフォルトの動作からオプトアウトしたいブロックもあります。これらは、experimentalSelectorキーを介してsupportsファイルのblock.jsonセクション内で使用するセレクタを明示的に指定することによって行うことができます。ブロックは、experimentalSelectorフィールドがスタイルエンジンで利用可能であるために、サーバー側で登録される必要があります。

  1. {
  2. "version": 3,
  3. "styles": {
  4. "color": {
  5. "text": "var(--wp--preset--color--primary)"
  6. },
  7. "blocks": {
  8. "core/paragraph": {
  9. "color": {
  10. "text": "var(--wp--preset--color--secondary)"
  11. }
  12. },
  13. "core/group": {
  14. "color": {
  15. "text": "var(--wp--preset--color--tertiary)"
  16. }
  17. }
  18. }
  19. }
  20. }
  1. body {
  2. color: var( --wp--preset--color--primary );
  3. }
  4. p { /* The core/paragraph opts out from the default behaviour and uses p as a selector. */
  5. color: var( --wp--preset--color--secondary );
  6. }
  7. .wp-block-group {
  8. color: var( --wp--preset--color--tertiary );
  9. }

Referencing a style

ブロックは、ルートレベルのスタイルへの参照を使用してスタイルを適用できます。この機能はGutenbergによってサポートされています。

ルートの背景色をstyles.color.backgroundを使用して登録した場合:

  1. "styles": {
  2. "color": {
  3. "background": "var(--wp--preset--color--primary)"
  4. }
  5. }

ref: "styles.color.background"を使用してブロックのスタイルを再利用できます:

  1. {
  2. "color": {
  3. "text": { "ref": "styles.color.background" }
  4. }
  5. }

Element styles

トップレベルおよびブロックレベルのスタイルに加えて、両方の場所で使用できる要素の概念があります。それらは閉じたセットです:

Gutenbergによってサポートされています:

  • buttonwp-element-button CSSクラスにマッピングされます。また、後方互換性のためにwp-block-button__linkにもマッピングされます。
  • caption.wp-element-caption, .wp-block-audio figcaption, .wp-block-embed figcaption, .wp-block-gallery figcaption, .wp-block-image figcaption, .wp-block-table figcaption, .wp-block-video figcaption CSSクラスにマッピングされます。
  • heading:すべての見出し、h1 to h6 CSSセレクタにマッピングされます。

WordPressによってサポートされています:

  • h1h1 CSSセレクタにマッピングされます。
  • h2h2 CSSセレクタにマッピングされます。
  • h3h3 CSSセレクタにマッピングされます。
  • h4h4 CSSセレクタにマッピングされます。
  • h5h5 CSSセレクタにマッピングされます。
  • h6h6 CSSセレクタにマッピングされます。
  • linka CSSセレクタにマッピングされます。

それらがトップレベルで見つかった場合、要素セレクタが使用されます。ブロック内で見つかった場合、使用されるセレクタは、対応するブロックに追加された要素になります。

  1. {
  2. "version": 3,
  3. "styles": {
  4. "typography": {
  5. "fontSize": "var(--wp--preset--font-size--normal)"
  6. },
  7. "elements": {
  8. "h1": {
  9. "typography": {
  10. "fontSize": "var(--wp--preset--font-size--huge)"
  11. }
  12. },
  13. "h2": {
  14. "typography": {
  15. "fontSize": "var(--wp--preset--font-size--big)"
  16. }
  17. },
  18. "h3": {
  19. "typography": {
  20. "fontSize": "var(--wp--preset--font-size--medium)"
  21. }
  22. }
  23. },
  24. "blocks": {
  25. "core/group": {
  26. "elements": {
  27. "h2": {
  28. "typography": {
  29. "fontSize": "var(--wp--preset--font-size--small)"
  30. }
  31. },
  32. "h3": {
  33. "typography": {
  34. "fontSize": "var(--wp--preset--font-size--smaller)"
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  1. body {
  2. font-size: var( --wp--preset--font-size--normal );
  3. }
  4. h1 {
  5. font-size: var( --wp--preset--font-size--huge );
  6. }
  7. h2 {
  8. font-size: var( --wp--preset--font-size--big );
  9. }
  10. h3 {
  11. font-size: var( --wp--preset--font-size--medium );
  12. }
  13. .wp-block-group h2 {
  14. font-size: var( --wp--preset--font-size--small );
  15. }
  16. .wp-block-group h3 {
  17. font-size: var( --wp--preset--font-size--smaller );
  18. }
Element pseudo selectors

擬似セレクタ:hover:focus:visited:active:link:any-linkはGutenbergによってサポートされています。

  1. "elements": {
  2. "link": {
  3. "color": {
  4. "text": "green"
  5. },
  6. ":hover": {
  7. "color": {
  8. "text": "hotpink"
  9. }
  10. }
  11. }
  12. }

Variations

ブロックは「スタイルのバリエーション」を持つことができ、これはblock.json仕様で定義されています。テーマの著者は、theme.jsonファイルを使用して既存のスタイルバリエーションのスタイル属性を定義できます。登録されていないスタイルバリエーションのスタイルは無視されます。

バリエーションは「ブロックの概念」であり、ブロックにバインドされてのみ存在します。theme.json仕様は、その区別を尊重し、トップレベルではなくブロックレベルでのみvariationsを許可します。また、ブロックのblock.jsonファイルで定義されたバリエーションのみが「登録された」と見なされることを強調する価値があります。register_block_styleまたはクライアントで追加されたスタイルバリエーションは無視されます。詳細については、この問題を参照してください。

たとえば、core/quoteブロックの既存のplainバリエーションにスタイルを提供する方法は次のとおりです:

  1. {
  2. "version": 3,
  3. "styles":{
  4. "blocks": {
  5. "core/quote": {
  6. "variations": {
  7. "plain": {
  8. "color": {
  9. "background": "red"
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. }

結果として得られるCSS出力は次のとおりです:

  1. .wp-block-quote.is-style-plain {
  2. background-color: red;
  3. }

customTemplates

WordPress 5.9からサポートされています。

このフィールド内で、テーマはtemplatesフォルダー内に存在するカスタムテンプレートをリストできます。たとえば、my-custom-template.htmlというカスタムテンプレートの場合、theme.jsonはどの投稿タイプがそれを使用できるか、ユーザーに表示するタイトルを宣言できます:

  • name:必須。
  • title:必須、翻訳可能。
  • postTypes:オプション、デフォルトではpageにのみ適用されます。
  1. {
  2. "version": 3,
  3. "customTemplates": [
  4. {
  5. "name": "my-custom-template",
  6. "title": "The template title",
  7. "postTypes": [
  8. "page",
  9. "post",
  10. "my-cpt"
  11. ]
  12. }
  13. ]
  14. }

templateParts

WordPress 5.9からサポートされています。

このフィールド内で、テーマはpartsフォルダー内に存在するテンプレートパーツをリストできます。たとえば、my-template-part.htmlというテンプレートパートの場合、theme.jsonは、エディタ内で対応するブロックバリエーション(ヘッダーブロック、フッターブロックなど)をレンダリングする責任を持つテンプレートパートエンティティのエリア用語を宣言できます。このエリア用語をjsonで定義することで、そのテンプレートパートエンティティのすべての使用にわたって設定が持続することができます。これは、1つのブロックにのみ影響を与えるブロック属性とは対照的です。エリアをブロック属性として定義することは推奨されません。これは、プレースホルダーフローとエンティティ作成のギャップを埋めるのを助けるためにのみ使用されます。

現在、エリア用語の「ヘッダー」と「フッター」の値に対してブロックバリエーションが存在し、jsonで定義されていない他の値やテンプレートパーツは一般的なテンプレートパートブロックにデフォルトされます。バリエーションは、エディタのインターフェース内で特定のアイコンによって示され、ラッパーの対応するセマンティックHTML要素にデフォルトされます(これは、テンプレートパートブロックに設定されたtagName属性によって上書きされることもあります)、そしてテンプレートパートを文脈化し、将来のエディタの改善においてよりカスタムフローを可能にします。

  • name:必須。
  • title:オプション、翻訳可能。
  • area:オプション、デフォルトではuncategorizedに設定され、ブロックバリエーションをトリガーしません。
  1. {
  2. "version": 3,
  3. "templateParts": [
  4. {
  5. "name": "my-template-part",
  6. "title": "Header",
  7. "area": "header"
  8. }
  9. ]
  10. }

patterns

WordPress 6.0からサポートされています。

このフィールド内で、テーマはパターンダイレクトリから登録するパターンをリストできます。patternsフィールドは、パターンダイレクトリからのパターンslugsの配列です。パターンスラグは、パターンダイレクトリの単一パターンビューでurlによって抽出できます。たとえば、このURLhttps://wordpress.org/patterns/pattern/partner-logos` the slug ispartner-logos`。

  1. {
  2. "version": 3,
  3. "patterns": [ "short-text-surrounded-by-round-images", "partner-logos" ]
  4. }

Developing with theme.json

テーマ.jsonの設定やプロパティ、どのバージョンのWordPressがどの設定をサポートしているかを開発中に覚えておくのは難しい場合があるため、提供されたJSONスキーマを使用することが役立ちます。

多くのコードエディタはJSONスキーマをサポートしており、ツールチップ、オートコンプリート、またはスキーマ検証などのヘルプをエディタ内で提供できます。

各WordPressバージョンのtheme.jsonスキーマはhttps://schemas.wp.org/wp/{{version}}/theme.json`. For example a schema for WordPress 5.8 is available athttps://schemas.wp.org/wp/5.8/theme.json`で入手できます。ユーザーが利用可能な機能のみを使用していることを確認するために、テーマがサポートする最も古いバージョンを使用するのが最善です。

Gutenbergプラグインからの最新の変更を含む最新のスキーマは、https://schemas.wp.org/trunk/theme.jsonで入手できます。

エディタのドキュメントでJSONスキーマのサポートを確認してください。たとえば、Visual Studio Codeでは、"$schema": "https://schemas.wp.org/wp/x.x/theme.json"をtheme.jsonファイルのトップレベルプロパティとして追加する必要がありますが、他のエディタは異なる設定が必要な場合があります。

スキーマを使用した検証の例

Frequently Asked Questions

The naming schema of CSS Custom Properties

システムが作成するCSSカスタムプロパティの命名スキーマ、特に異なる「概念」を区切るために二重ハイフン--を使用することに気付いたかもしれません。以下の例を見てみましょう。

プリセット--wp--preset--color--blackのように、次のように分割できます:

  • --wp:CSS変数の名前空間をプレフィックスします。
  • preset:プリセットに属するCSS変数であることを示します。
  • color:変数が属するプリセットカテゴリを示します。colorfont-sizegradientsのいずれかです。
  • black:特定のプリセット値のslugです。

カスタムプロパティは--wp--custom--line-height--bodyのように、次のように分割できます:

  • --wp:CSS変数の名前空間をプレフィックスします。
  • custom:「自由形式」のCSS変数であることを示します。
  • line-height--body:カスタムオブジェクトキーを文字列に変換した結果です。
  1. - 読みやすさ、人間の理解のため。BEM命名スキーマに似ていると考えられ、カテゴリを区切ります。
  2. - 機械の理解のための解析可能性。定義された構造を使用することで、機械はプロパティ`````--wp--preset--color--black`````の意味を理解できます。これは、スラグが「black」の色プリセットにバウンドされた値であることを示し、これによりそれらを使用してさらに多くのことを行う余地が生まれます。
  3. <a name="why-using-as-a-separator"></a>
  4. ### Why using — as a separator?
  5. 他の区切り文字、たとえば単一の`````-`````を使用することもできました。
  6. しかし、それは問題がありました。`````--wp-custom-line-height-template-header`````をオブジェクトに戻す方法を判断することが不可能になり、テーマの著者が`````-`````を変数名に使用しないように強制しなければなりませんでした。
  7. `````--`````をカテゴリ区切りとして予約し、テーマの著者が`````-`````を単語の境界に使用できるようにすることで、命名が明確になります:`````--wp--custom--line-height--template-header`````
  8. <a name="how-settings-under-custom-create-new-css-custom-properties"></a>
  9. ### How settings under “custom” create new CSS Custom Properties
  10. 「カスタム」キーの下の設定からCSS変数を作成するアルゴリズムは次のように機能します:
  11. これは明確さのためですが、変数名`````--wp--custom--line-height--body`````theme.jsonのオブジェクト形式に解析するメカニズムを持ちたいからでもあります。プリセットに対しても同じ分離を使用します。
  12. たとえば:
  13. ``````bash
  14. {
  15. "version": 3,
  16. "settings": {
  17. "custom": {
  18. "lineHeight": {
  19. "body": 1.7
  20. },
  21. "font-primary": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif"
  22. }
  23. }
  24. }
  25. `
  1. body {
  2. --wp--custom--line-height--body: 1.7;
  3. --wp--custom--font-primary: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif";
  4. }

このプロセスに関するいくつかの注意点:

  • camelCasedキーは、CSSプロパティ命名スキーマに従ってkebab-case形式に変換されます。例:lineHeightline-heightに変換されます。
  • 異なる深さのレベルのキーは--で区切られます。これがline-heightbody--で区切られる理由です。
  • --customオブジェクト内のキーの名前に使用しないでください。例、これを行わないでください
  1. {
  2. "version": 3,
  3. "settings": {
  4. "custom": {
  5. "line--height": { // DO NOT DO THIS
  6. "body": 1.7
  7. }
  8. }
  9. }
  10. }

Global Stylesheet

WordPress 5.8では、WordPressによって定義された一部のプリセット(フォントサイズ、色、グラデーション)のCSSがほとんどのテーマで2回読み込まれました:ブロックライブラリスタイルシートとグローバルスタイルシートの両方で。さらに、両方の場所でCSSにわずかな違いがありました。

WordPress 5.9リリースでは、プリセットのCSSがグローバルスタイルシートに統合され、すべてのテーマで読み込まれるようになりました。各プリセット値は、次のように単一のCSSカスタムプロパティとクラスを生成します:

  1. /* CSS Custom Properties for the preset values */
  2. body {
  3. --wp--preset--<PRESET_TYPE>--<PRESET_SLUG>: <DEFAULT_VALUE>;
  4. --wp--preset--color--pale-pink: #f78da7;
  5. --wp--preset--font-size--large: 36px;
  6. /* etc. */
  7. }
  8. /* CSS classes for the preset values */
  9. .has-<PRESET_SLUG>-<PRESET_TYPE> { ... }
  10. .has-pale-pink-color { color: var(--wp--preset--color--pale-pink) !important; }
  11. .has-large-font-size { font-size: var(--wp--preset--font-size--large) !important; }

テーマがデフォルト値をオーバーライドするには、theme.jsonを使用して同じスラグを提供できます。theme.jsonを使用しないテーマは、対応するCSSカスタムプロパティを設定するCSSをエンキューすることで、デフォルト値をオーバーライドできます。

  1. ``````bash
  2. body {
  3. --wp--preset--font-size--large: <NEW_VALUE>;
  4. }
  5. `

WordPress 5.8では、ユーザーが特定のブロックのリンク色を選択した場合、そのブロックに.wp-element-<ID>の形式でクラスが付与され、次に次のスタイルがエンキューされました:

  1. .wp-element-<ID> a { color: <USER_COLOR_VALUE> !important; }

これにより、ユーザーの好みが常に保持されましたが、特異性が強すぎて、リンクと見なされるべきではないHTML要素を持つ一部のブロックと衝突しました。この問題に対処するため、WordPress 5.9リリースでは、!importantが削除され、対応するブロックがユーザーリンク色よりも高い特異性でa要素のスタイルを設定するように更新されました。これにより、現在は:

  1. .wp-element-<ID> a { color: <USER_COLOR_VALUE>; }

この変更の結果、ブロックの著者とテーマの著者は、ユーザーの選択が常に尊重され、ユーザーが提供するリンク色(特異性011)が上書きされないようにする責任があります。

What is blockGap and how can I use it?

内部ブロックを含むブロック(グループ、カラム、ボタン、ソーシャルアイコンなど)に対して、blockGapは内部ブロック間のスペーシングを制御します。blockGapが機能するためには、ブロックもlayoutブロックサポートにオプトインする必要があります。これにより、ブロックスペーシングコントロールを介して調整可能なレイアウトスタイルが提供されます。ブロックのレイアウトに応じて、blockGap値は垂直マージンまたはgap値として出力されます。エディタでは、blockGap値のコントロールは「ブロックスペーシング」と呼ばれ、寸法パネルにあります。

  1. {
  2. "version": 3,
  3. "settings": {
  4. "spacing": {
  5. "blockGap": true,
  6. }
  7. },
  8. "styles": {
  9. "spacing": {
  10. "blockGap": "1.5rem"
  11. }
  12. }
  13. }

blockGapの設定はブール値またはnull値であり、デフォルトではnullです。これにより、スタイル出力に対する追加の制御レベルが提供されます。settings.spacing.blockGap設定はtheme.jsonファイルで次の値を受け入れます:

  • true:エディタUIでブロックスペーシングコントロールを表示することにオプトインし、blockGapスタイルを出力します。
  • false:エディタUIでブロックスペーシングコントロールを表示しないことにオプトアウトし、blockGapスタイルがtheme.jsonに保存されている場合でもレンダリングされます。これにより、テーマはblockGap値を使用できますが、ユーザーがエディタ内で変更を加えることはできません。
  • null(デフォルト):ブロックスペーシングコントロールを表示しないことにオプトアウトし、blockGapスタイルの出力を防ぎます。

ルートstyles.spacing.blockGapスタイルに対して定義された値もCSSプロパティとして出力され、--wp--style--block-gapという名前が付けられます。

Why does it take so long to update the styles in the browser?

theme.jsonを使用して積極的に開発しているとき、変更がブラウザに表示されるまでに30秒以上かかることに気付くかもしれません。これは、theme.jsonがキャッシュされているためです。このキャッシュの問題を解決するには、WP_DEBUGまたはSCRIPT_DEBUGを「true」に設定します。これにより、WordPressはキャッシュをスキップし、常に新しいデータを使用するようになります。