レ点腫瘍学ノート

pukiwikiカスタマイズ箇所/2022/Pukiwiki 1.5.4正式版導入 の履歴ソース(No.9)

#author("2022-04-29T09:37:56+09:00;2022-04-24T15:49:34+09:00","default:tgoto","tgoto")
&tag(pukiwiki);

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

#contents

* 手順 [#c4d5ebcc]

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

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

#ogp(https://pukiwiki.osdn.jp/dev/?BugTrack/2525)

これまでダジャレンジャーさんの作成された[[Pukiwiki URL短縮プラグイン>https://dajya-ranger.com/pukiwiki/embed-url-shortener/]]を使用していましたが、[[公式のs.inc.php>https://pukiwiki.osdn.jp/dev/?BugTrack/2525]]が短縮URLにより簡単に対応できるよう改良されたので、ダジャレンジャーさん作成のPukiwiki URL短縮プラグインの使用をやめて公式のs.inc.phpでのURL短縮を利用しています。なお、s.inc.phpの設定はpukiwiki.ini.phpに書き込むことで使用開始できますが、これまで英数字10桁での短縮URLを使用していた場合はs.inc.phpの[[設定(9)>https://pukiwiki.osdn.jp/dev/?BugTrack/2525#j4da4be5]]を使えば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への逆変換 [#h524f442]

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

具体的には、libフォルダに &attachref(shorturl.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桁英数字」というページ名を新規作成するページに飛んでしまうようなので…。

* 移行に関するプラグイン関係の修正 [#e9ad937d]

** 標準では入っていないプラグイン [#cc71ca4d]

- [[jsonld.inc.php>https://pukiwiki.osdn.jp/?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/jsonld.inc.php]] ※下記改造あり
- [[htmlinsert.inc.php>http://pukiwiki.sonots.com/?Plugin%2Fhtmlinsert.inc.php]]
- [[tag.inc.php>http://pukiwiki.sonots.com/?Plugin%2Ftag.inc.php]]
- [[alias.inc.php>https://arda.saloon.jp/blog/2022/04/aliastraceincphp-php80.html]]
- [[attachref.inc.php>https://pukiwiki.osdn.jp/?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/attachref.inc.php]]
- [[timestamp.inc.php>https://pukiwiki.osdn.jp/?自作プラグイン/timestamp.inc.php]]
- [[自作プラグイン/ogp.inc.php>pukiwikiカスタマイズ箇所/自作プラグイン/ogp.inc.php]]
- [[自作プラグイン/tweet.inc.php>pukiwikiカスタマイズ箇所/自作プラグイン/tweet.inc.php]]

**標準から改造しているプラグイン [#jaa1b9c5]

- &attachref(ref.inc.php);
-- [[WEBPフォールバック>https://oncologynote.com/?5b041d2a93]]
-- 遅延読み込みの対応
- &attachref(topicpath.inc.php);
-- 各ページで子要素を読み込めるように
- [[search.inc.phpプラグインでGETメソッドを可能にする>https://oncologynote.com/?5c5fe2d226#m3111428]]

** s.inc.phpでの短縮URLに対応するよう微修正 [#f7926b39]

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

- &attachref(rss.inc.php);
- &attachref(sitemap.inc.php);
- &attachref(jsonld.inc.php);

上記のPukiwiki 1.5.4から%%標準装備となった%%(標準装備ではないそうです)使いやすくなったs.inc.phpでの短縮URLへの対応をするには、$page からURLへの変換に get_page_uri($page) を使うのが最も確実です([[参考記事>https://pukiwiki.osdn.jp/dev/?BugTrack/2525]])。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の絶対パスと相対パスに関する参考記事>https://pukiwiki.osdn.jp/dev/?PageURI#o0b6c755]])。

 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) に変更します。

*スキン改変 [#fc222b90]

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

* timestamp.inc.phpの不具合? [#pdef7f1c]

[[timestamp.inc.php>https://pukiwiki.osdn.jp/?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/timestamp.inc.php]]の使用法には2種類のものがありますが、
 ?plugin=timestamp&page=ページ名
で使う方法が短縮URLではうまく作動しません。ダジャレンジャー版URL短縮プラグインの時は作動していましたんですが。
 ?plugin=timestamp
で使用可能なので実用上はそこまで問題はありませんが・・・。

* その他 [#sc1919c6]

- [[htaccessのキャッシュ対応>https://oncologynote.com/?5c5fe2d226#r507f408]]
- [[存在しないページへのアクセスを404にする>https://oncologynote.com/?5c5fe2d226#d7ee84a9]]
- [[AutoTicketLinkNameというページが何度削除しても自動生成されるのを完全に防ぐ>https://oncologynote.com/?5c5fe2d226#ef3f9e9e]]
- [[autolink作成時のコメントを入れない>https://oncologynote.com/?5c5fe2d226#v551bb94]]
- [[スマホでページを見た際に数字が並んでいても電話番号としてのリンクを貼らない>https://oncologynote.com/?5c5fe2d226#r5906c5d]]
- [[デフォルトで「タイムスタンプを更新しない」に>https://oncologynote.com/?5c5fe2d226#v627f67e]]

#navi(pukiwikiカスタマイズ箇所/2022)