WordPress: 非互換プラグインのPHP7対応
(怒涛のめもめもリンク集 | WordPress: PHPを5.6から7.3に更新したら、プラグインエラー2件、本文表示失敗の続き)
PHP5をPHP7に更新を行なったらWordPressが動作しなくなった件について、チェックしてみると下記の2つのプラグインのPHP7への非互換性でWordPressの立ち上げ自体が動作しなくなっていた。
- amazon_linkage 0.6.3||リンク切れ
- php_hl_string 0.9.9||リンク切れ
php_hl_string については、下記記事も:
両方ともPHP7の非互換性に関するものだった。元リンクがないので、とりあえずPHP7で動作するように下記のように変更してみた。
amazon_linkage:
- split()をexplode()へ変更。
diff -u old/wp-content/plugins/amazon_linkage/amazon.php wp-content/plugins/amazon_linkage/amazon.php --- old/wp-content/plugins/amazon_linkage/amazon.php 2008-06-07 00:17:48.000000000 +0900 +++ wp-content/plugins/amazon_linkage/amazon.php 2019-11-15 04:33:46.038804505 +0900 @@ -4,7 +4,7 @@ Plugin URI: http://note.openvista.jp/187/ Description: ASIN を指定して Amazon.co.jp から個別商品の情報を取り出します Author: leva + ともかめ -Version: 0.6.3 +Version: 0.6.3b Author URI: http://note.openvista.jp/187/ Special Thanks: Tomokame, 1st created author (http://tomokame.moo.jp/) Special Thanks: Keith Devens.com (http://keithdevens.com/software/phpxml) @@ -212,7 +212,7 @@ for($i=0; $i<count($matches[1]); $i++){ $matches[1][$i] = preg_replace("/[\- ]/", "", $matches[1][$i]); - list($this->asins_[$i], $this->types_[$i], $this->extras_[$i]) = split(",", $matches[1][$i]); + list($this->asins_[$i], $this->types_[$i], $this->extras_[$i]) = explode(",", $matches[1][$i]); $this->shadows_[$i] = true;
php_hl_string:
- preg_replace()をpreg_replace_callback()へ変更。
- eregi_replace()をpreg_replace()へ変更。(eregiは大文字小文字を無視する置換だが、このプラグインでの使用箇所は文字がないので大文字小文字の無視は不要だったかも?)
- 内部から呼び出しているPEAR/Textの関数でのインスタンス生成の「=& new」を「= new」へ変更。
- PHP: 下位互換性のない変更点 – Manual
- new 文の結果を参照渡しで変数に代入することができなくなりました。
- PHP: 下位互換性のない変更点 – Manual
--- old/wp-content/plugins/phphlstring/php_hl_string.php 2019-11-25 05:34:19.887690704 +0900 +++ wp-content/plugins/phphlstring_0.9.9/php_hl_string.php 2019-11-25 05:28:47.537690790 +0900 @@ -3,7 +3,7 @@ Plugin Name: PHP Highligh String Plugin URI: http://www.chameleonic.org/plugin/ Description: PHPのコードを見やすく色分けしながら、行番号をつけます。使い方は、[code lang="php" -1]コード[/code ]のようにbbCode風の専用タグを書きます。 -Version: 0.9.9 +Version: 0.9.9b Author: chameleon Author URI: http://www.chameleonic.org/ */ @@ -24,7 +24,7 @@ */ //PEARに依存する。 -$pear_dir = ABSPATH . 'wp-content/plugins/phphlstring/PEAR'; +$pear_dir = ABSPATH . 'wp-content/plugins/phphlstring_0.9.9/PEAR'; if(is_dir($pear_dir)) ini_set("include_path", ini_get("include_path") . PATH_SEPARATOR . $pear_dir); @@ -88,9 +88,18 @@ function first($content) { - $content = preg_replace('#\[code\](.*?)\[/code\]#sie', '$this->do_hlight(\'\\1\', false, false, $content);', $content); - $content = preg_replace('#\[code lang="(.*?)"\](.*?)\[/code\]#sie', '$this->do_hlight(\'\\2\',\'\\1\',false,$content);', $content); - $content = preg_replace('#\[code lang="(.*?)"\s*?-([0-9]*?)\](.*?)\[/code\]#sie', '$this->do_hlight(\'\\3\',\'\\1\',\'\\2\',$content);', $content); + $content = preg_replace_callback( + '#\[code\](.*?)\[/code\]#si', + function($m){return $this->do_hlight($m[1], false, false, $content);}, + $content); + $content = preg_replace_callback( + '#\[code lang="(.*?)"\](.*?)\[/code\]#si', + function($m){return $this->do_hlight($m[2],$m[1],false,$content);}, + $content); + $content = preg_replace_callback( + '#\[code lang="(.*?)"\s*?-([0-9]*?)\](.*?)\[/code\]#si', + function($m){return $this->do_hlight($m[3],$m[1],$m[2],$content);}, + $content); return $content; } @@ -107,7 +116,7 @@ function do_hlight($txt, $lang = false, $sl, $content) { //fixed for PHP-------------------- - $txt=eregi_replace('<?','<',$txt); + $txt=preg_replace('#<?#i','<',$txt); //--------------------------------- if(!($sl==false)){ $options = array('numbers' => HL_NUMBERS_LI, 'tabsize' => 4,); @@ -142,9 +151,18 @@ function first_pre($content) { - $content = preg_replace('#\[code\](.*?)\[/code\]#sie', '$this->do_blocks(\'\\1\',false, $content);', $content); - $content = preg_replace('#\[code lang=\\\"(.*?)\\\"\](.*?)\[/code\]#sie', '$this->do_blocks(\'\\2\', \'\\1\', $content);', $content); - $content = preg_replace('#\[code lang=\\\"(.*?)\\\"\s*?-([0-9]*?)\](.*?)\[/code\]#sie', '$this->do_blocks_extend(\'\\3\', \'\\1\',\'\\2\', $content);', $content); + $content = preg_replace_callback( + '#\[code\](.*?)\[/code\]#si', + function($m){return $this->do_blocks($m[1],false, $content);}, + $content); + $content = preg_replace_callback( + '#\[code lang=\\\"(.*?)\\\"\](.*?)\[/code\]#si', + function($m){return $this->do_blocks($m[2], $m[1], $content);}, + $content); + $content = preg_replace_callback( + '#\[code lang=\\\"(.*?)\\\"\s*?-([0-9]*?)\](.*?)\[/code\]#si', + function($m){return $this->do_blocks_extend($m[3],$m[1],$m[2], $content);}, + $content); return $content; } --- old/wp-content/plugins/phphlstring/PEAR/Text/Highlighter.php 2005-08-14 20:36:08.000000000 +0900 +++ wp-content/plugins/phphlstring_0.9.9/PEAR/Text/Highlighter.php 2019-11-24 22:42:12.468698227 +0900 @@ -199,7 +199,7 @@ return PEAR::raiseError('Highlighter for ' . $lang . ' not found'); } - $obj =& new $classname($options); + $obj = new $classname($options); return $obj; } @@ -353,7 +353,7 @@ { if (!($this->_renderer)) { include_once('Text/Highlighter/Renderer/Html.php'); - $this->_renderer =& new Text_Highlighter_Renderer_Html($this->_options); + $this->_renderer = new Text_Highlighter_Renderer_Html($this->_options); } $this->_str = $str; $this->_state = -1;