Exec-PHPで<!--more-->があるとphp実行されない問題

WordPressでphp実行するプラグイン『Exec-PHP』。
一覧表示したとき『<!--more-->』がある記事はPHPが実行されていない。
無ければ一覧でも問題ないんだけど。
どうも原因は『<!--more-->』を変換することにあるらしい。
その対応方法。

<!--more-->を使用すると、一覧表示にて問題が発生

出る問題は2つ

  1. 途中またはタイトル以降、エラーメッセージが表示されて終了
  2. PHPが実行されずコードが表示される

1つずつ対応策を書いておきます。

途中またはタイトル以降、エラーメッセージが表示されて終了

『<img src="<?php echo esc_url( site_url() ); ?>/user.gif" />』という使い方したところ、エラーが出た。

原因

テンプレートによっては『<!--more-->』までではなく、途中で文字列を切ってしまうことが原因。

対応方法

PHPの終了タグまで出ていないことが原因でのエラーなので、表示される部分まで、タグが丸ごと入っていれば問題は起きない。

PHPが実行されずコードが表示される

原因

『<!--more-->』をWordPressで処理するのに『<?php』も巻き込んでタグをエスケープ。
それで『<?php』→『< ?php』となってしまうことが原因とのこと。
参照:『wordpressでexec-phpが対応がmoreで反応しない件 | 俺のメモ

結果、書いたPHPが動かないで、書いたコード内容がそのまま一覧にまるっと出ちゃう。
ちなみに、記事側ではHTMLコメントアウトされて表示されない。
ちゃんと見てないけど、WordPressのJavaScriptがコメントアウトしてくれているのかな、と。

多分他のPHP実行系プラグインでも同じような問題が起きるんじゃないかな?と思う、多分。
使ったこと無いし、確認はしていないので、各々確認してみてください。

対応方法

先程の参照元のように『wp-includes/formatting.php』を書き換えてしまうと、アップデート時忘れて戻るから避けたい。
そうすると変換前にどうこうすることは、現時点では出来ない。

なので、一番手っ取り早く解決するには、一度変換されてしまった『< ?php』を『<?php』に戻してしまえばOK。
つまり、プラグイン作って『Exec-PHP』よりも先に実行されるようにすればいい。

プラグインを作る

wp-content\plugins以下に『phpspace.php』を作る。

/*
Plugin Name: phpspace
Plugin URI: https://qooga.jb-jk.net/wp/?p=146
Description: exec-phpのmore対応
Version: 1.0
Author: QoogaKIKAKU
Author URI: https://qooga.jb-jk.net
*/
function phpspace($text) {
	return str_replace("< ?php","<?php",$text);
}
add_filter('the_content', 'phpspace',1);

あとは管理画面の『プラグイン』から『有効』にするだけ。

既存ファイルに追加する

function phpspace($text) {
	return str_replace("< ?php","<?php",$text);
}
add_filter('the_content', 'phpspace',1);

これを、Exec-PHPプラグインの最後に追記するだけ。

『wp-config.php』に追加する方法だと
見ての通り、『add_filter(~,~,1);』と処理順番1番を指定してるのに、Exec-PHPよりも先に処理されないみたいなので、プラグインをイジった方がいい。

プラグインを自作している人は、そこに追加してもOK。

現状、カスタマイズが増えている

公式の最後の更新からしばらく経っているので、結構改造が必要だったりします。
当方は改造して使っているので、見たい人はコチラからどうぞ。


ただし本当に自己責任で。

コメント

タイトルとURLをコピーしました