非互換対応再び
サイトのお守りというのは、言い換えれば「それらを構成するソフトウェア群とそれらが稼働するハードウェア環境の相互関係上の非互換」をいかに回避するか、に尽きると言える。ハードウェアはソフトウェアの命令で動くが、命令の記述が許容されない場合にはエラーを返す、ソフトウェアはソフトウェアにも命令する、それらが一体となって人間が目にする機能が実現されている、やっている側からすれば奇跡に近いが、使う側は知ってか知らずか、常に完璧を求めがちになる。
ウキペディアの元になっているMediawikiのバージョンが1.36へメジャーアップしました。2020年9月のメジャーアップから約8ヶ月、前々回からは少し長かった感じ。今回は、1.35までと言われていた非互換機能が予告通りバッサリ切られたので、多少の改修が必要となりました。
一番影響を受けたのが「HitCounters」という拡張機能で、これは元々はMediawiki本体に含まれていて、各ページがどのぐらい閲覧されたのかをカウントしていたものが、バージョン1.25から本体では削除されてしまい、その時に同じ機能を復元するために登場した拡張機能です。ページの左下に閲覧数を表示するものですが、その際に利用していた「SkinTemplateOutputPageBeforeExec」が削除されてしまったため、対応バージョン (0.3.2.3)が用意されたのですが、1.36対応ではさらに改修が必要でした。
オリジナルのソースを見てみると、コンテンツの言語を取得する部分($wgContLang)が「Fatal Error」を起こしているようです。1.36では「$this->getContentLanguage()」とする必要があるようです。
$link = Linker::linkKnown( $title, $wgContLang->convert( htmlspecialchars( $title->getPrefixedText() ) ) );
正しい取得方法へ変更します。「$wgContLangから$this->getContentLanguage()へ」
$link = Linker::linkKnown( $title, $this->getContentLanguage()->convert( htmlspecialchars( $title->getPrefixedText() ) ) );
この変更を行なった「HitCounters」を使えば、Mediawiki 1.36で閲覧数を左下に表示することが可能です。ややこしいのは正式な1.36対応版は「閲覧数表示」には非対応で、「閲覧数表示対応版 (0.3.2.3)」を1.36対応へ改修したということです。もちろん自己責任となります。同じく「SkinTemplateOutputPageBeforeExec」関連で言えば、フッターに「お問い合わせ」を(Googleの規約で)表示していますが、これも変更が必要でした。
$wgHooks['SkinTemplateOutputPageBeforeExec'][] = function( &$skin, &$tpl ) { $contactusLink = Html::rawelement( 'a', [ 'href' => 'mailto:webmaster@setakinoko.es' ], 'お問い合せ' ); $tpl->set( 'contact', $contactusLink ); $tpl->data['footerlinks']['places'][] = 'contact'; return true; };
なんとなく似てるけど、ちょっと書き方が変わっていて少し悩んだ(笑)
$wgHooks['SkinAddFooterLinks'][] = function( &$skin, &$key, &$footerlinks ) { if ( $key === 'places' ) { $footerlinks['contact'] = Html::rawelement( 'a', [ 'href' => 'mailto:webmaster@setakinoko.es' ], 'お問い合せ' ); return true; } };
頻繁な変更が面倒なら、長期サポート版を使う手もあるけれど、長い間今回のようなメンテナンス(非互換対応)をしないでいると、目利きが鈍るというか、技量を保つことが出来なくなる恐れもあり、この程度の頻度なら、その時は多少面倒だなと思っても、非互換対応を続ける方が得策かなぁなんて思いながらコンソールに向かっておりました。