Safariの新版が前面に出したのは不具合修正だった

つくば市のホームページ制作会社

WebKitのブログに、Safariの新しいバージョンで入った変更をまとめた記事が出た。日付は9月17日。冒頭に置かれているのは新機能の一覧ではなく、今回いちばん大きな機能は機能ではない、という一文だった。1年かけて既存機能の不具合を844件直した、という話が中心に据えられている。6月の開発者向けイベントの時点では525件と発表していたので、そこからさらに6割ほど積み増したことになる。

修正はいくつかの筋に整理されている。ひとつは互換性で、特定のサイトでヒンディー語の入力が正しく通らない、検索結果から画像が消える、といった個別の不具合を地道に潰していったもの。もうひとつは土台の作り直しで、JavaScriptのモジュール読み込み処理を新しく書き直し、CSSのzoomも作り直し、行内要素の配置をサブピクセル単位で行うようにしたという。深掘りの筋ではSVGだけで66件の修正が入り、SMILアニメーションの実装は端から端まで見直された。表組みの絶対配置まわりや、HTTPキャッシュがCache-Controlの指定にきちんと従うかどうかといった、仕様との食い違いを詰める作業も含まれている。

目を引いたのは、組み合わせという括りがあることだ。-webkit-line-clampがWebKitに入ったのは2010年、text-wrap: balanceは2024年で、どちらも単体では問題なく動く。ところが同じ要素に両方を指定すると、行のバランス調整のほうが効かなくなっていたという。それが今回直った。単体では再現せず、組み合わせたときだけ崩れる。制作の現場で原因の切り分けにいちばん時間を取られるのは、だいたいこの種類の不具合ではないだろうか。

読んでいる位置が飛ばなくなる

新しく入った機能のなかで、既存のサイトにそのまま効きそうなのがスクロールアンカリングだ。記事を読んでいる途中で、いま見ている位置より上に画像や広告、コメントが遅れて読み込まれると、読んでいた部分が下に押し出されて画面が急に飛ぶ。よくある挙動だが、読み手にとっては行き先を見失う原因になる。新しいSafariはこの場合にスクロール位置のほうを自動で調整し、読んでいた場所を画面上の同じところに保つ。制作側で何かを書き足す必要はなく、既定で有効になっている。挙動を切りたい箇所だけ、overflow-anchorというCSSプロパティにnoneを指定する形だ。

ブラウザの更新というと、新しい書き方が使えるようになったかどうかに目が行きやすい。ただ、納品してしばらく経ったサイトの表示が、こちらが何もしなくても静かに正しくなっていくというのは、保守を抱える側にとっては地味に大きい。Safariでだけ表示が少しずれるという理由で回避策を入れた案件が手元にあるなら、新しい版で一度素の状態に戻して確かめてみる価値はある。回避策は放っておくと、いつのまにか誰も理由を説明できないコードになる。

修正版が出てから数か月後に狙われた卸売向けプラグイン

つくば市のホームページ制作会社

WooCommerceと組み合わせて使う有料プラグイン「WooCommerce Wholesale Lead Capture」の脆弱性が、実際の攻撃に使われていると報じられました。卸売の取引先を登録フォームで受け付けるためのプラグインで、推定の稼働数はおよそ6,000サイトと大きくはありません。それでも取り上げたいのは、修正版が公開されたのが2月20日で、攻撃が目立ちはじめたのが6月以降だったという時間差のほうです。

更新を後回しにしていたサイトが、修正から何か月もたってから狙われる。WordPressの運用ではよく聞く話ですが、今回はその流れがかなりはっきり数字に出ています。

何が起きていたのか

対象は CVE-2026-27540 として登録された脆弱性で、バージョン2.0.3.1以前が影響を受けます。セキュリティ研究者の Teemu Saarentaus 氏が報告し、2.0.3.2で修正されました。深刻度は、Wordfence の評価で CVSS 9.8、CVE を採番した Patchstack の評価で9.0とされています。

Wordfence が9月14日に公開した技術解説によると、同社のファイアウォールはこの脆弱性を狙った攻撃を10万件以上遮断しました。攻撃が集中したのは6月4日から17日にかけてで、7月1日と8月30日にも山があったそうです。BleepingComputer や Infosecurity Magazine がこの報告を取り上げ、修正から約4か月後に悪用が本格化した点を伝えています。

許可する拡張子を攻撃者が決められた

仕組みを見ると、原因はかなり素朴なところにあります。このプラグインは登録フォームのファイル添付を受け付けるために、ログインしていない訪問者でも呼び出せるAJAXの処理(wwlc_file_upload_handler)を持っています。

この処理はアップロードされたファイルの拡張子を「許可リスト」と照合していましたが、そのリストをサーバー側のフォーム設定からではなく、送られてきたリクエストの中身(file_settings というパラメータ)から読み取っていました。つまり攻撃者が自分で「php も許可」と書き添えれば、PHPファイルがそのまま通ってしまうわけです。さらに、WordPress標準のアップロード関数を呼ぶ際にファイル種別の確認を切っていたため、拡張子のチェックが唯一の関門になっていたとされています。

実際の攻撃では、shell.php のような名前のファイルが送り込まれていました。サーバーの情報を表示し、ブラウザから追加のファイルを書き込めるアップロード画面を持つ、いわゆるWebシェルです。一度置かれてしまうと、そこを足がかりに別の不正なファイルを増やされる可能性があります。

ユーザーから届いた値を「設定」として信用してしまうのは、自作のフォーム処理でも起こりうる落とし穴です。問い合わせフォームや応募フォームでファイル添付を受け付けている案件では、許可する形式がどこで決められているかを一度見直しておくと安心です。

有料プラグインの更新が遅れやすい事情

今回の件でもうひとつ考えたいのが、更新の届き方です。公式ディレクトリで配布される無料プラグインと違い、有料プラグインは配布元のライセンス認証を通じて更新を受け取る形が多く、ライセンスの期限切れや認証の外れで、更新通知そのものが管理画面に出ていないことがあります。制作を請け負ったあと、ライセンスの更新が誰の担当なのか曖昧なまま運用が続いているケースも珍しくありません。

また、Infosecurity Magazine は、ファイアウォールのルールは既知の攻撃を止めてくれるものの、プラグイン自体を直すわけではない点を強調しています。セキュリティ系プラグインを入れているから大丈夫、とは言い切れず、脆弱なバージョンが残っている限り、防御の網をすり抜ける手口が出てくれば危険はそのままです。

使っているサイトで確かめたいこと

このプラグインを導入しているなら、まずバージョンが2.0.3.2以降になっているかを確認します。そのうえで、Wordfence は次のような点検を勧めています。

  • アップロード用のディレクトリに、見覚えのないPHPファイルや最近作られたPHPファイルがないか
  • アクセスログに、admin-ajax.php へ wwlc_file_upload_handler を指定したリクエストが残っていないか
  • 管理者一覧に、心当たりのないアカウントが増えていないか

侵入の形跡が見つかった場合は、不審なファイルやアカウントを消すだけでなく、裏口が残っていないかまで確かめる必要があります。BleepingComputer によると、仕込まれた仕掛けをすべて取り除くのは難しいため、安全な時点のバックアップから復元する対応が推奨されています。なお、ログに該当する記録がないことは、無事の証明にはならないとも添えられています。

導入数の少ないプラグインほど話題になりにくく、気づいたときには修正版の公開から時間がたっている、ということが起こりがちです。管理画面に更新通知が出ていないことを「最新の証拠」と受け取らず、配布元の更新履歴と見比べる習慣が、こうした時間差の攻撃に対するいちばん確実な備えになりそうです。

ブラウザごとの食い違いを来年の課題にする公募が始まった

つくば市のホームページ制作会社

同じHTMLとCSSを書いても、ブラウザによって表示や挙動が少しずつ違う。制作の現場では当たり前のように受け入れている面倒だが、その差を毎年少しずつ埋めていく共同プロジェクトがある。Interopと呼ばれる取り組みで、ブラウザを作っている各社が参加し、年ごとに重点分野を決めて、各ブラウザの対応状況をテストの合格率で追いかけていく。

その来年ぶんの題材を決める提案の受付が、9月3日に始まった。締切は9月23日で、GitHubのissueとして誰でも出せる。同じ日にAppleのWebKit、Googleのweb.dev、MicrosoftのEdgeチームがそれぞれ呼びかけを出していて、どんな書き方が通りやすいかの説明も添えられている。読み比べると、重なっている勘所がいくつか見えてくる。

すでに標準として固まっているか

前提として、Interopは新しい技術を発明する場ではない。W3CやTC39といった場で仕様が固まり、ブラウザベンダーからの異論が残っていないものについて、実装の食い違いだけを潰していく。過去に選ばれた機能は、少なくともどれか一つのブラウザで実装済みだったものがほとんどだとされている。

WebKitの記事は、まだ存在しない機能がほしい場合はInteropではなく、CSSであればCSS Working Groupのissueなど、その技術を決める場に持ち込むよう案内している。順番を飛ばすと、そもそも土俵に乗らないという整理だ。

テストがあるかどうかで枠が変わる

Interopの進み具合は、Web Platform Testsの合格率で測られる。裏を返すと、テストが十分にない機能は、選ばれても点の付けようがない。提案するときは、既存のテストがどれくらいあるかを調べてリンクすることが求められる。

テストや計測の仕組みが足りない領域には、重点分野とは別に調査枠が用意されている。こちらは合格率を競うのではなく、将来の改善に向けて土台を整えるための宿題という位置づけになっている。出したい機能の成熟度によって、入り口が二つあるということになる。

範囲は狭く、具体的に

三社とも揃って書いているのが、提案の範囲を絞ることだ。WebKitは「タイポグラフィ」ではなくfont-size-adjustのように、一つの機能か、関係の近い小さなまとまりで出すよう勧めている。Edgeの記事も、「CSSを良くしてほしい」「フォームまわりを直してほしい」といった広い要望は評価しづらく、焦点の定まった提案のほうが選ばれやすいとしている。

実際に困った場面を書けるか

説得材料として重視されているのは、現場でどう困ったかという具体的な話だ。自分の案件で遭遇した食い違い、フレームワークやライブラリのissue、開発者アンケートの結果など、多くの人が同じ壁に当たっている証拠があると強い。

探す手がかりも用意されている。webstatus.devで各ブラウザの対応状況を確認したり、開発者からの要望を集めたリポジトリで、すでに公開されている使いどころを引いてきたりできる。数ある候補の中で、なぜこれを先に片付けるべきなのかまで書けると良いとされている。

提案を出さない人にもできること

提案文を書く時間がなくても、関われる余地はある。同じ内容のissueを二つ立てるより、すでにあるissueにコメントや反応を付けて後押しするほうが良いと、各社とも案内している。気になる提案に賛同の意思を残しておくだけでも、判断材料のひとつになる。

選ばれなかった提案も捨てられるわけではない、という説明も目を引いた。Edgeのチームは、落選した提案は開発者からの明確な要望として受け取り、長く残っている課題を整理したダッシュボードに反映していくと書いている。提案の結果が出るのは来年2月ごろの予定だという。

今年の重点分野には、View Transitions、Navigation API、アンカー位置指定、ダイアログとポップオーバー、コンテナスタイルクエリなどが並んでいる。こうした機能を数年後に「もうどのブラウザでも普通に動く」と言えるかどうかは、この時期の公募から始まっている。中小企業のサイトを作る側としても、いま回避策を書き足している場所を思い出しておくと、来年以降の道具立ての変わり方が少し読みやすくなる。

コンテナクエリが知られているのに使われない理由

つくば市のホームページ制作会社

CSSのコンテナクエリ(container queries)が主要ブラウザにそろってから、それなりの時間がたちました。部品が置かれた場所の広さに合わせて見た目を変えたい、という要望は長年のCSSの願いごとの上位にあったはずです。ところが、実際の制作現場ではまだあまり使われていません。

Smashing Magazineが9月16日に公開した記事は、この「知られているのに使われない」状態を正面から取り上げています。筆者は、使われない理由よりも、使われたときの使い方のずれに関心を向けています。今回はこの記事を軸に、MDNの解説も参照しながら、メディアクエリとの役割分担や、手を出す前に知っておきたい落とし穴を整理してみます。

認知は高いのに利用が伸びていない

記事によると、コンテナクエリのブラウザ対応率はおよそ94%に達しています。一方で、State of CSSの調査では、存在を知っている開発者が86%なのに対し、実際に使っているのは41.4%にとどまるそうです。筆者自身も調査には偏りがあると断ったうえで、現時点で最も参考になる指標だとしています。

また、今年のSmashingConf Amsterdamでは、CSSの解説で知られるKevin Powell氏も普及の遅さに触れたと紹介されています。新機能というより、すでに使える道具が棚に置かれたままになっている状況といえます。

筆者が指摘するのは、コンテナクエリが見た目のうえでメディアクエリとよく似ていることです。書き方が似ているので、同じ目的で同じように動くものだと思い込みやすい。その結果、メディアクエリの置き換えとして試し、違いが分からないまま離れていく、という流れが起きやすいのだと考えられます。

外を見るメディアクエリ、内を見るコンテナクエリ

記事の整理はシンプルです。メディアクエリが確かめているのは、基本的に画面(ビューポート)の幅です。たとえば幅1024px以上でカードを横並びにする指定をしたとします。このカードを、1920pxの画面の中で幅300pxしかないグリッドの一枠に置いても、画面幅の条件は満たしているので横並びの指定が効いてしまい、中身が窮屈になったりはみ出したりします。

コンテナクエリは問いの立て方が違います。確かめるのは、その部品を包んでいる親要素にどれだけの幅があるかです。次のように親要素をコンテナとして宣言し、その幅を条件にします。

.card-wrapper {
  container-name: card;
  container-type: inline-size;
}

@container card (min-width: 450px) {
  .card {
    display: flex;
    flex-direction: row;
  }
}

こうするとカードは画面の広さに左右されず、置かれた場所に450px以上の横幅があるときだけ横並びになります。MDNも、コンテナクエリを使えば、同じカードをページのどこに置くかを意識せずに再利用できると説明しています。

記事は、現在のウェブには2,300種類を超える画面サイズがあるという数字も挙げています。768pxのような抽象的な境目を越えたから「タブレット用」の見た目になる、という考え方そのものに無理が出てきている、というのが筆者の主張です。

ページ全体の骨組みと部品の中身で使い分ける

記事が勧めるのは、どちらか一方に寄せることではなく、担当範囲を分けることです。ページ全体をまたぐヘッダーやフッター、メインのグリッド、ダークモードのような利用者の設定、タッチ操作の有無といった端末の特性は、これまでどおりメディアクエリの担当です。一方、カードやウィジェット、フォーム、ナビゲーションのように、割り当てられた場所に収まる必要がある部品の中身は、コンテナクエリの担当と考えます。

筆者自身の判断基準も分かりやすいものです。ひとつの部品が複数の場所で使われるならコンテナクエリ、ページの最上部に常にあるメインナビゲーションのように、ページ単位でしか存在しない部品ならメディアクエリ。前者は置き場所の広さが毎回違い、後者は画面の幅がそのまま頼れる目安になるからです。

WordPressで制作していると、この区別は実感しやすいはずです。同じ投稿カードや問い合わせボタンの部品が、トップページでは3列に並び、固定ページでは本文の幅いっぱいに置かれ、別の場所ではサイドバーに収まる。画面幅だけで分岐を書いていると、置き場所ごとに例外の指定が増えていきます。納品後に更新担当の方がブロックを並べ替えることを考えても、部品が自分の置かれた幅に応じて整う作りのほうが崩れにくくなります。

文字サイズと折り返しの判定にも使える

記事では、レイアウトの切り替え以外の使いどころも紹介されています。ひとつは文字サイズです。見出しの大きさを画面幅に連動するvw単位とclamp()で決めていると、その部品をサイドバーへ移したときに文字が大きすぎたり小さすぎたりします。コンテナクエリには専用の単位があり、MDNによると、cqwとcqhはコンテナの幅と高さ、cqiとcqbは行方向とブロック方向の大きさ、それぞれの1%を表します。cqminとcqmaxはcqiとcqbの小さいほうと大きいほうです。

.card-title {
  font-size: clamp(1rem, .5rem + 3cqi, 2rem);
}

このように書けば、見出しの大きさは部品が置かれた場所の幅に合わせて伸び縮みし、指定がその部品の中で完結します。なお、MDNでは、当てはまるコンテナが見つからない場合、これらの単位はその方向の小さいビューポート単位として扱われると説明されています。

もうひとつは、フレックスボックスの折り返しを検知する工夫です。CSSには、並んだ要素が次の行へ折り返したかどうかを直接知る仕組みがありません。記事ではKevin Powell氏から学んだ方法として、各アイテム自体をコンテナにし、伸びる設定を与えておくやり方が紹介されています。折り返しが起きると、次の行に落ちたアイテムが親の幅いっぱいまで広がり、その急な幅の変化をコンテナクエリが拾う、という仕組みです。これまでならJavaScriptのResizeObserverに頼っていた場面を、CSSだけで扱える可能性があります。筆者も完全無欠ではないと書いているので、試すときは実際の表示で確かめるのがよさそうです。

手を出す前に知っておきたい落とし穴

記事は、コンテナクエリ特有の注意点も3つ挙げています。

まず、コンテナは自分自身を条件にできない点です。カード要素をコンテナにして、そのカード自身の表示方法を切り替えようとしても動きません。自分の大きさで自分の見た目を変えると、無限に計算し直すことになるからです。そのため、カードの外側にもう一段包む要素を用意し、そちらをコンテナにする必要があります。既存のテーマやテンプレートに後から組み込む場合、この「もう一段の包み」をどこに置くかが最初の検討事項になります。

次に、container-typeにsizeを指定すると高さがつぶれることがある点です。sizeは縦横両方の大きさを条件にできる指定ですが、ブラウザは中身を見ずにコンテナの大きさを決めるため、高さや最小の高さ、縦横比を明示していないと高さが0pxになってしまいます。MDNも、コンテナの宣言には封じ込め(containment)が伴い、それは性能のために必要な仕組みだと説明しています。多くの場合は横方向だけを見るinline-sizeで十分で、縦方向が本当に必要な場面に限ってsizeを選ぶのが無難です。

最後に、条件の値にカスタムプロパティを使えない点です。デザインシステムで境目の幅を変数にまとめている場合でも、コンテナクエリの条件にvar()を書くことはできません。カスタムプロパティは要素の親子関係に沿って値が受け継がれるため、クエリの中でその値自体を書き換えると判定が循環してしまうからです。

スタイルクエリなど周辺の仕様も広がっている

今回のSmashing Magazineの記事が扱っているのは、大きさを条件にするサイズクエリです。MDNの解説を読むと、コンテナクエリの仕組みはそれだけではありません。現在は、サイズクエリ、コンテナの名前だけで絞り込む名前のみのクエリ、スタイルクエリ、スクロールの状態を条件にするクエリ、アンカー配置の状態を条件にするクエリ、の5種類が整理されています。

このうちスタイルクエリは、コンテナの計算済みのスタイルを条件にするものです。MDNによると、現時点で実際に条件にできるのはカスタムプロパティに限られ、通常のCSSプロパティを条件にする書き方はまだどのブラウザにも実装されていません。それでも、親要素に設定したテーマ用の変数の値によって子要素の見た目を切り替える、といった使い方はすでに検討できます。@propertyで型を登録しておくと、blueと#0000ffのように書き方の違う同じ色も一致として扱われる、という細かな挙動も解説されています。対応状況はブラウザごとに差があるので、採用する前に互換性の表を確認しておくのが安心です。

サイズクエリの基本がまだ手に馴染んでいない段階で、周辺の仕様まで一度に追う必要はありません。ただ、部品の置かれた状況をCSS側で判断する方向へ仕様全体が広がっていることは、頭の片隅に置いておく価値があります。

既存サイトへの取り入れ方

中小企業のサイトや地方の制作案件で、いきなり全体をコンテナクエリ前提で組み直す必要はないでしょう。記事の筆者も、すべてのプロジェクトでメディアクエリをコンテナクエリに置き換えるべきだとは考えていないと明言しています。

現実的なのは、置き場所によって崩れやすい部品から試すやり方です。お知らせの一覧カード、商品や事例の紹介カード、サイドバーにも本文にも置かれるバナーなど、同じ部品を複数の場所で使い回しているところが候補になります。こうした部品は、これまで置き場所ごとの追加指定で調整してきたことが多く、その追加指定を減らせるかどうかで効果を判断しやすいはずです。

書き方がメディアクエリに似ているぶん、使い分けの考え方さえ押さえてしまえば導入の壁はそれほど高くありません。ページの骨組みは画面の幅で、部品の中身は置かれた場所の幅で決める。この線引きを一度チーム内で共有しておくと、次のサイト改修のときに部品の作り方を見直すきっかけになりそうです。

プラグイン作者にも届きはじめた欧州の報告義務

つくば市のホームページ制作会社

欧州連合のサイバーレジリエンス法(Cyber Resilience Act、以下CRA)のうち、報告に関する部分が2026年9月11日から動き出した。欧州委員会の説明によると、この日以降、デジタル要素を含む製品のメーカーは、攻撃に悪用されている脆弱性と、製品の安全性に影響する重大なインシデントを当局へ届け出る義務を負う。法律全体の適用開始は2027年12月とされているので、報告の部分だけが先に立ち上がった形になる。

欧州の規制と聞くと遠い話に思えるが、WordPressのプラグインやテーマを世に出している作り手には、まったくの他人事とも言い切れない。脆弱性の調整を手がけるPatchstackは、この条文が公開ソフトの作り手にどう関わるかを、WordPressを例に取り上げている。

届け出るものと、その締め切り

報告が必要になるのは二種類ある。実際に悪用が確認されている脆弱性と、製品の安全性に影響する重大なインシデントである。締め切りは短い。認識してから24時間以内に早期警告を出し、72時間以内に概要と初期評価を含む通知を提出する。最終報告は、悪用中の脆弱性であれば修正措置が利用できるようになってから14日以内、重大インシデントであれば72時間通知から1か月以内とされている。あわせて、影響を受ける利用者に何が起きたかと身の守り方を伝えることも求められる。

提出先は一本化されていて、欧州のサイバーセキュリティ機関であるENISAが運用するSingle Reporting Platform(単一報告窓口、SRP)に集約される。メーカーは一度出せばよく、主たる拠点のある国のセキュリティ対応組織、いわゆるCSIRTに届き、原則としてENISAにも同時に共有される。最初に受け取ったCSIRTは、その製品が流通している他国のCSIRTへ遅滞なく共有する仕組みになっている。

公開物か、商用製品かの線引き

ここで気になるのが、誰が義務の当事者になるのかという点である。欧州委員会のページでは、オープンソースソフトウェアのスチュワードに対する報告義務は第24条3項に基づくもので、適用は2027年12月11日からと明記されている。一方でPatchstackは、GPLで公開されていても有料版など収益を得る手段があるプラグインの販売者は、スチュワードではなくメーカーに当たるという整理を示している。営利の意図がまったくない公開プラグインを法人の従業員が保守している場合はスチュワードに当たる、という例も添えられている。同社によれば、スチュワードには制裁金は科されないが、非準拠の製品を欧州市場から取り除くための手段は残るという。

オープンソースであることと無償であることが一致しないWordPressの世界では、この線引きは意外と身近に響く。人気のあるプラグインの多くは、公開されていながら商用の意図を持った製品でもあるからだ。同社は、WordPress周辺で知られている脆弱性の半分以上を自社が調整してきたとしており、影響範囲の広さがうかがえる。

窓口の使い勝手という現実的な話

制度の中身以上に現場に効きそうなのが、窓口の操作である。PatchstackはSRPにAPIがなく、報告1件につき3つのフォームを手作業で埋める必要があると指摘している。提出にはEU Loginの個人アカウントと多要素認証が必要で、アカウントは個人に紐づく。24時間という締め切りを考えると、事が起きてから登録を始めるのでは間に合わない恐れがある。同社は、アカウントだけでも先に用意しておくことを勧めている。

その負担を引き受ける動きも出ている。Patchstackは9月11日付で、公開ソフトの保守担当者向けに、指定代理人として報告を代行する仕組みを無料で使える形で提供し始めたと発表した。報告件数が増え、SRPにAPIが用意されないままであれば、1件あたりの課金を将来的に導入する可能性があるとも書き添えられている。

受託制作の側から見ると

日本で中小企業のサイトを作っている立場なら、自分が報告義務の当事者になる場面はそう多くないだろう。ただ、納品したサイトに組み込んだ有料プラグインの作者が欧州市場に製品を出しているなら、悪用が確認された脆弱性の情報が、これまでより早く表に出てくる可能性はある。

更新の判断材料が増えること自体は、受け取る側には悪い話ではない。ただ、公表が早くなるということは、修正版が出てから適用するまでの猶予が短くなるということでもある。どのサイトにどのプラグインが入っていて、誰が更新を見ているのかを手元で把握しておく。規制そのものは欧州の話でも、そこを通って流れてくる情報の速さは、地方の小さな制作現場にも同じように届く。

編集画面のキー操作をブロック側から宣言できる

つくば市のホームページ制作会社

WordPressのブロックエディターで段落を選び、Alt+Shift+2 を押すと見出し2に変わる。この操作自体は2022年から使えていたのだが、仕組みとしては少し変わった作りになっていた。変換の中身が非公開のコンポーネントに直接書き込まれていて、しかもそのコンポーネントを各エディターパッケージがそれぞれ描画する必要があった。つまり標準のブロックだけが持つ固定の挙動であって、外から足せるものではなかったということになる。自作ブロックに似た変換を用意したくても、正規の入り口が存在しなかった。

9月2日に公開された Gutenberg 23.9 で、この部分が宣言できるAPIに置き換わった。宣言の場所は二か所あり、渡す名前も異なる。ブロックのバリエーションを登録するときは shortcut という単数形のオブジェクトを渡し、変換(transforms)の側には shortcuts という配列を渡す。押すキーは keyCombination に修飾キーと文字を書き、あわせて画面に出る説明文も持たせる形になっている。ショートカット名は既存の命名にならって、どの機能に属する変換なのかが読み取れる文字列を付ける。

宣言できるようになると何が変わるか

変換側の定義には variationName も添えられる。これがあるおかげで、ひとつの変換定義に六つのショートカットを持たせても、ブロック切り替えメニューに同じ項目が六つ並ぶようなことにはならない。見出しのレベル違いのように、実体はひとつで見え方だけ複数あるブロックを扱うときに効いてくる部分だ。裏側の登録と、編集者が画面で実際に目にする選択肢を切り離して考えられるようになった、と言い換えてもいい。登録の都合が編集画面の見づらさとして表に出てこない、というのは地味だが大きい。

実務で効いてくるのは、制作側が用意したカスタムブロックにも標準ブロックと同じ操作感を持たせられる点だろう。記事や商品ページを日常的に更新する担当者にとって、よく使うブロックへの切り替えがキーボードだけで完結するかどうかは、思っているより作業時間に響く。これまで標準ブロックだけが持っていた快適さを、案件ごとに用意したブロックにも回せるようになる。マウスをあまり使わずに書く人にとっても、追加したブロックが操作の流れから外れずに済むという意味がある。

注意しておきたいのは、これが現時点ではGutenbergプラグイン側の更新だという点だ。WordPress本体に入るのは次のメジャーである7.2で、ベータ版は10月20日から22日、正式版は12月8日から10日のあいだが予定されている。今すぐ本番のサイトで使う話ではないが、自社ブロックを抱えている制作者であれば、この秋のうちに書き方を確かめておいて損はない。内部に閉じていた挙動を公開された宣言に移していく流れは、インナーブロックのテンプレート指定がブロックタイプの設定側へ移ったことにも表れていて、7.2の開発が本格化するこれからしばらくは、同じ方向の変更が続きそうだ。

公式ドキュメントのコード例がその場で動くようになった

つくば市のホームページ制作会社

WordPressの公式ドキュメントであるCode Referenceで、掲載されているコード例をその場で実行できるようになった。9月上旬にMake WordPress Coreで告知されたもので、WordPress 7.1で最初の2件が公開され、7.2でさらに増える予定とされている。

対象になっているのは、たとえば WP_HTML_Processor::class_list() の解説ページだ。コードブロックに付いた実行ボタンを押すと、そのページの中で結果が表示される。ローカル環境を立ち上げたり、どこかにコピーして貼り付けたりする手間がいらない。ドキュメントを読みながら挙動を確かめられる、という形になった。

実行できるコード例は本体のコメントから作られる

興味深いのは、この実行できるコード例が、ドキュメント用に別途手作りされているわけではないところだ。WordPress本体のソースコードにあるDocBlock、つまり関数やメソッドの上に書かれているコメントの中に、そのまま書かれている。

通常のコード例との違いは、コードフェンスの言語指定を php interactive と書くことだけだという。書き方の詳細をまとめたハンドブックのページも、追って公開されるとされている。

ドキュメントとコードが離れた場所で管理されていると、更新のタイミングがずれて片方だけが古くなる。本体のコメントに書いておけば、コードを直した人が同じ場所で例も直せる。地味な話に見えるが、説明を長く正しい状態に保つうえでは効いてくる作りだ。

ブラウザの中でPHPを動かす仕組みが土台にある

実行を支えているのはWordPress Playgroundだ。もともとはブラウザの中でWordPress一式を動かすための仕組みで、WebAssemblyに移植したPHPが土台になっている。

この春に公開されたPlayground側の解説によると、<php-snippet> というカスタム要素が追加され、スクリプトタグをひとつ読み込むだけで、任意のウェブページに実行できるPHPの例を置けるようになったという。読者が実行ボタンを初めて押したときに、隠しiframeの中でPHPが読み込まれて動く仕組みで、ページを開いただけでは重い処理は走らない。

同じページに例が複数あるときは、条件が一致していれば同じ実行環境を使い回す。チュートリアルにサンプルをいくつも並べても、そのたびにPHP環境を立ち上げ直すことにはならないわけだ。既定のPHPバージョンは8.4、WordPressは最新版で、属性で指定すれば例ごとに変えられる。WordPressを読み込まず、PHPの言語機能だけを試す指定も用意されている。

自分たちのドキュメントに埋め込むこともできる

この仕組みはWordPress公式サイト専用の機能ではなく、外部のページでも使える。スクリプトを読み込み、要素の中にPHPを置くだけだ。実行前に想定される出力を先に表示しておく指定や、コードを別ファイルから読み込む指定、実行させずに色付け表示だけにする指定などもある。

Blueprintという設定用のJSONを併用すれば、実行前にmu-pluginを置いたり、オプションを設定したり、サンプルの投稿を用意したりといった下準備もできる。複数の例で同じBlueprintを共有すれば、環境を一度だけ用意して順に実行させられる。

導入時の注意点も挙げられている。Content Security Policyを厳しく設定しているサイトでは、Playground側から配信されるスクリプトと隠しiframe、そこから読み込まれる各種ファイルを許可する必要がある。それが難しい環境では、スクリプトを自前で配信して参照先を切り替える方法も案内されている。うまく動かないときは、開発者ツールで失敗している通信を確認するのが早い。

手元に環境がない相手に説明するときに効く

制作会社の立場で考えると、使いどころは社外向けの説明だろう。クライアントや外部の協力者に「この関数はこう動く」と伝えたいとき、手順書を書いてローカル環境の構築から始めてもらうのは相手の負担が大きい。動くものをページに置いておけば、読む側は押して確かめるだけで済む。

自社の技術メモや、配布しているプラグインの説明ページに、短いサンプルを実際に動かせる形で残しておくのも現実的だ。文章で説明した挙動と実際の出力が食い違っていないか、書いた側が自分で確かめられる点も含めて、書く手間に見合うものはありそうに思える。

バックアップを戻すときに動き出す脆弱性

つくば市のホームページ制作会社

サイトの引っ越しやバックアップで広く使われているプラグイン、All-in-One WP Migration and Backup に深刻な脆弱性が見つかり、開発元の ServMask がバージョン 7.110 で修正した。識別番号は CVE-2026-19949、影響を受けるのは 7.109 までのバージョンで、深刻度の指標は 8.8 とされている。有効インストール数が 500 万件を超える定番だけに、預かっているサイトのどれかに入っている、という制作者は少なくないはずだ。

見つけたのはセキュリティ研究者の Jack Taylor 氏で、Wordfence を通じて 8 月半ばに開発元へ伝えられ、8 月 20 日に修正版が公開された。報じられている Wordfence の説明によると、原因はアーカイブを復元する際にデータベースの中身を書き換える処理にあり、エスケープされたバックスラッシュや引用符の解釈が正しくなかったという。

仕込みと発動がずれているところが厄介

この脆弱性が少し変わっているのは、攻撃が二段構えになっている点だ。ログインしていない第三者でも、トラックバックを使って細工したデータを投稿に紐づけて置いておける。置かれた時点では何も起きない。管理者がサイトを書き出し、別の環境に取り込んだその瞬間に、保存されていた文字列が SQL として動き出す。

その結果、プラグインが内部で使う取り込み用の秘密キーが公開コメントとして表に出てしまう可能性がある。キーを手に入れた側は、実行可能なコードを含んだ .wpress ファイルを取り込ませることができ、最終的にサイトを掌握される恐れがあると説明されている。バックアップと復元はこのプラグイン本来の用途そのものなので、いつかは引かれる引き金だと考えておいたほうがいい。

BleepingComputer の集計では、修正版が出てしばらく経った時点でも更新を済ませたのは利用者のおよそ 3 割で、残る 325 万件ほどが古いまま動いていた。バックアップ系のプラグインは普段の運用で触らないぶん、入れたまま忘れられやすい。停止していれば危険度は下がるものの、一時的に有効化すれば同じ経路が開くとも指摘されている。移行の予定がなくても、管理画面を開いてバージョンを確かめる価値はある。自動更新を切っている運用では、ここが抜けたままになりやすい。

実務でもうひとつ気をつけたいのが、手元に残っている古いアーカイブの扱いだ。細工されたデータは投稿に紐づく形でデータベースに入るため、すでに書き出した .wpress の中に紛れ込んでいる可能性がある。修正版に上げてから取り込めば処理する側は安全になるが、まずテスト環境に流して様子を見るくらいの慎重さはあってよいと思う。複数のサイトを預かっている制作会社であれば、このプラグインが入っている案件を洗い出すところから始めるのが早い。移行や復旧のために入れて、そのまま残っているケースも案外あるはずだ。

納品したデザインを崩されない仕組みがテーマ側に増えた

つくば市のホームページ制作会社

WordPressのブロック開発まわりの月次まとめが公開されていて、9月分にはテーマを書く側や制作会社の実務に効きそうな変更がいくつか入っていた。派手な新機能というより、納品したあとのサイトをどう保つかに関わる調整が多い。

背景として、8月に出たWordPress 7.1では、ホバーやフォーカスといった状態のスタイルと、画面幅ごとのスタイルを管理画面から指定できるようになった。CSSを書かずに見た目を触れる範囲が広がったわけだが、これは同時に、制作側が整えたデザインを運用側が意図せず崩せる範囲も広がったということでもある。

状態スタイルの編集をテーマ側で閉じられる

Gutenberg 23.8で、ブロックの状態スタイル編集と、画面幅ごとの編集のそれぞれにオプトアウトの設定が追加された。blockStatesEditingEnabledresponsiveEditingEnabledの2つで、どちらも既定は有効、block_editor_settings_allフィルターからfalseにできる。

使えると感じたのは、無効にしても表示が壊れない点だ。theme.jsonやグローバルスタイル、ブロックのstyle属性ですでに定義してあるスタイルは、どちらの設定でもそのまま出力される。編集画面から触れなくなるだけなので、作り込んだデザインを保ったまま運用担当者に渡せる。サイトを納品して、その後の更新はお客様側で、という進め方をしている案件では出番がありそうだ。

運用者が見る画面まわりでは、投稿の編集画面とウィジェット編集画面が、管理画面で選んだ配色を引き継ぐようになった。あわせてgetAdminThemeColors()が公開の関数として使えるようになっていて、管理画面の本文クラスから配色を読み取り、主要色と背景色を返す。独自の管理画面を追加しているプラグインでも、同じ二行の囲みを入れておけば利用者が選んだ配色に合う。細かい話ではあるが、追加した画面だけ色が違うという座りの悪さは減らせる。

グローバルスタイルで扱える要素が広がった

Gutenberg 23.9では、theme.jsonの要素スタイルにlabelが加わった。styles.elements.labelで指定でき、label要素を出力するマークアップ全般に効く。コアでは検索、フォーム入力、コメントフォーム、アーカイブ、カテゴリーの各ブロックが対象で、サードパーティ製のブロックにも適用される。

引用元表示のcite、テキスト入力、セレクトの3つは、以前からtheme.jsonでは指定できたものの、エディター上のスタイル画面からは触れなかった。これがタイポグラフィと色のパネルから編集できるようになっている。グループブロックはブロック間隔の対応を縦横それぞれに宣言するようになり、theme.json側では文字列だけでなくtopとleftを持つオブジェクトも受け取る。リストブロックの幅広と全幅、クエリーループのブロック間隔といった細かい対応追加も入った。

theme.jsonが無効扱いされる場面が減る

7.1で入った状態スタイルは、記述を検証するスキーマのほうが追いついていなかった。Gutenberg 23.8では、スタイルバリエーション向けの状態、状態が要素ではなくブロックに固有である点、擬似クラス指定の誤りといった箇所に修正が入っている。コードエディターでtheme.jsonを開いたときに、正しい記述が無効として警告される場面が減るという話だ。地味な変更だが、テーマを書いている時間にはそのまま効いてくる。

公式ドキュメントの例をその場で動かせる

もうひとつ、開発者向けリファレンスに載っているコード例が、ブラウザ上で実行できるようになった。関数のページで実行ボタンを押すと、Playgroundで動く本物のWordPressに対してスニペットが走る。例はDocBlockの中にphp interactiveという名前のコードフェンスで書かれていて、ドキュメントと関数の定義が同じファイルに並ぶ形になっている。挙動を確かめるために手元へ環境を作らなくてよくなる分、調べ物の往復は短くなるはずだ。

次のWordPress 7.2は、ベータ版が10月下旬、正式版が12月上旬の予定とされている。独自ブロックを持っている場合、内部ブロックのテンプレート指定がInnerBlocksのプロパティからブロックタイプの設定へ移り、従来の書き方は非推奨になった点は早めに手を入れておきたい。複数人が同時に編集する機能への対応が理由とされていて、今後この種の書き換えはもう少し続きそうだ。

回避策で埋めていた部分が標準機能に変わりつつある

つくば市のホームページ制作会社

九月に入ってから、ブラウザ側と WordPress の編集画面側で、更新の発表が重なりました。目立つ新機能というより、これまで回避策でしのいでいた部分が標準の機能に置き換わるものが多く、日々の制作にはむしろこちらのほうが効いてきます。

Chrome は次の版がベータに入り、編集画面まわりも新しい版が公開されています。実務で使えそうなものを並べて見ていきます。

下線の引き方をCSSだけで決められる

Chrome の次の版のベータには、text-decoration-insettext-decoration-skip-spaces という二つのCSSプロパティが入っています。前者は、下線や上線、打ち消し線を文字の端からどれだけ内側に入れるか、あるいは外側に伸ばすかを指定するものです。auto のほか長さや割合で指定でき、開始側と終了側を別々に書くこともできます。

後者は、装飾の線を空白文字の下で途切れさせるかどうかを決めます。下線の位置を細かく調整したいとき、これまでは背景のグラデーションで線を描いたり、余計な要素を挟んだりして代用していました。文字装飾そのもので済むなら、あとから文字サイズを変えたときの崩れも減ります。

ポップアップが指の操作で勝手に閉じない

popover や dialog には、外側をクリックすると閉じる挙動が標準で備わっています。この判定が押した瞬間と離した瞬間の組み合わせで行われていたため、スマートフォンでポップアップの中身をスクロールしようとした指の動きや、右クリックでも閉じてしまうことがありました。

次の版では判定がクリックそのものに変わり、タッチでのスクロール操作や右クリックでは閉じなくなります。問い合わせフォームや絞り込みメニューをポップアップで出しているサイトなら、入力の途中で消えてしまう取りこぼしが減るはずです。

埋め込み枠の高さを中身に合わせられる

iframe の大きさを中身に合わせる仕組みも入ります。サイト側で明示的に有効にすると、親のページに置いた iframe 要素が、埋め込んだ文書の内容の高さに合わせて広がり、中の文書側にスクロールが発生するのを避けられます。

予約フォームや外部サービスの申し込み画面を埋め込むと、枠の中だけが二重にスクロールする状態になりがちで、これまでは高さを親のページに送り返す処理を自前で書いていました。標準の仕組みでまかなえるなら、埋め込み先ごとに用意していたスクリプトを減らせます。

カルーセルの印にどう振る舞わせるかを選べる

横スクロールで切り替わる領域に付く小さな印をまとめる scroll-marker-group に、links と tabs という二つのモードが加わります。links は既定のモードで、印の並びが案内リンクの一覧として扱われ、それぞれが順番にキーボード移動の対象になります。tabs のほうはタブの並びとして扱われ、選ばれている印だけが移動の対象になって、印の間は矢印キーで動きます。

見た目は同じでも、キーボードや読み上げでの扱いが変わる部分です。ここを自前のJavaScriptで作り込むと支援技術への対応まで自分で面倒を見ることになるので、指定ひとつで役割が切り替わるのは扱いやすいところだと思います。

編集画面では挿入ボタンを探さなくてよくなる

WordPress の編集画面側では、Gutenberg の新しい版でブロックの追加まわりが変わりました。選んでいるブロックによっては追加ボタンが見つけにくく、選択をやり直したり画面をスクロールしたりしていましたが、ブロックのツールバーから直接追加できるようになっています。グループの中に要素を足す、ギャラリーに画像をもう一枚足すといった操作が短くなります。

スタイルまわりでは、個別に上書きした指定が入っているブロックに印が付き、上書きのあるものだけを絞り込んで見られるようになりました。引き継いだサイトで、どこに手が入っているか分からないまま触るのが一番こわいので、一覧できるのは助かります。グループブロックの余白を縦と横で別々に指定できる、theme.json からラベル要素や入力欄、選択欄に指定を書ける、といった細かい追加も入っています。

直っているのは新機能だけではない

Safari の直近の版は、新機能よりも不具合の修正が中心でした。ページの拡大時に ic という文字幅の単位が仕様どおりの値にならない問題、位置指定に position-area を使った固定配置が本文をスクロールできる状態でうまく代替位置に回らない問題、本体のスクリプトが欠けた Service Worker の登録が自動で解除されず、新しいものを登録し直せない問題などが直っています。

この手の修正は告知を追っていないと気づきにくく、原因が分からないまま自分の書き方を疑って時間を使ってしまう部分でもあります。修正の一覧に目を通しておくと、次に似た症状に出くわしたときの見当が付きやすくなります。

こうして並べてみると、自前のスクリプトや回避策で埋めていた部分が、少しずつ標準の側へ移ってきているのが分かります。今あるサイトを急いで書き換える必要はありませんが、次にフォームや埋め込み、横スクロールの領域を作るときには、以前より短い書き方で済まないか一度確かめてみる価値はありそうです。