MediaWiki

提供:きまぐれ手記 Kimagurenote
移動先: 案内検索
当サイトではアフィリエイト広告を掲載しています

この「きまぐれ手記」を動かしている MediaWiki に関するメモ書き。

「きまぐれ手記」を動かしているソフトウェア(抜粋)

その他(問い合わせフォーム、バナー自動表示など)は自作。

SNS/Link Icons

MediaWiki

言わずと知れたフリーの巨大百科事典 Wikipedia を運用するために開発された、Wikiシステム。最近の言い方をすればCMSの一種。PHPで書かれており、GPLで配布されているオープンソースプロジェクト。

Mosaic の頃から Webサイトを運用していた筆者にとり、慣れたHTML直書きの方が楽で、最近流行りのCMSを使うのは苦痛でしかないんだが、そうは言ってもWebサイトの共同運営や、これまた最近流行りのSNS連携を考えると、CMS利用に移行する方が楽かもしれないと思い、試行運営することにした。

(SNSが流行る前、blogが流行っていた頃は、trackbackなどを部分的に独自実装していたんだけどね…最近そんな時間も無ければ、SNSがどんどん出てきて対応しきれない面もあって。)

その際にいくつかのCMSを検討したが、WordPress は某所で運用していて面倒でしかなかったこと、以前Wikipedia編集に参加していた頃に文法を習得していたこと、またExtensionなど試してみたいこともあって、今回は MediaWiki にて試行を始めた。

以下は、このサイトでの試行錯誤の備忘録。

Skin

Tweeki

公式の解説→mw:Skin:Tweeki

1.28.x 導入後は、Tweeki を(無改造で)使わせていただいている。フロントエンドTwitter Bootstrap を利用しており、図らずも時代の流れに追いついた(笑)。

見た目がすっきりしたのは良いが、これに伴いバナーやリンクアイコンを置く場所が無くなった試行錯誤しながら少しずつ追加している。→Tweeki#How-to

Timeless

MediaWiki 1.31 で標準添付Skinが整理され、搭載されるようになった。

Tweekiは閲覧用には良いが、編集には少々使いづらいので、編集用アカウントではTimelessを使っている。

編集関連メニューが使いやすく、ダークモードも用意されている。ダークモードへ切り替えるには、MediaWiki:Timeless.css を開いて、ダークモード用のスクリプトに書き換える(MediaWiki 1.32 以降では「インターフェース管理者」権限が必要)。

Minerva Neue

Wikipediaなどでも使われている、モバイル端末向けの外装。シンプル軽快で、章ごとに折り畳めるといった特徴がある。

基本、mw:Extension:MobileFrontend と併用する。 モバイル端末では標準のスタイルシート MediaWiki:Common.css が有効にならず、MediaWiki:Mobile.css に指定する必要がある。

ちなみに mw:Extension:MobileFrontend#Tweeki を併用して、Tweekiを使いながら章の折り畳みもできる。

基本的な機能を使うだけなら、設定は簡単。

LocalSettings.php 
wfLoadExtension( 'MobileFrontend' );
$wgMFDefaultSkinClass = 'SkinMinerva';

Tweeki と併用すると、{{#tweekihide:}} などの本文中に埋め込んだタグが表示(出力)されてしまう、class="img-responsive" の指定がうまく働かないといった問題が起きるので、互いにうまく調整する必要がある。

GoMediaWikiSkin改

当初使わせていただいていたもの。GoMediaWikiSkin のデザインを基本に、960 grid system の除去、twitter埋め込みタイムラインやバナーの追加などを行いながら試行錯誤していた。

改造しながら騙し騙し使い続けていたが、1.28.x 導入時に全く動かなくなってしまったため手放し、#Tweeki に変更した。

Extensions

基本、標準添付のものを除く(特記事項があるもののみ掲載)

HeadScript

MediaWiki 1.34.1 にアップグレードしたら、HeadScriptが原因でMediaWiki全体が動作しなくなってしまったので、パッチを作って対処した。

このExtensionは作者と連絡が取れないようで「unmaintained」になってしまっていたが、これが無いと地味に不便になるので、メンテナンスされるようになるといいね…

→2020年9月頃から、再びメンテナンスされるようになった。今は普通に新しい版をインストールすれば使える。

SyntaxHighlight

MediaWiki の配布ファイルに標準添付されているが、MediaWiki 1.31 以降の同梱版では Python 3 が必要になったようだ。→mw:Extension:SyntaxHighlight/ja#インストール

さくらのレンタルサーバには Python 2 しか入っていないため、MediaWiki 1.31 以降を普通にインストールすると SyntaxHighlight は動作せず、<syntaxhighlight>タグが含まれるページを編集すると「構文ハイライトエラーがあるページ」になってしまう(;_;)。

試しに、あえて MediaWiki 1.30 対応版を選んで配布元からダウンロードしてまるごと置き換えたら、さくらのレンタルサーバ+ MediaWiki 1.32.x 環境下でも使えたので、しばらくはそれでしのいでいたが、この方法は MediaWiki 1.34.1 では使えなくなってしまった(ページ編集時に「致命的例外」発生)。

そこで、MediaWiki 1.30 対応版パッケージに含まれる pygments ディレクトリの中身を最新版にコピーしてやる(pygments だけを旧版に差し替えてやる)と、めでたく(?)さくらインターネット (Python 2) でも使えるようになった。

% cd /path/to/mediawiki/extensions/
% mv SyntaxHighlight_GeSHi/pygments SyntaxHighlight_GeSHi/pygments.org
% fetch https://extdist.wmflabs.org/dist/extensions/SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz
% tar xzf SyntaxHighlight_GeSHi-REL1_30-87392f1.tar.gz SyntaxHighlight_GeSHi/pygments/

ただし、この方法で不具合が出ないとも限らないので、自己責任でどうぞ。

ちなみに、対応しているlang一覧はここ → Supported languages

LinkAttributes

これを使うと、リンクにtitleなどの属性を付加できる。

ただし配布されていた最新版 (LinkAttributes.body.php on Jun 30, 2022) がバグ持ちだったので、修正して使っている。

--- LinkAttributes.body.php.head        2023-07-05 10:28:21.713753000 +0900
+++ LinkAttributes.body.php     2023-07-05 10:44:13.000000000 +0900
@@ -42,10 +42,10 @@
                /* Extract attributes, separated by | or |. /u is for unicode, to recognize the |.*/
                $arr = preg_split( '/[||]/u', $_text);
                $_text = array_shift( $arr );
-               if ($text instanceof HtmlArmor) {
-                       $_text = new HtmlArmor($_text);
+               if ($_text instanceof HtmlArmor) {
+                       $text = new HtmlArmor($_text);
                } else {
-                       $text = $text;
+                       $text = $_text;
                }

                foreach ( $arr as $a ) {

とりあえずPhabricatortalkに報告しておいたが、直るかどうか…

また、このExtensionを有効にした状態では、リンク内で装飾を加えることができない(バグか仕様かは不明…バグっぽいけど)。 例:

[[きまぐれ手記|'''内部リンク'''の例]]

<b>内部リンク</b>の例

このように不具合があったりバグっぽい挙動があったりするので、必要性が低ければあえて使わない方がいいかも(^^;。

Major Versions

公式のアップグレード案内は⇒ mw:Manual:Upgrading/ja

MediaWiki 1.39

mw:Release_notes/1.39

本サイトでは2023年 7月 1日 (1.39.4) より利用開始。 LTS版なので長く運用する予定

同時に PHP 8 に更新したため、YJShoppingなどでPHP絡みの修正をした。

CloudImage」を自作した:)。

Tweekiの更新に伴い、Bootstrap 3→4 に変わり、レイアウト修正に追われた。特にフッタは全面的に書き換えが必要になった。

PHP8絡みと思われるが、FlickrAPIを使っているページが例外を吐いて止まるようになった(;_;)。ソースを覗いたら組み込まれている他者のライブラリで9年前に更新が止まっており、これを使い続ける場合は全面的な書き換えが必要になりそう。いっそFlickrの利用をやめる機会かもしれない…

ちなみに最新版の MediaWiki 1.40 は同日(日本時間)公表されたばかりで、対応する Tweeki はまだ出ていない。

MediaWiki 1.35

mw:Release_notes/1.35

本サイトでは2020年12月22日 (1.35.1) より利用開始。

1.34.4 から移行し、従来と同様の問題はあったが(従来と同様の対策でOK)、新しい問題は起きていない。

これからはLTS版を長く運用する予定。

1.35.10まで更新しながら運用。2023年 9月のサポート終了に備えて、2023年 7月 1日に #MediaWiki 1.39 に移行。

2023年 6月頃に TweetANew が動作しなくなった。Twitter運営会社が旧APIを停止したためと思われる。TwitterがEV成金に乗っ取られて以降改悪が続いており、2023年 7月初旬には既存ツイートが非ログイン状態で見られなくなってしまい、Facebookより酷いことになった。このExtensionサポートは続いているようだが、最新版を組み込むとMediaWikiが起動しなくなるので実質稼働していない。もっともTwitter自体の情報収集や広報のツールとしての意義が失われている状況で、ユーザー離れが続きそう。

MediaWiki 1.34

mw:Release_notes/1.34

本サイトでは2020年6月4日 (1.34.1) より利用開始。

相変わらずコマンドラインの update.php がうまく動作しない(起動しても無反応ですぐに終了)。 Webブラウザから /mw-config/ を開いてインストールすることで、データベースのアップデートまで無事完了した。

Extension:HeadScript を有効にしていると MediaWiki 自体が動作しないため、一旦 HeadScript を無効にしてからアップグレードを完了させ、その後に対処した

SyntaxHighlight の古いバージョンが動かなくなってしまったので、さくらのレンタルサーバでは素直に使えなくなってしまった。(⇒素直じゃない使い方

同時にPHPをバージョンアップした(7.3.x → 7.4.6)せいで、YJShoppingAmazonSearchでnoticeやwarningが出るようになってしまったため、急遽対処に追われる羽目になった…

MediaWiki 1.33

mw:Release_notes/1.33

(snip)

MediaWiki 1.32

mw:Release_notes/1.32/ja

2019年4月11日未明にプロバイダ(さくらインターネット)がバージョンアップを実施して以降、突然動作しなくなってしまった。

PHPのバージョンアップが原因と想定し、MediaWikiを再インストールすることに。どうせならと途中を飛ばして最新版にした。

  1. MediaWikiインストールディレクトリとデータベースのバックアップ
  2. さくらインターネットのコントロールパネルでPHPのバージョンを最新に変更
  3. MediaWikiの配布ファイルをダウンロードして展開し、必要なファイルをコピー
  4. 後から追加した(標準添付されていない)SkinやExtensionなどをダウンロードして展開
  5. maintenance/update.php を実行する(でも大抵失敗するんだよね)
  6. update.php がうまく動かないときは、Webブラウザから /mw-config/ を開いてインストールする(大抵こちらの方がうまくいく)。このときにデータベースもアップデートされ、古いバージョンには戻せなくなる。
  7. まずはトップページが表示されることを確認
  8. 表示されない・エラーが発生する場合は LocalSettings.php を編集し、追加したSkinやExtensionを一旦無効にするなど、原因の切り分けを実施する
  9. 不具合の出所が判ったら、個別に対処する
  10. Special:Version を開き、MediaWikiやPHP、Extensionなどの変更が反映されていることを確認

MediaWikiインストールディレクトリとデータベースのバックアップ

% tar czf mediawiki-backup.tgz -C /path/to/www mediawiki-dir
% mysqldump --hex-blob -Q -h (database server) -u (database user) -p (database name) -c > mediawiki-database-backup.sql
Enter password: (database password)
% php /path/to/mediawiki/maintenance/dumpBackup.php --full > mediawiki-dump-mysql.xml

生成されたファイル(上記の例では mediawiki-backup.tgz, mediawiki-database-backup.sql, mediawiki-dump-mysql.xml の3つ)を保存しておく。

ただし、確実にデータが取得できたことを確認して、maintenance/dumpBackup.php が確実に動いている場合は、mysqldump はなくても良い。

MediaWikiの配布ファイルをダウンロードして展開

念のため、現在のMediaWikiインストールディレクトリの名前を変更し保存しておく。

% cd /path/to/www
% mv mediawiki mediawiki-old
% fetch https://releases.wikimedia.org/mediawiki/1.32/mediawiki-1.32.0.tar.gz
% tar xzf mediawiki-1.32.0.tar.gz
% mv mediawiki-1.32.0 mediawiki
% cd mediawiki-old
% cp -p .htaccess LocalSettings.php ../mediawiki

後から追加した(標準添付されていない)SkinやExtensionなどをダウンロードして展開

Skin(Tweeki)の展開例。他のSkinやExtensionも同様にする。

% cd /path/to/www/mediawiki/skins
% mv Tweeki Tweeki.old
% git clone https://github.com/thaider/Tweeki

Changes

Bugs

  • インストーラ (maintenance/update.php) が相変わらずおかしい。
  • Extension:TweetANew が動かなくなった(エラーは出ないがツイートも出ない)。これはまぁいつものことか…
  • InstantCommons が使えない:例外*が発生し、該当ページ全体が表示されない不具合が発生中。→ #CurlHttpRequest の不具合修正

CurlHttpRequest の不具合修正

画像の埋め込みや説明表示で、下記の例外が発生していた。

InvalidArgumentException from line 102 of /path/to/mediawiki/includes/http/CurlHttpRequest.php: Error setting curl options.

調査すると、ForeignAPIRepo.php から呼び出された CurlHttpRequest.php の中での、php curl curl_setopt_array() の呼び出し処理で起きていた。

試しに動作実績のある MediaWiki 1.29 のモジュールに入れ替えて試してみたが、結果は同様だった。さくらインターネットのアップデート絡みの不具合かもしれないが、試しに $wgUseInstantCommons = false; にしても、やはり例外発生する。

ひとまず、Commonsの画像を埋め込んでいる[[Image:…]]タグを記事中から全て外して保存し直すことで例外が起きないようにした。

後日追調査したところ、curl_setopt_array() に渡している値の中に、CURLOPT_PROXY (値は空)があった。ここは本来、使用しないなら null にする(=値を渡さない)べきもの。

試しに、下記テストスクリプトを さくらのレンタルサーバで実行してみたら、curl_setopt_array() が正常終了しなかった(TRUEが返らなかった)。

再現用:PHP Manual curl_setopt_array の例より

<?php
// 新しい cURL リソースを作成します
$ch = curl_init();

// URL その他のオプションを適切に設定します
$options = array(CURLOPT_URL => ' https://commons.wikimedia.org/w/api.php?…',
                 10018 => 'MediaWiki/1.32.1 ForeignAPIRepo/2.1',
                 10036 => 'GET',
                 10004 => ''    /* CURLOPT_PROXY */
                );

echo curl_setopt_array($ch, $options);

// URL の内容を取得し、ブラウザに渡します
curl_exec($ch);

// cURL リソースを閉じ、システムリソースを開放します
curl_close($ch);
?>

そこで、下記パッチを作成。これを当てることで例外発生を回避できた。

CurlHttpRequest-1.32.1.patch 
--- CurlHttpRequest.php.org     2019-01-11 05:21:50.000000000 +0900
+++ CurlHttpRequest.php 2019-05-20 22:47:24.000000000 +0900
@@ -50,7 +50,9 @@
                        return Status::wrap( $this->status ); // TODO B/C; move this to callers
                }

-               $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
+               if( !empty( $this->proxy ) ) {
+                       $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
+               }
                $this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;

                // Only supported in curl >= 7.16.2

とりあえずこのパッチは phabricator にも投げておいた: https://phabricator.wikimedia.org/T223911

MediaWiki 1.29

1.29.0 は見送り、1.29.1 Bugfix Release が出てから更新してみたが…

サーバのコマンドラインから update.php が動かない。エラーも何も出ずに終了してしまう。標準以外のextension,skinを外して試しても同様。

LocalSettings.php すら引き継がない素の状態で動かしてみたら、Webインストールは動作していたので、Webブラウザから /mw-config/ を実施すると動作した。

その後 Tweeki を設定すれば動いた。

6月に作った Extension:TweetANew の 1.29.x 対応パッチを動作確認中…

MediaWiki 1.28

1.27.x を飛ばして 1.28.x を導入。

MediaWiki 1.26

1.25.x を飛ばして 1.26.x を導入したため、1.25.x での変更点も含む。

MediaWiki 1.24

2014年12月 3日より、1.24.0 の運用開始。

  • スタイルシートが変わったのか、{{Special:ページ一覧}} の各項目の上に線が出るようになっていた。
  • 今回から iconv が必須になっている。1.23 になった時に Extensions:TweetANew が不具合を起こしたが、今回またマルチバイト関数の扱いが変わったとすると、再度確認が必要かもしれない(まだ試していない)。--2014年12月5日 (金) 23:22 (JST)
  • jQuery 1.11.1 が標準で組み込まれるようになった。これに伴い Extension:FlickrShow で jQuery を標準で組み込まないようにする。
  • Extension:NewArticleTemplate の旧バージョン (1.11.0) を使っていたら不具合を起こし、新規ページ編集ができなくなった。最新 (1.24.0) に更新して解消。
% cd /path/to/extensions/NewArticleTemplate
% fetch https://raw.githubusercontent.com/mathiasertl/NewArticleTemplates/master/NewArticleTemplate.php

MediaWiki 1.23

2014年 6月15日より、1.23.0 に切り替え、12月 3日まで運用していた。

MediaWiki 1.22

現在のMediaWiki版「きまぐれ手記」が稼働した2013年12月時点の最新版 1.22.0 より、1.22.7 まで運用。

  • 参照元skinで使われていた 960 grid system を外し、本文を常に90%幅で表示するようにした。ブラウザを最大化した時に無駄な余白が出なくなってすっきり。右端のリンク類を見たい場合は横スクロールしてくださいまし。--2014年1月15日 (水) 20:43 (JST)
  • 新着/更新情報が twitter に自動ついーとされるように、Extension:TweetANew を設定。 --2014年1月13日 (月) 04:05 (JST)

運用めも

バックアップ

詳しくは Manual:Backing up a wiki を参照。

(MySQLで運用している場合)

LocalSettings.php に定義しているデータベース関連パラメータを控えておく。

% mysqldump --hex-blob -Q -h $wgDBserver -u $wgDBuser -p $wgDBname -c > mediawiki_database_backup.sql
Enter password: $wgDBpassword
% php /path/to/mediawiki/maintenance/dumpBackup.php --full > mediawiki_database_dump.xml
% tar czf wiki_backup.tgz /path/to/mediawiki mediawiki_database_backup.sql mediawiki_database_dump.xml
% rm mediawiki_database_backup.sql mediawiki_database_dump.xml

wiki_backup.tgz(実際のファイル名にはwiki名や日付等を入れる方が良い)を保存しておく。

セキュリティアップデート

リビジョンひとつのアップデートならば、差分パッチを当てるのが簡単。

% cd /path/to/mediawiki
% mkdir patch
% cd patch
% fetch http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.7.patch.gz
mediawiki-1.22.7.patch.gz                     100% of 3237  B   12 MBps
% fetch http://download.wikimedia.org/mediawiki/1.22/mediawiki-i18n-1.22.7.patch.gz
mediawiki-i18n-1.22.7.patch.gz                100% of  573  B 9168 kBps
% cd ..
% gunzip -ck patch/mediawiki-1.22.7.patch.gz | patch -p1 >& patch/mediawiki-1.22.7.patch.log
% gunzip -ck patch/mediawiki-i18n-1.22.7.patch.gz | patch -p1 >& patch/mediawiki-i18n-1.22.7.patch.log
% cat patch/mediawiki-1.22.7.patch.log
...
% cat patch/mediawiki-i18n-1.22.7.patch.log
...

※ -i18n ファイルは、現在は使われていない。

【参考】mediawiki-announce メーリングリストを購読(無料)しておくと、セキュリティアップデートが公開される際にお知らせ(英語)が届く。

アップデート

マイナーバージョンが上がる場合は、一旦別のディレクトリに入れ直す方が良い。 詳しくは Manual:Upgrading を参照。

  • 念のためデータベースを#バックアップ
  • 最新の配布ファイルを取得
  • 配布ファイルを展開
  • .htaccess, LocalSettings.php 各ファイルと、images ディレクトリをコピー
  • 標準以外のSkinsを使っている(または作っている)場合はそれをコピー
  • 標準以外のExtensionsを使っている(または作っている)場合はそれをコピー
  • 以前のmediawikiディレクトリの名前を変更(一時的に保存するため)
  • 新しいmediawikiディレクトリの名前を変更(外から見られるようにする)
  • 新しいMediaWikiに含まれているデータベースのアップデート処理を動かす
% php /path/to/mediawiki/maintenance/update.php

※1.29あたりから update.php がまともに動かなくなっているよう。うまく動かない場合は Webブラウザから/mw-config/ を開いて動かすと良い。

  • これで更新完了のはず。試しにブラウザで表示してみる(初回表示時は時間がかかる)。
  • Special:Version ページを見てバージョンを確認。

設定めも

外部リンクにnofollowを付けない

公式の解説 → mw:Manual:nofollow, mw:Manual:$wgNoFollowLinks/ja

MediaWiki は不特定多数の編集者を想定しているため、スパム対策で、外部リンクに rel="nofollow" を付ける設定が標準になっている。

個人や企業・団体のサイトなど、特定の編集者しかいないサイトで利用する場合には不要なので、これを付けないようにするために、LocalSettings.php に下記の設定を追加する。

LocalSettings.php 
$wgNoFollowLinks = false;

外部リンクのアイコンを変更する

公式の解説 → w:en:Help:External link icons

スタイルシートで変更できるので、MediaWiki:Common.css に設定を追加すれば良い。 例:

MediaWiki:Common.css 
#content a[href$=".xls"].external,
#content a[href$=".XLS"].external,
#content a[href$=".xlsx"].external,
#content a[href$=".XLSX"].external {
	background: url("http://upload.wikimedia.org/wikipedia/commons/b/ba/Page_white_excel.png") center right no-repeat; padding-right: 18px;
}

すなわち、全ての外部リンクのアイコンを無効にしたい場合は、MediaWiki:Common.css に下記の設定を追加すれば良い。 例:

MediaWiki:Common.css 
#content a.external {
	background: none;
}

なお、全てではなく特定のリンクのみアイコンを表示したくない場合は、記事中の該当する要素個別に class="plainlinks" を適用する。

例:記事中で該当するリンクのみを下記のように記述する

<span class="plainlinks">http://example.com/test.pdf</span>

httpsの外部リンクのアイコンを変更する

httpsの外部リンクのアイコンが錠マークになっているが、近頃はhttpsの方が一般的だし、錠マークはログインが必要なページでよく用いられることから紛らわしいため、通常の外部リンクのアイコンに変更した。

例:MediaWiki:Common.css に下記を追加

MediaWiki:Common.css 
#content a.external[href^="https://"],.link-https {
	background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") center right no-repeat;
	background: url("/resources/src/mediawiki.skinning/images/external-ltr.png") center right no-repeat!ie;
	padding-right: 13px;
}

該当する画像の置き場所はSkinによって異なるので、各サイトで調整が必要。

本文の字下げ

MediaWiki:Common.css に下記設定を追加。

MediaWiki:Common.css 
/* 本文の字下げ(最初の行を除く) */
DIV.mw-content-ltr P {
	text-indent: 1em;
}

DIV.mw-content-ltr P:first-of-type {
	text-indent: 0;
}

なお、この設定と Font Awesome を併用すると、Font Awesome の手前に余計な空白が入ってしまうことがあるので、Font Awesome を使っている場合は、下記のような設定を追加しておく。

MediaWiki:Common.css 
/* Font Awesome への干渉を防ぐ */
I.fa, I.fab, I.fad, I.fal, I.far, I.fas {
	text-indent: 0;
}

印刷用画面の書式変更

MediaWiki:Print.css に記載した内容が有効になる。

拡張めも

フッタに任意の Powered by アイコンを追加する

LocalSettings.php に下記の設定をする。 参考:mw:Manual:$wgFooterIcons

LocalSettings.php 
$wgFooterIcons['poweredby']['freebsd'] = array(
	"src" => "/path/to/bannerimage.gif",
	"url" => "http://www.freebsd.org/ja/",
	"alt" => "Powered by FreeBSD",
	"width" => "171", 
	"height" => "64"
);

Skinによっては、規定でアイコンが非表示にされているものがあり(Tweekiなど)、その場合は各Skinに固有の設定の追加が必要になる。

関連記事を表示する

Extension:RelatedArticles が使えるが…

本来は全てのページに自動で挿入され、関連性の高いページが表示されるようだが、フル機能を使うためには CirrusSearch が必要。 CirrusSearch を使うには cURL と Elasticsearch が必要。 Elasticsearch を使うには Java が必要だが、レンタルサーバでは別途JDKのインストールが必要。 JDKを入れられないことはないが、パッチ当てなど運用の手間がばかにならない…

…ので自動挿入は諦めた^^;。

Extension:RelatedArticles は、各ページに手動で挿入すれば、CirrusSearch が無くても動作するので、とりあえず使ってみる。

LocalSettings.php 
/* RelatedArticles */
wfLoadExtension( 'RelatedArticles' );
$wgRelatedArticlesUseCirrusSearch = false;
$wgRelatedArticlesFooterWhitelistedSkins = ['vector', 'monobook', 'cologneblue', 'tweeki'];

$wgRelatedArticlesFooterWhitelistedSkins で、表示するskin名を指定するが、全て小文字で書かないと認識されないようだ。

  • 各ページ(関連記事を表示したいページ)に下記タグを追加
{{#related:ページ名}}

各ページに追加するタグで、ページ名を手動で指定しないといけないので、どこまで意味があるのか… →結局使わなくなった(^^;

サイトマップを自動生成する

検索エンジンに読ませるためのXMLサイトマップは、MediaWikiに付属のメンテナンスコマンド generateSitemap.php で生成できる。

例:

% php /path/to/mediawiki/maintenance/generateSitemap.php --fspath /path/to/mediawiki/sitemap --identifier=wiki --urlpath /sitemap  --server https://wiki.example.com --compress=no --skip-redirects

上記のコマンドを実行すると、こんな感じで生成される。

--skip-redirects は、リダイレクトを含めない指示。Googlebot向けにはリダイレクトを含めないよう推奨されている。

うまく生成されることを確認したら、自動更新されるように、crontab に書いて定期的に動かすと良い。crontab の設定方法はサーバによって異なるが、例えば FreeBSD ではこんな感じさくらのレンタルサーバではこんな感じ

サイトマップは名前空間ごとに生成されるが、通常は名前空間Mainだけを検索対象にすれば良いだろうから、sitemap-wiki-NS_0-0.xml というファイルを検索エンジンに読ませれば良いだろう。

検索エンジンに読ませるには、robots.txt に記述するか、Google Search Console を使って登録する。

robots.txt 記述例:

Sitemap: https://wiki.example.com/sitemap/sitemap-wiki-NS_0-0.xml

Extension:YouTube を lazy loading にする

Google PageSpeed Insightsを見ていると、埋め込んでいるYouTube(とAdSense)が遅いと言われる。Googleが自分で何とかしろよと思わなくもないが、YouTubeは ‎<iframe> タグに loading="lazy" を付加することで比較的簡単に対処できる。

Extension:YouTube を使って埋め込んでいるが、このExtensionは独自に $wgYouTubeEnableLazyLoad = true; にすることで lazy loading に対応しているものの、ソースを覗くと標準的な手法ではなく、標準の処理を抑制する(1クリックしないと標準の処理が動かない)もので、しかも代替の画像が lazy loading になっておらず、あまり使い勝手が良くないので、‎<iframe> に loading="lazy" を付ける現代的な手法(?)に、ソースを弄って対応した:)。

YouTube-1.9.3_lazyloading.patch 
--- YouTube/YouTube.php.org	2023-06-02 16:07:39.000000000 +0900
+++ YouTube/YouTube.php	2023-07-31 17:09:28.000000000 +0900
@@ -74,7 +74,7 @@
 	 * @return string
 	 */
 	public static function embedYouTube( $input, $argv, $parser ) {
-		global $wgYouTubeEnableLazyLoad;
+		global $wgYouTubeEnableLazyLoad, $wgNativeImageLazyLoading;
 
 		// Loads necessary modules for lazy loading:
 		// Video poster image will be loaded first and replaced by the actual video once clicked
@@ -190,7 +190,7 @@
 
 			if ( !empty( $ytid ) ) {
 				$url = $urlBase . $ytid . '?' . $argsStr;
-				$content = $iframe = "<iframe width=\"{$width}\" height=\"{$height}\" src=\"{$url}\" frameborder=\"0\" allowfullscreen></iframe>";
+				$content = $iframe = "<iframe width=\"{$width}\" height=\"{$height}\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " src=\"{$url}\" frameborder=\"0\" allowfullscreen></iframe>";
 				if ( $wgYouTubeEnableLazyLoad ) {
 					$img =
 						'<img width="' . $width . '" height="' . $height . '" src="'
@@ -252,6 +252,8 @@
 	}
 
 	public static function url2aoaid( $url ) {
+		global $wgNativeImageLazyLoading;
+
 		$id = $url;
 
 		if ( preg_match( '/http:\/\/www\.archive\.org\/details\/(.+)$/', $url, $preg ) ) {
@@ -294,7 +296,7 @@
 			if ( !empty( $argv['playlist'] ) ) {
 				$uri .= "&playlist=" . (bool)$argv['playlist'];
 			}
-			return "<iframe src=\"$uri\" width=\"$width\" height=\"$height\" frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen></iframe>";
+			return "<iframe src=\"$uri\" width=\"$width\" height=\"$height\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " frameborder=\"0\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" allowfullscreen></iframe>";
 		}
 	}
 
@@ -430,6 +432,8 @@
 	}
 
 	public static function embedNicovideo( $input, $argv, $parser ) {
+		global $wgNativeImageLazyLoading;
+
 		$nvid = '';
 		$width  = 400;
 		$height = 326;
@@ -454,7 +458,7 @@
 
 		if ( !empty( $nvid ) ) {
 			$url = "https://embed.nicovideo.jp/watch/{$nvid}";
-			return "<iframe width=\"{$width}\" height=\"{$height}\" src=\"{$url}\"></iframe>";
+			return "<iframe width=\"{$width}\" height=\"{$height}\"" . ( $wgNativeImageLazyLoading ? ' loading="lazy"' : '' ) . " src=\"{$url}\"></iframe>";
 		}
 	}

↓上記のパッチを、こんな感じで適用する↓

% cd /path/to/mediawiki/extensions
% wget -O - https://github.com/wikimedia/mediawiki-extensions-YouTube/archive/master.tar.gz | tar xzf -
% mv mediawiki-extensions-YouTube-master YouTube
% wget -O - https://kimagurenote.net/file/YouTube-1.9.3_lazyloading.patch | patch -p -

また、この追加機能を利用するには、LocalSettings.php に $wgNativeImageLazyLoading の設定が必要:

LocalSettings.php 
$wgNativeImageLazyLoading = true;

なお、$wgYouTubeEnableLazyLoad は指定しない(または false にする)こと。

Extension:YouTube のノートにも書いておいた。)

Extension:HeadScript でスクリプトを読み込む

Google PageSpeed Insightsを見ているとYouTubeと並んで遅いと言われるのが Google Adsense

最悪YouTubeは無くてもいいが、Adsenseを外すのは…という場面もあると思う。

この対策としては、Extension:HeadScript を使って ‎<head>...‎</head> 内に Adsense のスクリプトを埋め込むこと。

そして、個別の広告ユニット(タグ)に含まれるスクリプトを削除すること。

筆者も無意識に貼っていたが(もとい、広告ユニット毎にファイルを分割して管理していたので、貼る時にいちいち中身を見ないから気づかなかった)、よく見ると Google Adsense の広告タグには同じスクリプト(下記の例の1行目色付き部分)が含まれている。

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script>
<ins class="adsbygoogle"
	style="display: block; min-height: 160px;"
	data-ad-format="fluid"
	data-ad-layout-key="-f9+5v+4m-d8+7b"
	data-ad-client="ca-pub-1234567890123456"
	data-ad-slot="9876543210"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

この1行目のスクリプトが、全ての広告ユニットに含まれているものだから、これを繰り返し読むことでオーバーヘッドが生じているようだ。

そこで、この1行目のスクリプトを Extension:HeadScript を使って ‎<head>...‎</head> 内に貼り付け、各広告ユニットでは1行目を省いて貼ると、Adsenseの負荷が劇的に改善した。

LocalSettings.php 
/* HeadScript */
wfLoadExtension( 'HeadScript' );
$wgHeadScriptCode = <<<'START_END_MARKER'
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script><!-- Google AdSense -->
START_END_MARKER;
広告ユニット(タグ) 
<!-- script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1234567890123456" crossorigin="anonymous"></script -->
<ins class="adsbygoogle"
	style="display: block; min-height: 160px;"
	data-ad-format="fluid"
	data-ad-layout-key="-f9+5v+4m-d8+7b"
	data-ad-client="ca-pub-1234567890123456"
	data-ad-slot="9876543210"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
無効にした箇所(広告ユニットの1行目)が判りやすいようにコメントにしてあるが、削除して構わない。

広告を入れる

Google Adsense

Google Adsense の「自動広告」を入れてみた。

  • 「自動広告」の設定(利用する広告タイプを選択)し、スニペット(埋め込むタグ)を取得
  • 取得したタグを<head>に入れる必要があるので、Extension:HeadScript をダウンロードして展開
  • LocalSettings.php に下記追加
LocalSettings.php 
/* Google AdSense (HeadScript) */
require_once "$IP/extensions/HeadScript/HeadScript.php";
$wgHeadScriptCode = <<<'START_END_MARKER'
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
	(adsbygoogle = window.adsbygoogle || []).push({
		google_ad_client: "ca-pub-0000000000000000",
		enable_page_level_ads: true
	});
</script>
START_END_MARKER;

HTMLets

mw:Extension:HTMLets を使うと、予めサーバに用意したファイルを埋め込むことができる。別途ファイルを用意する手間はかかるが、各種アフィリエイトのタグを埋め込めるようになる。

Extension を展開した後、LocalSettings.php に下記を追加。

LocalSettings.php 
/* HTMLets */
require_once "$IP/extensions/HTMLets/HTMLets.php";
$wgHTMLetsDirectory = "$IP/(任意のディレクトリ)";

ファイルを置く場所は任意に指定できる(もちろん読み取り権限がある場所に限られる)。後からExtensionを更新することを考えると、Extensionとは異なる場所を作る方が良さそう。ただし他の(埋め込みたくない)ファイルと混在させない方が良い。拡張子は .html のみのよう。

Tweeki

Skin(Tweeki) の余白に広告を埋め込んでみた → Tweeki#HTMLタグの埋め込み

これを使うと外部スクリプトの呼び出しもできるので、スクリプトを書ける人なら大抵何でもできる。→

YJShopping

記事中にショッピングサイトへの商品リンク(画像付)を埋め込む(Yahoo!ショッピング商品検索API利用)Extensionを自作。 詳細 → YJShopping

AmazonSearch

通常は YJShopping を使うにしても、Amazonにしかない商品が少なからず存在するので、Amazonにしかない商品のリンクを埋め込むために作成。 詳細 → AmazonSearch

Yado

記事中に宿泊施設へのリンク(画像付)を埋め込む自作Extension。楽天トラベルキーワード検索APIを利用。 詳細 → Yado

ランダムに記事を表示する

MediaWiki に標準添付の拡張機能、おまかせ表示カテゴリ内おまかせ表示が使える。

例→ Special:RandomInCategory/鉄道路線

使えない場合は、mw:Extension:Random In Category を確認。

Debug

詳しくは mw:Manual:How_to_debug/ja を参照

下記いずれかを設定する

  • php.ini に下記の記述を追加
php.ini 
error_reporting = E_ALL
display_errors = On
  • LocalSettings.php に下記の記述を追加
LocalSettings.php 
/* for debug */
error_reporting( -1 );
ini_set( 'display_errors', 1 );

詳しいエラー発生位置を知りたい場合は、さらに $wgShowExceptionDetails を追加する

LocalSettings.php 
$wgShowExceptionDetails = true;

これでエラーメッセージ(warningを含む)が表示されるようになる。 他の閲覧者にも表示されるので、デバッグは手早く済ませよう:)

(自作Extensionなどのデバッグは、独自にログを吐くなどの処理を加える方が良いかも。)

参考リンク

関連記事