新しければいいってもんじゃないらしい……

今週はWordPress 6.6 Beta1、6.5.4が公開されました。手持ちの2サイトは順次6.5.4へ、開発環境もとりあえずは6.5.4へアップデートしました。

そんなこんなで気分一新し、新しいブロックでも作ってみようかと思い、「create-block」で新しいプラグインを作成。

このコマンドは、wp-content/pluginsディレクトリで実行するのが正解なわけだが、先にプラグインのディレクトリを作ってその中で実行しちゃいがち(その度にやり直してる)。

とりあえずプラグインのディレクトリへ移ってビルド。

プラグインを有効化し投稿編集画面を開いてみたが、作ったブロックが表示されない。なんで!?

投稿編集画面のHTMLソースを見ると、cssファイルはロードされているけど、jsファイルが見当たらない。思いついたことは試してみたが原因がさっぱりわからず昨晩は寝てしまった。

夜があけてXを眺めていると、「浜野さん」のポストを発見!

wordpress/scriptsがv28.0からReactの新しいJSXトランスフォームを使用するようになったのですが、これはWordPress6.5以下では動作しないので、ブロック開発でscriptsを使用していてWordPress6.5以下もサポートする場合は、scriptsのv27.9以下を使う必要があります

https://x.com/tetsuaki_hamano/

ということで、プラグインディレクトリのpackage.jsonを確認。確かに、「^28.0.0」になっていた。

  "devDependencies": {
    "@wordpress/scripts": "^28.0.0"
  }

「^28.0.0」を「^27.9.0」に書き換えて保存。wordpress/scriptsを再インストールして、もう一度ビルド。

投稿編集画面を開き直すと、無事ブロックが表示されました。


本件はWordPress 6.6 Beta1が公開され、それに合わせてwordpress/scriptsもアップデート。このタイミングで新しいブロック(プラグイン)を作成したことにより、生じたのでしょう。これからは、wordpress/scriptsのバージョンに注意しないといけませんね。

Windowsでtouch

ファイルのタイムスタンプを変更したくなった際、Windows環境でもLinux環境と同じようにtouchコマンドが使いたいと思うことがある。PowerShellでタイムスタンプを変更する場合は次のようなコマンド(スクリプト?)が使えるようだが、ちょっと長い感じ。

このことを検索している過程で、Visual Studio CodeでGithubと連携する際にインストールした「Git for Windows」には「bash」が同梱されており、このbashならtouchコマンドが普通に使えることを知った。

これで問題解決かと思ったのですが、このbashにはひと手間が必要で、インストールしたままだと日本語のファイル名が文字化けしてしまいます。

この問題の解決方法を検索したところ、ユーザーのホームディレクトリ(C:\Users\〇〇〇〇)に.bashrcファイルを作成し、その中に次のような内容を記述するといいらしい。

上記を保存し、bashを再度実行。lsコマンドの結果は次のように変わった。

.bashrcファイルの内容は、本来.bash_profileファイルに記載する内容として紹介するサイトを参考にしたものです。.bash_profileファイルを使用する場合は、bashの起動時のパラメータに「-l」を指定する必要があるため、ここでは.bashrcファイルに適用しました。

実際にtouchコマンドを使ってみます。

touchコマンド後、更新日時が変わっていますね。

さて、bash内ではフルパスの指定時に「/c」のようにドライブレターを先頭に指定する必要があるので、これには慣れが必要かもですね。

「WordPress Contributor Meetup Tokyo @新宿」に行ってきた

この週末に「さくらインターネット」さんで開催された「WordPress Contributor Meetup Tokyo @新宿」に参加しました。久しくWordCampなどのイベントには参加していなかったので、ちょっと失敗でもありました。

私自身は、いくつかプラグインを公開していて、ときどき日本語翻訳を提案したり、不具合を発見した際はtracにポストしたりしています。この種のイベントは初参加ではありますが、それなりにコントリビュートしているのかと思っております。

今回のイベントに参加した目的ははっきりとは定めてはおらず、浜野さん、立花さんと少し話す機会があればいいなくらいでした。会場でお二方に会い、お話できたので、目的は十分に達成できてしまいました。参加されていた方々を見てみると、約1/3は初参加。ざっと見た限りMacbook Air/Proの利用者が多かったのですが、浜野さんがDellのノートPCを使っていたのがちょっと驚きです。

どんなイベントになるのかわかっていなかったのですが、トータルではかなり「もくもく」な感じでした。やんわりと翻訳、Core関連、Gutenberg関連のグループに別れ、淡々と手を動かします。翻訳グループのお着物の方、印象強めでした。

私の場合.orgのアカウントはあるのですが、Slackに参加していなかったのでまずはSlackに参加するところから。続いて、浜野さんに勧められて.orgアカウントとGithub連携を行い、ようやくスタート位置にたった感じ。いつかはGutenbergの開発環境を構築したいと思っていたのですが、このタイミングでやりかけてハマッてしまうことは避けたたっかので、今回は見送りに(ゴールデンウイークくらいをめどに、それまでは情報収集な方向で)。

感覚として、WordPressの「コントリビュート」はそんなに身構える必要はなく、気になることがあったらどんどんトライしていいと思っています。もちろんCoreやGutenberg関連のプログラム的な内容についてはできる範囲で検証することが前提です。あと「提案」はしばしば持久戦になります。提案者がすっかり忘れたころに反映されることもあったりするので、ちょっと寛容な気持ちが必要かもしれません。

会場(ドリンクも)をご提供していただいた「さくらインターネット」さん、あらためて感謝いたします。次回参加するまでにはGutenbergの開発環境を構築しておかないとですね。

WordPress 6.5無事リリース!

WordPress 6.5が予定より1週間遅れでリリースされました。今回はベータテスト時のバグ報告したこともあり、コントリビューターリストに名前が載ってます。

6.5では、プラグインの依存関係が指定可能になったり、翻訳ファイルのPHP化による高速化対応など、ブロックエディター関連以外にも機能強化されています。翻訳ファイルのPHP化は標準では実施されておらず、サイト管理者がwp cliやほかの対応ツールを利用することになり、後で試してみたいものです。

1つ申請中のプラグインはチェック待ちなので、そろそろ公開に向けて進んでほしいものです。

段落ブロックに計算支援を実装した

Autocompleteフィルターを使い段落ブロックで簡単な計算ができるようにしてみた。

「=」をトリガーにし、それに続く式を計算して、答えのみか、式と答えの組み合わせを選択する感じ。四則演算を対応した後でべき乗に対応した際、優先度を考慮しわすれてちょいはまり。定数としてはpi(π)とphi(φ)をサポートしてみました。

今回の対応でAutocompleteフィルターを利用したものを4種類。アイデアしだいでいろいろ実装できるのが楽しいフィルターですね。

PHPの整数ってムズくないですか?

現在(絶賛)評価中のWordPress 6.5(Beta)を、いくつかの開発環境で試してみると、日本語で表示されないものがありました。Beta 1のころから3まで症状は解決しなかったので、昨日少し調べてみた。

前提としてその開発環境のロケールは’ja’となっている。これはサイトの言語設定、ユーザーの言語設定とも確認済み。

個別に__()などで翻訳テキストを取得しても、原文(英語)がそのまま返ってくる。

その開発環境のPHPバージョンは次の通り:

そんなわけでmoファイルの読み込み部分をトレースしてみる。

WordPress 6.5 Beta 1の紹介ページ」では直接触れられていないのだが、PHPの翻訳ファイルへの対応が含まれている。この対応にともなって翻訳処理が変更されており、wp-includesディレクトリにはl10nディレクトリが追加され、その中には5つのPHPファイルが存在する。その中の1つがclass-wp-translation-file-mo.phpである。

class-wp-translation-file-mo.phpでは、読み込んだmoファイルの先頭の4バイトを次のように定義されたクラス定数と比較し、moファイルが有効なファイルか評価している。

このコード、何の問題もないように見えるのだが、32ビット版PHPの場合は落とし穴が潜んでいる。self::MAGIC_MARKERをダンプすると、期待していたint型ではなく、float型になっていたのだ。

このことにより、読み込んだmoファイルは不適切なものとなり、正常に読み込まれていなかった。そして結果的にサイトの表記は英語のままとなっていた。

class-wp-translation-file-mo.phpの問題部分を自分なりに修正し、問題の開発環境にて日本語で表示されることを確認。この問題についてtracに報告した。

今朝、PHPの整数についてドキュメントを見直す。そこには、確かにint型の範囲を超える数値はfloat型になる旨が書かれている。個人的な感覚として、0x950412deはそのまま(8バイトの)int型になってもよさそうなのだが、32ビット版PHPではそうならなかった。

何はともあれ、次かその次のBetaでは修正されることを期待したい。

MacBook AirにWeb開発環境を(1)

昨日、久しぶりにMacBook Air(以降MacBook)を立ち上げる。OSのアップデート通知に従い「macOS Sonoma 14.3.1」をインストール。なんだかんだで約1時間、本来の目的である新しいプラグインの動作検証を行った。

このMacBook、Web開発環境を構築する前だったので、この機に少し進めることにした。

Visual Studio Codeから

「ターミナル」を開いて「Homebrew」をインストール。バージョンは4.2.10でした。

続いて「Visual Studio Code」をインストールする。

「Launchpad」から「Visual Studio Code」をクリックし、起動確認。拡張機能の「Japanese Language Pack」も適用しておく。

あと「Git」も忘れずにインストールする。

ダッシュボードのウィジェットを横並びに

WordPressのダッシュボードは、通常縦に並んだウィジェットエリアに複数のウィジェットが縦に並ぶ感じ。この週末を利用し、ウィジェットが横に並ぶようにしてみた。

ウィジェットが横並びにすることで、従来よりもスッキリした感じに。

基本的な部分はadmin_footerアクションで表示を変更するためのCSSを出力。ウィジェットエリアは幅を100%にし、display: flexを適用、左右のウィジェットがくっつかないようgap: 20pxを追加した。また上下のウィジェット間を空けるための下マージンは不要になるので0にした。

CSSだけで大まかなところができたところで、欲張って個別にウィジェットの幅を調整できるようにしたくなった。標準のウィジェットはflex; 1を適用したのだが、各ウィジェットの幅を調整するUIを考えてみた。

「表示オプション」タブをクリックして表示される各ウィジェットのチェックボックスの部分を拡張し、ナンバータイプの入力ボックスを追加。この値が変更されたらそのウィジェットに対してflex: 2のような設定が適用される仕組みとなる。同時(実際は1秒間ディレイした後)に変更された値はAJAXでユーザーのメタ情報をして保存するようにした。

ここまでは順調に進んだのだが、一番下のウィジェットエリアにウィジェットをドロップするところで、少しハマってしまう。

従来ウィジェットエリアは画面幅に応じてエリア数が可変となるレスポンシブな設計になっていたのだが、今回横並びにする際には4つのエリアを常に表示するようにしていた。また各エリアの最小の高さを300pxにしたのだが、ウィジェットによってはドラッグ中の高さがそれよりも高くなってしまい、マウスの可動範囲が制限されていることとも重なって一番下のエリアにドロップできない場合があった。

試行錯誤の結果、ドラッグ中のウィジェットのサイズはjQuery UI Sortableのstartイベントで対応し、マウスの可動範囲については力技でjQuery UI Sortableのオブジェクトにアクセスし、マウスの可動範囲の配列の値を変更することにした。これについてはブラウザなどの環境に依存する可能性がありそうだ。

まあ、なんだかんだでダッシュボードの見た目はだいぶ変わり、きれいに整頓された。そんな矢先、WordPress 6.5 Beta1が公開されてしまった。。。

Googleでログイン

勉強を兼ねて「Google Identity」の認証サービスを使用し、WordPressで構築されたサイトにログインするプラグインを作ってみた。

「Google Identity」の認証サービスではさまざま実装が可能となっており、今回は認証後にリダイレクトするのではなく、フロント側(のコールバック)で受け取ったトークンをサーバー側に送り、サーバー側ではトークンの検証を行う方法を採用した。

なお『「Google でログイン」JavaScript API リファレンス』には次のような一文がある。

トークンを検証して得られるユーザー情報のsubフィールドをユーザーメタ情報に保持し、それにマッチするユーザーのみログインできるようにした。

今回のプラグインで影響を与えたページは次の通り。

  • ログインページ
  • 一般設定ページ
  • ユーザープロフィールページ

ログインページでは、login_headアクションでクライアント ライブラリを読み込み、login_formアクションでボタン部分のスクリプトを出力する。

一般設定ページでは、「Google Identity」のクライアントID用の入力フィールドをadd_settings_section/add_settings_field関数を使って追加する。

ユーザープロフィールページでは、show_user_profileアクションでGoogleアカウントと紐づけるsubフィールドとログイン時と同じGoogleのログインボタンを追加する。

またログインページとユーザープロフィールページ向けにAJAXのレスポンスを返すアクションを追加し、それぞれ「Google Identity」の認証サービスから返ってきたトークンの検証し、適宜内部処理を行った。方針が決まるまで少し時間がかかったが、自分がコーディングしたコードはそれほど多くない。

さてGoogleはトークンの検証機能を含んだライブラリを提供しており、これが約72MBと小さくはない。どこかにトークンの検証機能に絞り込んだライブラリがあるとよいのだが。。。

joyokanji.infoのメンテでやらかした件

昨年末にjoyokanji.infoサーバーのメンテナンスを実施し、PHP 8.1へバージョンアップしました。当日は軽くいくつかのページを閲覧しただけで済ませてしまい不具合の発見が遅れてしまった。

存在しないテーブルのクエリー

PHP(PHP-FPM)のエラーログには次の内容が出力される。

Table 'データベース名.テーブル名' doesn't exist

これま見たままのエラーで、以前はPHP Fatal errorではなかったのでしょう。対応としては、テーブルが存在する場合のみクエリーを実行するようにしました。

get_magic_quotes_gpc関数の呼び出し

エラーログの内容は次の通り。

Call to undefined function get_magic_quotes_gpc()

PHP 8.0.0で削除された関数を数か所で呼び出していました。対応としては、本関数が存在しない場合は呼び出さないように修正しました。

空のIN句を含んだクエリー

エラーログは以下の通り。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY id'

該当のソースコードから次のようなIN句が原因でした。

IN () ORDER BY id

本来マッチした漢字のリストが入るもので、これをマッチした漢字がなくてもクエリーを実行していたことが原因でした。対応としてはマッチした漢字がない場合はクエリーを実行しないように修正しました。

mb_convert_encoding関数で’auto’を指定

エラーログに次の内容が複数回出力されていました。

mb_convert_encoding(): Unable to detect character encoding

これは文書として指定されたものを内部でUTF-8に変換する際、mb_convert_encoding関数を呼び出していたのですが、第3パラメータ$from_encodingに’auto’が含まれていたことが原因でした。暫定的な対応として$from_encodingの内容を見直し、’auto’を含めないように修正しました。

usort関数のコールバックで勘違い

エラーログは次の通り。

usort(): Returning bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero

これはコールバックの戻り値を返すところで、次のように記述していたことが原因でした。

return $a->id > $b->id;

bool値が返ることが原因だったので、次のように修正しました。

return $a->id - $b->id;

まだ気になるところも残っているが…

この週末にエラーログを見ながらいくつか調整。フォームから入力された内容を検証処理を追加したり、文書のUTF-8変換処理を調整したりしました。mb_convert_encoding関数に指定する$from_encodingの最適解を知りたい。