Open176

HAMWORKSのサイトをブロックテーマに変えていく

ちあきちあき

とりあえず npm init から。

package.json
{
  "name": "@hamworks/wordpress",
  "private": true,
  "version": "1.0.0",
  "description": "WordPress local environment for HAMWORKS Co., Ltd.",
  "main": "index.js",
  "scripts": {},
  "author": "HAMWORKS Co., Ltd.",
  "license": "GPL-2.0-or-later",
  "homepage": "https://ham.works/",
  "volta": {
    "node": "18.19.0"
  }
}
ちあきちあき

自動整形したいから次はそれ関連を。prettierとか.editorconfigを用意。
prettierに関してはWordPress側でconfigがあります

https://github.com/WordPress/wordpress-develop/blob/6.5/package.json#L34

https://github.com/WordPress/wordpress-develop/blob/6.5/package.json#L66

ちあきちあき

が、

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: @hamworks/wordpress@1.0.0
npm ERR! Found: prettier@2.6.2
npm ERR! node_modules/prettier
npm ERR!   dev prettier@"npm:wp-prettier@2.6.2" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer prettier@">=3" from @wordpress/prettier-config@3.8.1
npm ERR! node_modules/@wordpress/prettier-config
npm ERR!   dev @wordpress/prettier-config@"3.8.1" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 

prettierのバージョン3以上が求められる。まあこの辺は整形のあれこれなのでそこまで気にしなくてもいいかなあ。大人しく3にします。

ちあきちあき

ところで wp-scripts packages-update --dist-tag=wp-6.5.4 を実行すると wp-scriptsのバージョンとかもあがるなあ

ちあきちあき

ザクザクインストールしていってあとからこれ実行してバージョン合わせるほうが楽かも?

ちあきちあき

lint系はwp-scriptsに内蔵されてるから、パッケージとしてのインストールはないけどファイルは用意する

ちあきちあき

.eslintignore はいつもこんな感じ。

.eslintignore
node_modules
vendor
build
wp-content/plugins/*
!wp-content/plugins/[original-plugin-name]
wp-content/themes/[original-theme-name]

自分で作ったテーマやプラグインに関するものだけeslintをかけたいので、対象をしぼる

ちあきちあき

今回はすくなくとも初期構築においてプラグインを作る予定がないので、eslint対象はテーマのみになるかな

ちあきちあき

.gitignore はビルドしたものやnode_modulesを除外するとか基本的なものを。

.gitignore
# Directories/files that may be generated by this project
build
node_modules
vendor

# Operating system specific files
.DS_Store
Thumbs.db

# The /.cache folder is needed for phpcs to cache results between runs, while other .cache folders must be ignored
# It is not possible to re-include a file if a parent directory of that file is excluded
# So, both /.cache and /.cache./.gitkeep must be re-included
.cache
!/.cache/
/.cache/**
!/.cache/.gitkeep

# Local overrides
.wp-env.override.json
phpcs.xml
phpunit.xml
phpunit-watcher.yml

とりあえずこんな感じで用意。

ちあきちあき

.stylelintrc.json も一旦これで用意

.stylelintrc.json
{
	"extends": "@wordpress/stylelint-config"
}

個人的にrules足したりしてたけどそもそもこれで事足りるのでは?疑惑があって。

ちあきちあき

rules足したりして緩めたりはできるけど、複数人でやる以上最初はギッチギチでやってた方がコードの質が担保できるんじゃないみたいなことを前いわれたので。不要だと思ったら書かずにいきたい。

ちあきちあき

次はwp-envで環境をつくる。

.wp-env.json
{
	"plugins": [
		"https://downloads.wordpress.org/plugin/create-block-theme.zip",
		"https://downloads.wordpress.org/plugin/wordpress-importer.zip"
	],
	"port": 12342,
	"testsPort": 23452
}

ズッ友Create Block ThemeとWordPress Importer。後者はTheme Unit Test使うからいれておく。

ちあきちあき

一般設定で日本語に変えたりタイムゾーン変えたりする

ちあきちあき

Create Block Theme で空テーマを作成してzipエクスポートする

ちあきちあき

エクスポートしたzipを .wp-env.jsonthemes に追記。
一旦 wp-env start --update でenv環境を再起動

ちあきちあき

再起動したら重複しちゃう(実体ファイルとして存在してるのは1ファイルだけ)ので、ローカルにある方を有効化する。(これはわかりやすくするためにテーマ名かえた)

ちあきちあき

外観にアクセスしたときに有効になってないほうがローカルに存在するテーマ

ちあきちあき

書き出しがうまくいくかテストしてみる。

コンテンツ幅を800px にかえて保存。
で、テーマへの変更を保存をクリック

変更内容を保存。

あとはローカルにあるテーマファイルの theme.json を確認!

ちゃんと反映されてる!

ちあきちあき

php用のlintを用意するのでcomposer initする。

ちあきちあき
composer.json
{
    "name": "hamworks/hamworks",
    "license": "GPL-2.0-or-later",
    "authors": [
        {
            "name": "HAMWORKS Co., Ltd."
        }
    ],
    "require": {
        "php": ">=8.0"
    },
    "config": {
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true
        }
    },
    "require-dev": {
		"phpcompatibility/phpcompatibility-wp": "*",
        "wp-coding-standards/wpcs": "^3.0",
        "squizlabs/php_codesniffer": "^3.9.0",
        "dealerdirect/phpcodesniffer-composer-installer": "^1.0"
    },
	"scripts": {
		"format": "phpcbf --standard=./phpcs.xml.dist --report-summary --report-source",
		"lint": "phpcs --standard=./phpcs.xml.dist"
	}
}
ちあきちあき

huskyとlint-staged入れ忘れてたのでいれる

npm i -D husky lint-staged
package.json
{
	"lint-staged": {
		"*.{js,json,ts,tsx}": [
			"npm run format"
		],
		"*.{js,ts,tsx}": [
			"npm run lint-js:fix"
		],
		"{*.css,*.scss}": [
			"npm run lint-css:fix"
		],
		"*.php": [
			"composer format",
			"npm run lint-php"
		]
	}
}
ちあきちあき

https://instawp.com

確認環境はinstaWPを使っているのでこちらでも導入

ちあきちあき

Add Newで立ち上げ

サイト名を入れて保護しておく(保護しておかないと日数経過で消える)

ちあきちあき

これでステージング環境はできたから次はテンプレートつくる

さっきつくったステージングを選択して

Template Nameをいれる

ちあきちあき

GitHubでPRつくったらインスタンス立ち上がるようにしたいので、デプロイまわりの設定をする

ちあきちあき

メニュー内のDeploymentsでまずはGitHubのリポジトリを追加する

  • Repo SSH LinkはGitHubのsshリンク
  • Branchはmainのまま
  • Destination Folderは「repo」にする(repo内にpushしたデータが展開されるイメージ)
  • Post-Deployment Commandsは以下を。composerとかnpmを実行するのと、repo内に展開したうちのテーマとかプラグインをinstaWPの環境にもっていくコマンド
echo "Install Composer"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php composer-setup.php --quiet
rm composer-setup.php

echo "composer install"
./composer.phar install --optimize-autoloader --prefer-dist --no-dev

echo "npm install"
npm ci --silent
npm run build 

rsync -rltgoDzvO --delete ./wp-content/mu-plugins/ ./../wp-content/mu-plugins/
rsync -rltgoDzvO --delete ./wp-content/plugins/[original-plugin-name]-* ./../wp-content/plugins/
rsync -rltgoDzvO --delete ./wp-content/themes/[original-theme-name]/ ./../wp-content/themes/[original-theme-name]/
rm -rf node_modules

./wp-content/plugins/[original-plugin-name]-* ってなってるのは、案件やるときにつくるプラグインは接頭辞的に案件名を使ったりしているので。例えばhamworks-blocksとかhamworks-post-typesとか。

今回プラグイン作らない予定だけど、今後はわからないのでまあいつも通りいれておきます

  • SSH Key PairはGenerate Newをして、生成されたものをGitHubのリポジトリのSettingsからDeploy Keysにいれる。Read-OnlyでOK
ちあきちあき

あとはステージングとテンプレートそれぞれのデプロイ設定で選択。
テンプレートでデプロイ設定するとActions yml Fileがコピーできるようになるので、GitHub Actionsに追加します。

ymlの中身はこれ

name: InstaWP WordPress Testing

on:
  pull_request:
    types: [opened]

jobs:
  create-wp-for-testing:
    runs-on: ubuntu-latest
    steps:
      - uses: instawp/wordpress-testing-automation@main
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          INSTAWP_TOKEN: ${{secrets.INSTAWP_TOKEN}}
          INSTAWP_TEMPLATE_SLUG: hamworks
          REPO_ID: [REPO_ID_NUMBER]
          INSTAWP_ACTION: create-site-template

このままだとPRつくったときに立ち上がるだけなので、reopened, synchronize, closedアクションも足します。あと、stepの中にif: github.event.action != 'closed' && github.event.action != 'merged'のif文を足してclosedとmergedのとき以外処理をはしらせる。

それから、closed、mergedのあと作った環境をdestroyしときたいのでそのアクションも足します。

結果的にymlはこう

name: InstaWP WordPress Testing

on:
  pull_request:
    types: [opened, reopened, synchronize, closed]

jobs:
  create-wp-for-testing:
    runs-on: ubuntu-latest
    steps:
      - uses: instawp/wordpress-testing-automation@main
        if: github.event.action != 'closed' && github.event.action != 'merged'
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          INSTAWP_TOKEN: ${{secrets.INSTAWP_TOKEN}}
          INSTAWP_TEMPLATE_SLUG: hamworks
          REPO_ID: [REPO_ID_NUMBER]
          INSTAWP_ACTION: create-site-template

  destroy-wp-after-testing:
    runs-on: ubuntu-latest
    steps:
      - uses: instawp/wordpress-testing-automation@main
        if: github.event.action == 'closed' || github.event.action == 'merged'
        id: destroy-wp
        with:
          GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
          INSTAWP_TOKEN: ${{secrets.INSTAWP_TOKEN}}
          INSTAWP_TEMPLATE_SLUG: hamworks
          REPO_ID: [REPO_ID_NUMBER]
          INSTAWP_ACTION: destroy-site
ちあきちあき

やっと開発環境のもろもろ終わったからブロックテーマやっていくぞ!!

ちあきちあき

ひとまずカラーパレットをつくる。今回特にデザインデータないからサイトから色ひっぱってくる

ちあきちあき

パレット入れ終わったら「保存」をクリックする。パレット入れたときの「完了」で保存できたと思っちゃうけど実は完了押しただけじゃtheme.jsonに反映されてないから、ページ遷移すると消えるんだよね。(何回かやってる)

ちあきちあき

パレットができたら一旦書き出し。デフォルトパレットは使わないので消す。
ついでに各パレットのslugからcustom-も消しました。これは好みかな。

theme.json
{
	"settings": {
		"appearanceTools": true,
		"color": {
+			"defaultDuotone": false,
+			"defaultGradients": false,
+			"defaultPalette": false,
			"palette": [
				{
					"color": "#056e76",
					"name": "Primary - 800",
					"slug": "primary-800"
				},
				{
					"color": "#25b7c0",
					"name": "Primary - 500",
					"slug": "primary-500"
				},
				{
					"color": "#d4efef",
					"name": "Primary - 100",
					"slug": "primary-100"
				},
				{
					"color": "#444444",
					"name": "Text",
					"slug": "text"
				},
				{
					"color": "#ffffff",
					"name": "White",
					"slug": "white"
				},
				{
					"color": "#e5e5e5",
					"name": "Neutral - 200",
					"slug": "neutral-200"
				}
			]
		},
		"layout": {
			"contentSize": "800px",
			"wideSize": "1000px"
		},
		"spacing": {
			"units": [
				"%",
				"px",
				"em",
				"rem",
				"vh",
				"vw"
			]
		},
		"typography": {
			"fontFamilies": [
				{
					"fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif",
					"name": "System Font",
					"slug": "system-font"
				}
			]
		},
		"useRootPaddingAwareAlignments": true
	},
	"templateParts": [
		{
			"area": "header",
			"name": "header"
		},
		{
			"area": "footer",
			"name": "footer"
		}
	],
	"version": 2,
	"$schema": "https://schemas.wp.org/wp/6.5/theme.json"
}
ちあきちあき

カラーパレットの設定ができたら、サイトの諸々のデフォルトカラーを設定していく

ちあきちあき

見出しとかキャプションはテキストのカラーになればいいから空っぽのまま。設定が終わったら保存。(まじでこれはクセをつけておく。油断したらまじで保存押し忘れる)

ちあきちあき

次はタイポグラフィ。サイト見ると一部フォントサイズがPCとSPで設定されてるのがあったりするので、"fluid": trueを入れる

https://qiita.com/AkiHamano/items/29cc603f7f90f7939738#settingstypographyfluidminfontsize

ちあきちあき

minViewportWidth は最小サイズ。よくあるのはSPサイズとしてデザインもらうサイズなので、おおむね375px。

theme.json
{
	"settings": {
		"typography": {
			"fluid": {
				"minViewportWidth": "375px",
				"maxViewportWidth": "1000px"
			},
			"fontFamilies": [
				{
					"fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif",
					"name": "System Font",
					"slug": "system-font"
				}
			],
			"fontSizes": [
				{
					"fluid": false,
					"name": "Small",
					"size": "0.875rem",
					"slug": "small"
				},
				{
					"fluid": false,
					"name": "Medium",
					"size": "1rem",
					"slug": "medium"
				},
				{
					"fluid": false,
					"name": "Large",
					"size": "1.25rem",
					"slug": "large"
				},
				{
					"fluid": false,
					"name": "Extra Large",
					"size": "1.5rem",
					"slug": "x-large"
				},
				{
					"fluid": {
						"max": "1.875rem",
						"min": "1.5rem"
					},
					"name": "Extra Extra Large",
					"size": "1.875rem",
					"slug": "xx-large"
				}
			]
		},
		"useRootPaddingAwareAlignments": true
	}
}
ちあきちあき

フォントもいれる。Googleフォントにあるものを使うときはここからアクセス許可して選べる

ちあきちあき

今回HAMWORKSサイトではGoogleフォントは使ってないので、theme.jsonに直接書きます
サイトのfont-familyはこれなので

font-family: "游ゴシック Medium", "Yu Gothic Medium", "游ゴシック体", YuGothic, sans-serif

theme.jsonに足します。

theme.json
"fontFamilies": [
    {
        "fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif",
        "name": "System Font",
        "slug": "system-font"
    },
+    {
+        "fontFamily": "'游ゴシック Medium', 'Yu Gothic Medium', '游ゴシック体', YuGothic, sans-serif",
+        "name": "游ゴシック",
+        "slug": "yu-gothic-font"
+    }
]
ちあきちあき

筑紫A丸ゴシック Stdも一部で使われてるので使う。これもfontFamiliesにいれる

ちあきちあき

これはFONTPLUSを使ってるので、JSをエンキューします

functions.php
add_action( 'wp_enqueue_scripts', function () {
	wp_enqueue_script( 'hamworks-fontplus', [FONTPLUS_URL], array(), wp_get_theme()->get( 'Version' ), false );
} );
ちあきちあき

見出しは筑紫A丸ゴシック Std指定しておこうと思って見出しのパネル開いたら、なんかすごい柔軟になってた

前までh1とかなかったぞ…!いやーこれでjsonいちいち書かなくていいのは助かる〜

ちあきちあき

エンキューしたフォントは残念ながら管理画面で見れないので一旦サイト表示で確認。

うむ。見出しにちゃんとあたっている

ちあきちあき

デザインシステムがあるわけじゃないから、既存の見出しサイズをもとにざっくり設定

ちあきちあき

サイト見たらRobotoもあったから入れておくか…RobotoはGoogleフォントのなかにいるので選択

まあ400と700があればいいでしょう。

ちあきちあき

Roboto使われてるのはメニューかな。ナビゲーションブロックのデフォルトとして設定しておく。

ちあきちあき

Googleフォント使ってインストールしたフォントはデフォルトだとテーマ内のassets/fontsに保存される

ちあきちあき

次は余白の設定。余白は整理していいよって言われたので、8の倍数で整理。

theme.json
{
	"settings": {
		"spacing": {
+			"spacingScale": {
+				"steps": 0
+			},
+			"spacingSizes": [
+				{
+					"name": "1",
+					"size": "0.5rem",
+					"slug": "10"
+				},
+				{
+					"name": "2",
+					"size": "1rem",
+					"slug": "20"
+				},
+				{
+					"name": "3",
+					"size": "1.5rem",
+					"slug": "30"
+				},
+				{
+					"name": "4",
+					"size": "2rem",
+					"slug": "40"
+				},
+				{
+					"name": "5",
+					"size": "2.5rem",
+					"slug": "50"
+				},
+				{
+					"name": "6",
+					"size": "3rem",
+					"slug": "60"
+				}
+			],
			"units": [
				"%",
				"px",
				"em",
				"rem",
				"vh",
				"vw"
			]
		},
        ...
}
ちあきちあき

今回はリキッドにしなくてよさそうかなと思ったので素直にremで書いた。
リキッドにする場合はclampで指定してる。

theme.json
{
    "name": "MAX: 120px",
    "size": "clamp(3.75rem, 1.556rem + 9.36vw, 7.5rem)",
    "slug": "90"
}

計算はサイト使ってやる。

https://min-max-calculator.9elements.com/

minにスマホ、maxにコンテンツ幅で計算

ちあきちあき

spacingSizesいれたらメインエリアの余白とブロックのデフォルトのgapサイズを設定

ちあきちあき

リストのマーカーの色を変えたいから、ブロックの追加CSSに書きます。

リストのマーカーの色はtheme.css作ってそっちに書いてるけど、今回は検証も兼ねてこっちに書いてみる。

ちあきちあき

正直追加CSSはCSSファイルに書いたほうがわかりやすいんでないかと思ってる。ここのテキストエリアだと補完もないし書きにくいしね…。

ちあきちあき

これでtheme.jsonは一旦おしまいでいいかな。
完成形はこれ

theme.json
{
	"settings": {
		"appearanceTools": true,
		"color": {
			"defaultDuotone": false,
			"defaultGradients": false,
			"defaultPalette": false,
			"palette": [
				{
					"color": "#056e76",
					"name": "Primary - 800",
					"slug": "primary-800"
				},
				{
					"color": "#25b7c0",
					"name": "Primary - 500",
					"slug": "primary-500"
				},
				{
					"color": "#d4efef",
					"name": "Primary - 100",
					"slug": "primary-100"
				},
				{
					"color": "#444444",
					"name": "Gray - 500",
					"slug": "gray-500"
				},
				{
					"color": "#ffffff",
					"name": "White",
					"slug": "white"
				},
				{
					"color": "#e5e5e5",
					"name": "Neutral - 200",
					"slug": "neutral-200"
				}
			]
		},
		"layout": {
			"contentSize": "1000px",
			"wideSize": "1600px"
		},
		"spacing": {
			"spacingScale": {
				"steps": 0
			},
			"spacingSizes": [
				{
					"name": "1",
					"size": "0.5rem",
					"slug": "10"
				},
				{
					"name": "2",
					"size": "1rem",
					"slug": "20"
				},
				{
					"name": "3",
					"size": "1.5rem",
					"slug": "30"
				},
				{
					"name": "4",
					"size": "2rem",
					"slug": "40"
				},
				{
					"name": "5",
					"size": "2.5rem",
					"slug": "50"
				},
				{
					"name": "6",
					"size": "3rem",
					"slug": "60"
				}
			],
			"units": [ "%", "px", "em", "rem", "vh", "vw" ]
		},
		"typography": {
			"fluid": {
				"maxViewportWidth": "1000px",
				"minViewportWidth": "375px"
			},
			"fontFamilies": [
				{
					"fontFamily": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif",
					"name": "System Font",
					"slug": "system-font"
				},
				{
					"fontFamily": "'游ゴシック Medium', 'Yu Gothic Medium', '游ゴシック体', YuGothic, sans-serif",
					"name": "游ゴシック",
					"slug": "yu-gothic-font"
				},
				{
					"fontFamily": "'FOT-筑紫A丸ゴシック Std E'",
					"name": "FOT-筑紫A丸ゴシック",
					"slug": "tsukushi-a-maru-gothic-font"
				},
				{
					"fontFace": [
						{
							"fontFamily": "Roboto",
							"fontStyle": "normal",
							"fontWeight": "700",
							"src": "file:./assets/fonts/KFOlCnqEu92Fr1MmWUlvBh05IsDqlA.woff2"
						},
						{
							"fontFamily": "Roboto",
							"fontStyle": "normal",
							"fontWeight": "400",
							"src": "file:./assets/fonts/KFOmCnqEu92Fr1Me4GZLCzYlKw.woff2"
						}
					],
					"fontFamily": "Roboto, sans-serif",
					"name": "Roboto",
					"slug": "roboto"
				}
			],
			"fontSizes": [
				{
					"fluid": false,
					"name": "Small",
					"size": "0.875rem",
					"slug": "small"
				},
				{
					"fluid": false,
					"name": "Medium",
					"size": "1rem",
					"slug": "medium"
				},
				{
					"fluid": false,
					"name": "Large",
					"size": "1.25rem",
					"slug": "large"
				},
				{
					"fluid": false,
					"name": "Extra Large",
					"size": "1.5rem",
					"slug": "x-large"
				},
				{
					"fluid": {
						"max": "1.875rem",
						"min": "1.5rem"
					},
					"name": "Extra Extra Large",
					"size": "1.875rem",
					"slug": "xx-large"
				}
			]
		},
		"useRootPaddingAwareAlignments": true
	},
	"styles": {
		"blocks": {
			"core/button": {
				"border": {
					"radius": "0px"
				}
			},
			"core/list": {
				"css": "& li::marker { color: var(--wp--preset--color--primary-500); }",
				"spacing": {
					"padding": {
						"left": "1.5em"
					}
				}
			},
			"core/navigation": {
				"typography": {
					"fontFamily": "var(--wp--preset--font-family--roboto)"
				}
			}
		},
		"color": {
			"background": "var(--wp--preset--color--white)",
			"text": "var(--wp--preset--color--gray-500)"
		},
		"elements": {
			"button": {
				"color": {
					"background": "var(--wp--preset--color--primary-500)",
					"text": "var(--wp--preset--color--white)"
				}
			},
			"h1": {
				"typography": {
					"fontSize": "2.25rem"
				}
			},
			"h2": {
				"typography": {
					"fontSize": "var(--wp--preset--font-size--xx-large)"
				}
			},
			"h3": {
				"typography": {
					"fontSize": "var(--wp--preset--font-size--x-large)"
				}
			},
			"h4": {
				"typography": {
					"fontSize": "var(--wp--preset--font-size--large)"
				}
			},
			"h5": {
				"typography": {
					"fontSize": "1.125rem"
				}
			},
			"h6": {
				"typography": {
					"fontSize": "1.125rem"
				}
			},
			"heading": {
				"typography": {
					"fontFamily": "var(--wp--preset--font-family--tsukushi-a-maru-gothic-font)"
				}
			},
			"link": {
				":hover": {
					"color": {
						"text": "var(--wp--preset--color--primary-800)"
					}
				},
				"color": {
					"text": "var(--wp--preset--color--primary-500)"
				}
			}
		},
		"spacing": {
			"blockGap": "var(--wp--preset--spacing--20)",
			"padding": {
				"bottom": "0px",
				"left": "var(--wp--preset--spacing--30)",
				"right": "var(--wp--preset--spacing--30)",
				"top": "0px"
			}
		},
		"typography": {
			"fontFamily": "var(--wp--preset--font-family--yu-gothic-font)",
			"fontSize": "var(--wp--preset--font-size--medium)",
			"lineHeight": "1.7"
		}
	},
	"templateParts": [
		{
			"area": "header",
			"name": "header"
		},
		{
			"area": "footer",
			"name": "footer"
		}
	],
	"version": 2,
	"$schema": "https://schemas.wp.org/wp/6.5/theme.json"
}
ちあきちあき

いつもの手順だと次はコンテンツつくっていく。そのためにTheme Unit Testを入れてブロックのスタイルを調整したりするので、今回もいれておく。

https://github.com/WordPress/theme-test-data

ちあきちあき

64-block-test-data.xmlthemeunittestdata.wordpress.xml をインポート

ちあきちあき

設定いじったブロックが配置された記事が生成されるので、いつもそれ見ながらデザインとにらめっこして調整してます。(今回はそもそもそういうデザインが用意されてないので割愛)

ちあきちあき

https://ham.works/service/

サービスのコンテンツをつくっていく

ちあきちあき

ブロックに分解すると、このページの構成は

  • カバーブロック
    • 中に投稿タイトルと段落
  • 段落
  • カラム
    • デザイン
    • コーディング
    • CMS構築
  • 全幅のグループ
    • 見出し
    • 段落
    • テーブル
    • 段落

という感じ。

ちあきちあき

このカバーブロックのところはパターンにできそう。一番したのリソースはブロックパーツ(全ページで出すので)なので、コンテンツとしては後回しにします。

ちあきちあき

ん…?テキストカラーの反映が効いてない?

ちあきちあき

これはカラーパレットでtextって指定してしまったせい。
gray-500に変えたらなおった

ちあきちあき

全幅指定したのに、表示側ではならない。

ちあきちあき

こいつのせいか

body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {
    max-width: var(--wp--style--global--content-size);
    margin-left: auto !important;
    margin-right: auto !important;
}
ちあきちあき

ふむ。親のグループブロックの「コンテント幅を使用するインナーブロック」がオフになってる

ちあきちあき

とりあえず固定ページ用のテンプレートを用意するだけしておくかー

固定ページ全部に適用するから一覧を選択

これはスキップ

ちあきちあき

内容はヘッダーフッターに加えてグループブロック+コンテンツブロックな構成。
「コンテント幅を使用するインナーブロック」をオフにしておく

ちあきちあき

もともとのサイトでは、このカバーブロックにあたるところはPCが高さ300px、SPが高さ160pxの指定がある

ちあきちあき

最も簡単なのは、カバーブロックでvhを使ってよしなにすることかなあ

ちあきちあき

もう一つの手段としては、クラス名を入れ追加CSS書くこと。その場合はパターンにします。今回はどちらにせよパターンにはするからどっちの方法でもいいかな。

そういえばtailwind入れるの忘れてたな………

ちあきちあき

どっちにするかは検討するとして、tailwindは入れます。

npm install -D tailwindcss
ちあきちあき

tailwind.base.config.jsも用意

tailwind.base.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
	content: [ './**/*.{html,php,js,tsx}' ],
	theme: {
		screens: {
			sm: '600px',
			md: '782px',
			lg: '960px',
			xl: '1280px',
		},
	},
	corePlugins: {
		preflight: false,
	},
};

ブレークポイントをおおよそWPにあわせます

ちあきちあき

ここにbaseとして用意してるのは、プラグインつくったときにも同じ設定を有効にするため

ちあきちあき

テーマ内にpackage.jsonを追加

package.json
{
	"private": true,
	"scripts": {
		"build": "wp-scripts build --webpack-copy-php",
		"dev": "wp-scripts start --webpack-copy-php"
	},
	"devDependencies": {
		"@wordpress/scripts": "^27.8.0",
		"glob": "^10.3.15",
		"path": "^0.12.7",
		"tailwindcss": "^3.4.3",
		"webpack-remove-empty-scripts": "^1.0.4"
	}
}

ビルド用のファイルを用意していきます

ちあきちあき
tailwind.config.js
/** @type {import('tailwindcss').Config} */
const config = require( '../../../tailwind.base.config' );
module.exports = {
	...config,
	content: [
		'./{404,home,front-page,index,archive,page,single,sidebar,header,footer,search}.php',
		'./template-parts/**/*.php',
		'./inc/**/*.php',
		'./parts/**/*.{html,php}',
		'./templates/**/*.{html,php}',
		'./patterns/**/*.{html,php}',
	],
};

tailwind使ってビルドする対象をここで指定します。
なので、追加クラスつけたときはパターンなりテンプレートパーツなりに入れる。(じゃないとビルドされない)

ちあきちあき

tailwindを入れる理由はあくまでこういうパーツに使ったりするため。お客さんにtailwindのこのCSSつかってーみたいな案内はしない。使うならパターンを用意して、使いたいパターンをぽちってするだけでOK!な状態で出す

ちあきちあき
postcss.config.js
module.exports = {
	plugins: {
		'tailwindcss/nesting': {},
		tailwindcss: {},
		autoprefixer: {},
	},
};
ちあきちあき
webpack.config.js
const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
const RemoveEmptyScriptsPlugin = require( 'webpack-remove-empty-scripts' );
const path = require( 'path' );
const glob = require( 'glob' );

/**
 * 各ブロックのCSSファイルをentryに追加するためのオブジェクトを作成
 */
const blockStyleDir = 'src/styles';
const blockEntries = glob
	.sync( 'blocks/**/*.css', {
		cwd: blockStyleDir,
	} )
	.map( ( key ) => [
		`styles/${ key.replace( '.css', '' ) }`,
		path.resolve( process.cwd(), blockStyleDir, key ),
	] );
const blockEntriesObj = Object.fromEntries( blockEntries );

module.exports = {
	...defaultConfig,
	entry: {
		...defaultConfig.entry,
		'styles/theme/theme': path.resolve(
			process.cwd(),
			'src/styles/theme/theme.css'
		),
		...blockEntriesObj,
	},
	plugins: [
		// Include WP's plugin config.
		...defaultConfig.plugins,

		// Removes the empty `.js` files generated by webpack but
		// sets it after WP has generated its `*.asset.php` file.
		new RemoveEmptyScriptsPlugin( {
			stage: RemoveEmptyScriptsPlugin.STAGE_AFTER_PROCESS_PLUGINS,
		} ),
	],
};

ページ内でブロックが使われてるときだけCSSをエンキューする、というつくりなのでwp_enqueue_block_style用にブロック単位でCSSファイルを分けます。いちいち追加するのが面倒なので、特定のディレクトリ配下のCSSファイル(私が書いてるのだとsrc/styles/blocks/**/*.css)をビルドしてねーって書いておく。

styles/theme/theme は、ブロックではなくテーマ全体に関わるようなCSSを書くところ。正直ブロックテーマになってめちゃ減った。

theme.css
@tailwind base;
@tailwind components;
@tailwind utilities;

これを置く。

ちあきちあき

コミットしようとしたら

 1:1  ✖  Unexpected unknown at-rule "@tailwind"  at-rule-no-unknown
 2:1  ✖  Unexpected unknown at-rule "@tailwind"  at-rule-no-unknown
 3:1  ✖  Unexpected unknown at-rule "@tailwind"  at-rule-no-unknown

ってエラーが。

ちあきちあき

これはstylelintの設定なので、.stylelintrc.jsonを変えます

.stylelintrc.json
{
	"extends": "@wordpress/stylelint-config",
	"rules": {
		"at-rule-no-unknown": null
	}
}
ちあきちあき

theme.cssを入れたのでfunctions.phpにエンキュー足すのを忘れないように。忘れたら追加クラス入れたところでなんもでない

ちあきちあき
functions.php
add_action( 'init', 'hamworks_styles' );
function hamworks_styles(): void {
	wp_register_style( 'hamworks-style', get_parent_theme_file_uri( 'build/styles/theme/theme.css' ), array(), '1.0.0' );
	add_editor_style( 'build/styles/theme/theme.css' );
}

add_action( 'wp_enqueue_scripts', function () {
	wp_enqueue_style( 'hamworks-style' );
	...
} );
ちあきちあき

よし本筋にもどる。カバーをvhにするか追加CSS入れるか

ちあきちあき

追加CSSクラスでやるなら

追加CSSクラスにh-32 md:h-72 を入れる(厳密にSP160px/PC300pxではないけどこの辺の値はよしなにしていいと許可もらってるのでtailwindで提供されてるものに合わせる)

ちあきちあき

このままだとビルドされずに使えないので、パターンにもっていきます

ちあきちあき

テーマの中にpatternsディレクトリを作り、page-title.phpをつくります。
エクスポートできたら楽だけどこれはできないので……

ちあきちあき

カバーブロックを選択してからスタイルをコピーして

page-title.phpにペースト。

page-title.php
<!-- wp:cover {"url":"http://localhost:12342/wp-content/uploads/2024/05/subvisual.jpg","id":1833,"dimRatio":0,"customOverlayColor":"#3b4b4e","isUserOverlayColor":true,"minHeight":160,"minHeightUnit":"px","align":"full","className":"h-40 md:h-72","layout":{"type":"constrained"}} -->
<div class="wp-block-cover alignfull h-40 md:h-72" style="min-height:160px"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-0 has-background-dim" style="background-color:#3b4b4e"></span><img class="wp-block-cover__image-background wp-image-1833" alt="" src="http://localhost:12342/wp-content/uploads/2024/05/subvisual.jpg" data-object-fit="cover"/><div class="wp-block-cover__inner-container"><!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|10"}},"layout":{"type":"flex","orientation":"vertical"}} -->
		<div class="wp-block-group"><!-- wp:heading {"level":1,"fontSize":"xx-large"} -->
			<h1 class="wp-block-heading has-xx-large-font-size">SERVICE</h1>
			<!-- /wp:heading -->

			<!-- wp:paragraph {"style":{"elements":{"link":{"color":{"text":"var:preset|color|primary-500"}}}},"textColor":"primary-500","fontSize":"x-large"} -->
			<p class="has-primary-500-color has-text-color has-link-color has-x-large-font-size">HAMWORKSのサービス</p>
			<!-- /wp:paragraph --></div>
		<!-- /wp:group --></div></div>
<!-- /wp:cover -->
ちあきちあき
<?php
/**
 * Title: Hero
 * Slug: themeslug/hero
 * Categories: featured
 */
?>
<!-- Pattern code goes here. -->

最低限これがあればいいと書いてるので、これを参考にpage-title.phpを書きます

page-title.php
<?php
/**
 * Title: 固定ページのタイトル
 * Slug: hamworks/page-title
 * Categories: featured
 */
?>
<!-- wp:cover {"url":"http://localhost:12342/wp-content/uploads/2024/05/subvisual.jpg","id":1833,"dimRatio":0,"customOverlayColor":"#3b4b4e","isUserOverlayColor":true,"minHeight":160,"minHeightUnit":"px","align":"full","className":"h-40 md:h-72","layout":{"type":"constrained"}} -->
<div class="wp-block-cover alignfull h-40 md:h-72" style="min-height:160px"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-0 has-background-dim" style="background-color:#3b4b4e"></span><img class="wp-block-cover__image-background wp-image-1833" alt="" src="http://localhost:12342/wp-content/uploads/2024/05/subvisual.jpg" data-object-fit="cover"/><div class="wp-block-cover__inner-container"><!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|10"}},"layout":{"type":"flex","orientation":"vertical"}} -->
		<div class="wp-block-group"><!-- wp:heading {"level":1,"fontSize":"xx-large"} -->
			<h1 class="wp-block-heading has-xx-large-font-size">SERVICE</h1>
			<!-- /wp:heading -->

			<!-- wp:paragraph {"style":{"elements":{"link":{"color":{"text":"var:preset|color|primary-500"}}}},"textColor":"primary-500","fontSize":"x-large"} -->
			<p class="has-primary-500-color has-text-color has-link-color has-x-large-font-size">HAMWORKSのサービス</p>
			<!-- /wp:paragraph --></div>
		<!-- /wp:group --></div></div>
<!-- /wp:cover -->
ちあきちあき

Categoriesはアーカイブされたドキュメントの方にしかまとめられてないのかな?

とりあえず前のドキュメント

https://developer.wordpress.org/themes/features/block-patterns/#pattern-categories

Pattern categories

WordPress has several block pattern categories that it registers by default:

  • featured
  • about
  • audio (added in WordPress 6.4)
  • banner
  • buttons
  • call-to-action
  • columns
  • contact
  • footer
  • gallery
  • header
  • media
  • portfolio
  • posts
  • query (use posts instead)
  • services
  • team
  • testimonials
  • text
  • video (added in WordPress 6.4)

個人的によく使うのはfeaturedとかtextかな

ちあきちあき

パターンに http://localhost:12342 って入ってるのはよろしくないので、パターンに使う画像はテーマに含めます

ちあきちあき

<?php echo esc_url( get_template_directory_uri() ); ?>/assets/images/ 内で管理していくので書き換え。ついでにidも1にする。

page-title.php
<?php
/**
 * Title: 固定ページのタイトル
 * Slug: hamworks/page-title
 * Categories: featured
 */
?>
<!-- wp:cover {"url":"<?php echo esc_url( get_template_directory_uri() ); ?>/assets/images/subvisual.jpg","id":1,"dimRatio":0,"customOverlayColor":"#3b4b4e","isUserOverlayColor":true,"minHeight":160,"minHeightUnit":"px","align":"full","className":"h-40 md:h-72","layout":{"type":"constrained"}} -->
<div class="wp-block-cover alignfull h-40 md:h-72" style="min-height:160px"><span aria-hidden="true" class="wp-block-cover__background has-background-dim-0 has-background-dim" style="background-color:#3b4b4e"></span><img class="wp-block-cover__image-background wp-image-1" alt="" src="<?php echo esc_url( get_template_directory_uri() ); ?>/assets/images/subvisual.jpg" data-object-fit="cover"/><div class="wp-block-cover__inner-container"><!-- wp:group {"style":{"spacing":{"blockGap":"var:preset|spacing|10"}},"layout":{"type":"flex","orientation":"vertical"}} -->
		<div class="wp-block-group"><!-- wp:heading {"level":1,"fontSize":"xx-large"} -->
			<h1 class="wp-block-heading has-xx-large-font-size">SERVICE</h1>
			<!-- /wp:heading -->

			<!-- wp:paragraph {"style":{"elements":{"link":{"color":{"text":"var:preset|color|primary-500"}}}},"textColor":"primary-500","fontSize":"x-large"} -->
			<p class="has-primary-500-color has-text-color has-link-color has-x-large-font-size">HAMWORKSのサービス</p>
			<!-- /wp:paragraph --></div>
		<!-- /wp:group --></div></div>
<!-- /wp:cover -->
ちあきちあき

いっぱいあって面倒だから一旦デフォルトのパターンを消す。

functions.php
add_action(
	'after_setup_theme',
	function () {
		remove_theme_support( 'core-block-patterns' );
	}
);
ちあきちあき

会社概要の一見テーブルっぽいところはカラムを使う

私はこういうセルっぽいスタイルを柔軟に触りたいってときはカラムを使います。
テーブルはまじでテーブルっぽい(セルごとにボーダーがあるとかそういう)ので使うかな

ちあきちあき

初期時点でページすくないので次はテンプレート作成。

  • 固定ページ用テンプレート
  • 投稿ページ用テンプレート
  • 投稿一覧用テンプレート
  • フロントページテンプレート
  • インデックステンプレート(初期時点で存在するので新規作成というより編集)
  • ヘッダー
  • フッター
  • リリース情報用のブロックパーツ

あたりかな

ちあきちあき

コンテンツで全幅を正しく使いたかったら親グループの「コンテント幅を使用するインナーブロック」のチェックを外すのを忘れないようにする。

固定ページテンプレートは用意済みだったけど投稿詳細テンプレートがまだなので同様につくる。
デザインがない(現行サイトにそもそも投稿用のコンテンツがない)ので自分でよしなに調整

ちあきちあき

カテゴリーとかタグが味気なさすぎなのでCSSつける

ちあきちあき

とりあえずカテゴリーは背景色+白文字、タグはボーダー+緑文字にします

ちあきちあき

ブロックとしてはpost-termsなので、テーマのCSSディレクトリの中にファイル用意。
また、ブロック用の追加CSSとしてエンキューする必要があるので、functions.phpに以下を追記します

functions.php
wp_enqueue_block_style(
	'core/post-terms',
	array(
		'handle' => 'hamworks-core-post-terms',
		'src'    => get_parent_theme_file_uri( 'build/styles/blocks/core/post-terms.css' ),
		'path'   => get_parent_theme_file_path( 'build/styles/blocks/core/post-terms.css' ),
	)
);
ちあきちあき

CSSはTailwindで@applyしていく

post-terms.css
.wp-block-post-terms {
	@apply flex flex-wrap gap-1;
}

.wp-block-post-terms a {
	@apply text-white bg-primary-500 transition-colors py-0.5 px-1 no-underline;

	&:hover {
		@apply text-white bg-primary-800;
	}
}

.wp-block-post-terms__separator {
	@apply hidden;
}

なんとなくよく見るカテゴリーのデザインてきなやつ。
.wp-block-post-terms__separatorhiddenにしてるのは地味にできる余白が気に入らなかったから………

ちあきちあき

コミットしようとしたらstylelintのエラー

  2:2   ✖  Expected empty line before at-rule                             at-rule-empty-line-before
  6:2   ✖  Expected empty line before at-rule                             at-rule-empty-line-before
 14:1   ✖  Selector should use lowercase and separate words with hyphens  selector-class-pattern
 15:2   ✖  Expected empty line before at-rule                             at-rule-empty-line-before
 18:21  ✖  Selector should use lowercase and separate words with hyphens  selector-class-pattern
 19:2   ✖  Expected empty line before at-rule                             at-rule-empty-line-before
 22:3   ✖  Expected empty line before at-rule                             at-rule-empty-line-before

あーね

Expected empty line before at-rule:@ルールの前に空行を追加
Selector should use lowercase and separate words with hyphens:CSSのセレクタの命名規則に関するルール違反

前者は@mediaとかは有用だけど、@applyにはつけてほしくない。
後者はWPが吐いてる命名規則に従ってるから、stylelint自体のルールを無効にする

ちあきちあき

今回は検証も兼ねてextends@wordpress/stylelint-configを指定するだけで進め始めたのであとからこうやってぽこぽこ足してるのは例外ではあるけどあんまよくないネ

ちあきちあき

@applyのときは無視する書き方はこうらしい(by ChatGPT)

stylelintrc.json
{
	"extends": "@wordpress/stylelint-config",
	"rules": {
		"at-rule-no-unknown": null,
		"at-rule-empty-line-before": ["always", {
			"except": ["first-nested"],
			"ignore": ["after-comment"],
			"ignoreAtRules": ["apply"]
		}]
	}
}

あとtailwindも無視したいから [ "apply", "tailwind" ]こうかな。

もう一個の方、selector-class-pattern: nullが怒られるんだが……

ちあきちあき

これか!?!?!??!!?!?

"selector-class-pattern": ["", {}]
ちあきちあき

うーん…合ってるのかわからんけどこれで波線でなくなったから一旦これでいくか…

ちあきちあき

次は投稿一覧。グリッドっぽく並べたいときは投稿テンプレートでグリッドを選択

ちあきちあき

表示側と(フォントは違えど)レイアウトが同じなので調整しやすいねえ

ちあきちあき

ちょっと境目わかりにくいかなあ。ボーダーでも入れますか

ちあきちあき

ページ送りも最初に管理画面から設定できるものを設定する

ちあきちあき

左右矢印の画像差し替えたいとかそういうときはCSS追加。
.wp-block-query-pagination-next とか.wp-block-query-pagination-previousだったりその中のspan に対して使ったり色々やりようはあるかと

ちあきちあき

カレントの色変えるとか丸ぬき文字にするとか結構スタイル変えるブロックではあるかな。
今回はそもそもデザインないから一旦このままで。

ちあきちあき

アイコンつきのボタンブロックはブロックスタイルをつくる

ちあきちあき

ほんとは矢印アイコンの後ろの背景色ブロックで選べるようにしたいけどさすがに無理だからここは固定に

ちあきちあき

デフォルトでブロックに背景色が入ってるせいでbeforeとかafterの色制御がむずかしいかも

ちあきちあき

そんなことねえや

button.css
.wp-block-button .wp-block-button__link {
	@apply transition-colors;
}

.wp-block-button.is-style-arrow .wp-block-button__link {
	@apply relative pl-14 bg-transparent;
	z-index: 1;

	&::after {
		content: '';
		width: 7px;
		height: 11px;
		background-image: url(../../../../assets/images/arrow.svg);
		@apply bg-no-repeat block absolute top-1/2 left-5 bg-primary-500 -translate-y-1/2;
	}

	&::before {
		content: '';
		z-index: -1;
		transition: width 0.4s ease-in-out;
		@apply bg-primary-500 absolute top-0 left-0 block w-11 h-full;
	}

	&:hover {
		@apply !text-white;

		&::before {
			@apply w-full;
		}
	}
}
ちあきちあき

ボタンは共通で色のアニメーション使おうかなと思って @apply transition-colors; いれた

ちあきちあき

.wp-block-template-part の余白が邪魔だなー。かといってブロックの間隔を0にすると、全部のブロックの間隔が0になっちゃう

ちあきちあき

テーブルのスタイルつくる。theadとthの色を変える

ちあきちあき

ボーダーの色が初見なのでパレットにPrimary - 300たしておこう

ちあきちあき

デフォルトでストライプってデザインのスタイルがあるので、そこと干渉しないようにthのスタイルをつける

ちあきちあき

フッターのメニューはナビゲーションブロックとソーシャルアイコンブロックを横並び

ちあきちあき

「新北海道スタイル」安心宣言は横に画像が入ってる。これはインライン画像を使ってやることにします

ちあきちあき

ただインライン画像入れただけだと文字の位置がずれる

ちあきちあき

ボタンブロックの中に画像入れようと思ったらインライン画像使うしかないので、

.wp-block-button__link:has(img) これで判別してflexを指定することにします

button.css
.wp-block-button__link:has(img) {
	@apply flex items-center gap-1;
}
ちあきちあき

そこなぴょこぴょこ動いているハムロボ……かわいいんだけどどうしよっかな。

画像ブロックにスタイルつけるか…。

ちあきちあき

追加CSSクラスに「hamrobo」をつけて、こいつにCSSつけていく。直接追加クラスにTailwind書いてもいいんだけど、個人的に入れ子とかで書きたいとき(.hamrobo > imgみたいなとき)はCSSファイルに@applyで書いてます。

Tailwindマスターってわけでもないので…。書けるのは知ってるけど、個人的に読みにくくてあんまり好きじゃないというだけ。

ちあきちあき

画像ブロックに中央指定だと display: table; が入って邪魔なので、縦積みグループの中に画像を入れて、グループに中央指定を入れる

<!-- wp:group {"layout":{"type":"flex","orientation":"vertical","justifyContent":"center"}} -->
<div class="wp-block-group"><!-- wp:image {"sizeSlug":"large","linkDestination":"none","className":"hamrobo"} -->
<figure class="wp-block-image size-large hamrobo"><img src="http://localhost:12342/wp-content/themes/hamworks/assets/images/hamrobo.svg" alt=""/></figure>
<!-- /wp:image --></div>
<!-- /wp:group -->
ちあきちあき
image.css
.wp-block-image.hamrobo {
	@apply transition-transform duration-300;
	height: 80px;

	&:hover {
		@apply -translate-y-4;
	}
}

親(濃いグリーン背景のグループ)にoverflow-hiddenいれてはみ出し制御する

ちあきちあき

ページトップのボタンつくる

ちあきちあき

ブラウザの上にはりつきはできるけど、下にはりつきはできない

ちあきちあき

fixed bottom-4 right-4 を画像ブロックの追加クラスに入れる。
fixedとかabsoluteとかはブロックの編集画面と相性が悪いので多用はしないほうがいい。

fixed になってないし、なってたとしてもちょろちょろ動いて結構目障りかと

ちあきちあき

ある程度スクロールしたらふわっとでてくるから、これはJS書かないとネ。

ちあきちあき

あとデフォルト状態が消えてるのはよろしくない。なぜなら管理画面で非表示になって編集できなくなるから。
こういうスクロールしたら表示させるのとかは、JSで非表示用のクラスを付与してあげる

theme.ts
// ページトップへ戻るボタンの処理
document.addEventListener( 'DOMContentLoaded', function () {
	const pageTopButton: Element | null = document.querySelector( '.pagetop' );
	if ( pageTopButton ) {
		pageTopButton.classList.add( 'is-hidden' );

		window.addEventListener( 'scroll', function () {
			if ( window.scrollY > 150 ) {
				pageTopButton.classList.remove( 'is-hidden' );
			} else {
				pageTopButton.classList.add( 'is-hidden' );
			}
		} );
	}
} );
ちあきちあき

追加クラスに入れてたけど.pagetopつけたしまとめた

image.css
.wp-block-image.pagetop {
	@apply fixed bottom-4 right-4 transition-opacity duration-300 opacity-100;

	&.is-hidden {
		@apply opacity-0;
	}
}

.editor-styles-wrapper .wp-block-image.pagetop {
	@apply relative;
}

.editor-styles-wrapper を頭につけると管理画面用のCSSになる

ちあきちあき

位置の張り付き使うときはルートに使わないとだから、ヘッダーをstickyにしたければテンプレートパーツの外に置かないとダメ

ちあきちあき

現行のホバースタイルの調整のためにヘッダーのナビゲーションブロックにheader-navをつける

ちあきちあき

404もデザインないので一旦簡単なものを。

文字はタイポグラフィを設定して筑紫A丸ゴシックにかえます

ちあきちあき

検索ページ。タイトルもブロックで用意されてるのよきですな。文字列は検索語を含むかどうかしか選べないけど些事。

ちあきちあき

ボタンのホバー設定したいなー。デフォルトでないからCSSつけないといけない

ちあきちあき

ボタンのカラー自体は変えられるのにホバーは変えれないんだよなー

ちあきちあき

元になるサイトでは暗い緑になってるから、ホバーしたら暗い色になるようにしよう。
というわけでbrightness-75を設定。

button.css
.wp-block-button:not([class*="is-style-"]) .wp-block-button__link {
	transition: filter 300ms ease-in-out;
}

.wp-block-button:not([class*="is-style-"]) .wp-block-button__link:hover {
	@apply brightness-75;
}

なんらかのブロックスタイルが入っているときはやらない。
つまり、今回作った矢印つきのスタイルとデフォルトで入ってる輪郭スタイルのときはホバーの挙動は走らない。

ちあきちあき

instaWP自動デプロイは別途GitHubアクション追加する

deploy-to-test.yml
name: Deploy to Test Server

on:
  push:
    branches:
      - main

jobs:
  call-instawp-webhook:
    runs-on: ubuntu-latest
    steps:
      - name: Invoke deployment hook
        uses: distributhor/workflow-webhook@v3
        env:
          webhook_url: "WEBHOOK_URL"