久し振りの更新です。
先日中つ国WikiをPHP8.0対応のためのPukiWikiアップデートを行ったのですが、昔から使用させていただいている alias.inc.php というプラグインが動作しないことがわかりました。私はPHPは専門外ですし、作者の方のWebサイトも消滅してしまっているようです。PHPに詳しい方、知恵を貸していただけると助かります。
まず配布先ページがもう存在せず、一方でソースはGPLになっているので、ここにソースを転載させていただきます。
対応方法を教えてもらってPHP8.0で実行することが可能になりました!
alias.inc.php
<?php
/*
* PukiWiki Plugin "alias.inc.php"
* ver.1.5 2005/05/28
* ver.1.5.1 2022/04/10
* License is GNU/GPL
* modified by kochi<elfen@s9.xrea.com>
* ver.1.5.1 PHP8.0対応
*/
//ジャンプ先URL文字列の最大長指定
define('URL_MAX_BYTES',1024);
//ジャンプ回数制限
define('JUMP_MAX',2);
function plugin_alias_init()
{
$messages = array(
'_alias_messages'=> array(
'msg_noalias' => "''このページは[[\$dest_page]]へのエイリアスに設定されています。''\n",
'war_mode_invalid' => false, //GETパラメータが対象外
//'war_ignore' => false, //ループの危険性がある呼び出し
'err_loc_invalid' => false, //BODY外での呼び出し(MenuBarなど)
'err_loop' => '(alias:ループしています)', //ジャンプ経路のループ
'err_url_too_long' => '(alias:URLの長さが上限を超えました)', //URL長の上限オーバー
'err_not_exist' => '(alias:指定されたページは存在しません)',//ページが無い・アンカーが不適切
'err_jump_max' => '(alias:ジャンプの回数が上限を超えました)',//ジャンプ回数オーバー
)
);
set_plugin_messages($messages);
}
function plugin_alias_convert()
{
global $script,$vars,$defaultpage,$get;
global $_alias_messages;
if($vars['cmd']=='edit') return '';
$my_get_vars = $get;
//MenuBarなどで呼び出されている可能性
global $body;
if(isset($body))
return $_alias_messages['err_loc_invalid'];
//第一引数をジャンプ先ページ名とする
if(func_num_args()<=0)
return false;
$arg = func_get_arg(0);
$temp = explode('#',$arg);
if(count($temp) > 2)
return $_alias_messages['err_not_exist'];
list($dest_page,$anchor) = $temp;
if(!is_page($dest_page))
return $_alias_messages['err_not_exist'];
//cmd=readでない場合は何もしない
if(array_key_exists('plugin',$my_get_vars) || $my_get_vars['cmd'] != 'read' || !is_page($my_get_vars['page']))
return $_alias_messages['war_mode_invalid'];
//noaliasパラメータがtrueの場合はジャンプしない
if($get["noalias"]=='true'){
$msg = str_replace('$dest_page',$dest_page,$_alias_messages['msg_noalias']);
return convert_html($msg);
}
$alias = '&'.rawurlencode('alias[]').'=';
$history = '';
if(isset($my_get_vars['alias'])){
//ジャンプ回数がすでに上限値に達していたらエラー
if(count($my_get_vars['alias'])>=JUMP_MAX)
return $_alias_messages['err_jump_max'];
//経路履歴をチェック。ループしていればエラー
foreach($my_get_vars['alias'] as $pg){
if($pg == $my_get_vars['page'] || $pg == $dest_page)
return $_alias_messages['err_loop'];
$history .= $alias. rawurlencode($pg);
}
}
//経路履歴にカレントのページを付け加える
$history .= $alias .rawurlencode($my_get_vars['page']);
//ジャンプ先URLを生成。長すぎたらエラー
$url = $script.'?cmd=read&page='.rawurlencode($dest_page).$history;
if(isset($anchor))
$url .= '#'.rawurlencode($anchor);
if(strlen($url) > URL_MAX_BYTES) return $_alias_messages['err_url_too_long'];
//HTTP Headerを出力して終了
header("Location: $url");
die();
}
?>
aliastrace.inc.php
<?php
/*
* PukiWiki plugin aliastrace
* 2005/12/09 version 1.2
*/
function plugin_aliastrace_inline()
{
global $vars;
$history = $vars['alias'];
list($h,$f,$n)=func_get_args();
list($pagename,$ancor) = explode('#',$history[0]);
$uri = "$script?cmd=edit&page=" . rawurlencode($pagename);
if(is_page($pagename))
//return make_link($h.$pagename.$f); //編集ページへリンクしない
return make_link($h) ."<a href=\"$uri\">{$pagename}</a>". make_link($f) ."<hr class=\"full_hr\" />";
else return htmlspecialchars($n);
}
?>
使用方法
使用する時はこのふたつのphpファイルを両方pluginディレクトリに入れます。また pukiwiki.skin.php の <?php echo $body ?> の前に、
<!-- ページエイリアス用 -->
<?php if ($is_page) { ?>
<?php require_once(PLUGIN_DIR.'aliastrace.inc.php'); echo plugin_aliastrace_inline("このページは","より転送されました。" ); ?>
<?php } ?>
<!-- ページエイリアス用 終了 -->
などと記述。またエイリアス元のページ本文には、
#alias(ジョン・ロナルド・ロウエル・トールキン)
という形で転送先のページ名を記述する形になっています。
このソースがPHP8.0の仕様変更で動作しなくなっております、どなか知識を貸していただければと思います。
対応方法を教えてもらってPHP8.0で実行することが可能になりました! 上記のソースを修正しておきましたが、 URL_MAX_BYTES と JUMP_MAX を ’ で囲むだけでした。
akatuki
alias.inc.phpの上記の部分を以下の部分に置き換えることで解消すると思います。
管理人からakatukiへの返信
はい、この方法で対応できました、ありがとうございます。