レ点腫瘍学ノート

Top / pukiwikiカスタマイズ箇所 / 2022

Pukiwiki 1.5.4正式版導入

pukiwiki

以前からPukiwiki 1.5.4 RCを導入していましたが、2022年4月にPukiwiki 1.5.4の正式版を導入しました。PHPは今のところVersion 8.1.0 RC5で動作させています。

手順

基本的にlibフォルダを全てPukiwiki 1.5.4正式版で上書きしました。また、pukiwiki.ini.php、default.ini.php、ja.lng.phpは1.5.3のものと上手いことマージさせました。
プラグインは旧版でもPHP 8.1で問題なく動作するものは、一部のカスタマイズをしていたこともあり旧版を流用しているものもあります。

URL短縮プラグイン s.inc.php が標準で利用しやすく

BugTrack/2525 - PukiWiki-dev
https://pukiwiki.osdn.jp/dev/?BugTrack/2525

これまでダジャレンジャーさんの作成されたPukiwiki URL短縮プラグインを使用していましたが、公式のs.inc.phpが短縮URLにより簡単に対応できるよう改良されたので、ダジャレンジャーさん作成のPukiwiki URL短縮プラグインの使用をやめて公式のs.inc.phpでのURL短縮を利用しています。なお、s.inc.phpの設定はpukiwiki.ini.phpに書き込むことで使用開始できますが、これまで英数字10桁での短縮URLを使用していた場合はs.inc.phpの設定(9)を使えばURLはダジャレンジャー版URL短縮プラグインと変わりません。Google SEO的にもURL変更なく移行できるのはメリットですね。

実際には、当サイトでは今のところ(8)の方法と(9)の方法を混ぜて使用しています。つまり、表記方法としては(9)の方法をベースにしつつ、リダイレクトも有効にするというものです。ちょうど10文字の英数字でタイトルが付けられたページがあると不具合が生じるかも知れませんが、そのあたりは未検証です。

/////////////////////////////////////////////////
// Page-URI mapping handler ( See https:// pukiwiki.osdn.jp/?PukiWiki/PageURI )
class ShortUrl2PageURIHandler extends PukiWikiStandardPageURIHandler {
function get_page_uri_virtual_query($page) {
exist_plugin('s'); // Load s.inc.php
$page_id = plugin_s_get_page_id($page);
if ($page_id) {
return '?' . $page_id;
}
return '?' . pagename_urlencode($page);
}

function get_page_from_query_string($query_string) {
exist_plugin('s'); // Load s.inc.php
$m = array();
if (preg_match('#^([0-9a-z]{10})$#', $query_string, $m)) {
$page = plugin_s_get_page_from_page_id($m[1]);
if ($page) {
return $page;
} else {
// Not found
http_response_code(404);
die_message('Not found');
exit;
}
}
$is_get = $_SERVER['REQUEST_METHOD'] === 'GET'; //ここから(8)の方法
if ($is_get) {
	if (strpos('&', $query_string) !== NULL) {
		$dec_page = urldecode($query_string);
		$page_id = plugin_s_get_page_id($dec_page);
		if ($page_id) {
			$short_url = get_page_uri($dec_page, PKWK_URI_ROOT);
			header("HTTP/1.1 302 Found");
			header("Location: $short_url");
			exit;
		}
	}
}
return parent::get_page_from_query_string($query_string);
}
}
$page_uri_handler = new ShortUrl2PageURIHandler();

短縮URLから正式URLへの逆変換

s.inc.phpは正式URLであるページ名から短縮URLへの変換は可能ですが、逆方向の変換には対応していないようです。そこで、ダジャレンジャーさんの短縮URLを使っていた頃からの方法を併用して短縮URLから正式URLへの変換も可能にしておきます。

具体的には、libフォルダに fileshorturl.php を置いておいて、lib/pukiwiki.phpのどこか(46行目くらい?)に下記の文章を加えておきます。

// URL短縮ライブラリロード
require(LIB_DIR . 'shorturl.php');
$vars['page'] = get_pagename_from_short_url($vars['page']);

こうしておくことの利点は、10桁短縮URLからも正式ページにアクセスできることです。このため sample.com?cmd=edit&page=(10桁英数字) のようなアクセスが可能になります。s.inc.phpだけですと、このURLにアクセスすると「10桁英数字」というページ名を新規作成するページに飛んでしまうようなので…。

移行に関するプラグイン関係の修正

標準では入っていないプラグイン

標準から改造しているプラグイン

s.inc.phpでの短縮URLに対応するよう微修正

追記:jsonld.inc.phpについては、リビジョン1.04のバージョンからこの問題は修正されたようです。

上記のPukiwiki 1.5.4から標準装備となった(標準装備ではないそうです)使いやすくなったs.inc.phpでの短縮URLへの対応をするには、$page からURLへの変換に get_page_uri($page) を使うのが最も確実です(参考記事)。s.inc.phpでの短縮URLを有効にしていても短縮URLではなく通常URLを出力するプラグインは get_page_uri($page) 以外の方法でURLを生成していると思われますが、ここに少し改造をします。

たとえばjsonld.inc.phpの場合は80行目付近に下記のようなコードがあります。

foreach ($names as $name) {
 $path .= (($path != '')? '/' : '') . urlencode($name);
 $bread[] = array(
 '@type' => 'ListItem',
 'position' => ++$i,
 'name' => $name,
 'item' => $script . '?' . $path
 );
}

ここではスラッシュで区切った各階層の$pathに対してurlencodeを適用して、それを $script?$path としてURLに変換しています。そこで、この領域を下記のように書き換えます。

get_page_uri($page) には絶対パスで出力するように PKWK_URI_ABSOLUTE というオプションを付けていますが、これはサイトの設定に応じて適宜変更してください(PukiwikiのPageURIの絶対パスと相対パスに関する参考記事)。

foreach ($names as $name) {
 $name2 .= (($name2 != '')? '/' : '') . $name;
 $link = get_page_uri($name2, PKWK_URI_ABSOLUTE);
 $bread[] = array(
 '@type' => 'ListItem',
 'position' => ++$i,
 'name' => $name,
 'item' => $link
 );
}

ここではスラッシュで区切った各階層のページ名に対して get_page_uri($page) を使うことでURLを取得しています。これにより、s.inc.phpでの短縮URLを有効にしているサイトではjsonld.inc.phpのパンくずリストが出力するURLも短縮されたものになります。

sitemap.inc.phpやrss.inc.phpも同様です。URLを取得する部位のコードを get_page_uri($page) に変更します。

スキン改変

このサイトのPukiwikiはあちこちを改造しているためPukiwiki 1.5.4で動作するのか不安もありましたが、スキンに組み込んでいるtopicpath.inc.phpとjsonld.inc.phpの改造を対応させればちゃんと動作しました。このスキンは、サイドバーを使えるように修正して、いずれGPLで公開したいと考えています(まだ着手できていませんが)。

timestamp.inc.phpの不具合?

timestamp.inc.phpの使用法には2種類のものがありますが、

?plugin=timestamp&page=ページ名

で使う方法が短縮URLではうまく作動しません。ダジャレンジャー版URL短縮プラグインの時は作動していましたんですが。

?plugin=timestamp

で使用可能なので実用上はそこまで問題はありませんが・・・。

その他


この記事に対するコメント

このページには、まだコメントはありません。

お名前:


添付ファイル: fileshorturl.php 332件 [詳細] filejsonld.inc.php 264件 [詳細] filetopicpath.inc.php 318件 [詳細] fileref.inc.php 267件 [詳細] filesitemap.inc.php 341件 [詳細] filerss.inc.php 287件 [詳細]

更新日:2022-04-24 閲覧数:954 views.