こんにちは、
ご指摘ありがとうございます。
以下の通り、対策案を作りました。
お手数ですが、@hidakat さんの環境で、ご希望通りになっているかどうかチェックしていただけると助かります。
https://gist.github.com/tenman/6f591b2430c5c739c06a
functions.php の 先頭のPHP区間に、関数を貼り付けていただくと動作すると思います。
sub menu | sub
が実現できていることが確認できましたら、test3のフィルタコードを、
同様に、functions.phpの先頭のPHP区間に貼り付けていただき、
sub menu / sub
が実現できるかどうかご確認ください
phpの変数型チェックが、環境により異なっているのかもしれませんが、
たぶんそうだろうと思い、上記2個の関数は対策してみましたので、エラーが再発しないかどうか 確認いただけるとうれしいです。
OKであれば、現在1.308をレビュー申請中なので、1.309のアップデートで修正します。
遅くなりました。
……ムムム、さっそく貼ってみたのですが、(test1とtest2。念のため、test1だけ、も試してみました)
Catchable fatal error: Object of class WP_Error could not be converted to string in /var/www/wp/wp-includes/formatting.php on line 3177
が出ますね。(define(‘WP_DEBUG’, true); です)
子テーマ使ってカスタマイズしているんで、raindrops/functions.phpには手は入れてないんですが……。
協力ありがとうございます。
Catchable fatal error: Object of class WP_Error could not be converted to string in /var/www/wp/wp-includes/formatting.php on line 3177
このエラーは、コアの esc_url()関数で、
function esc_url( $url, $protocols = null, $_context = 'display' ) {
$original_url = $url;
if ( '' == $url )
return $url;
$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);
...
preg_replace関数が、URLチェックを行っているくだりで、発生しているエラーみたいです。
なので、テーマ側では、ちょっと対応できないかもしれないです。
( esc_url($url)を使う場合に、$url自体をテーマ側で評価するような事は通常行われていないので、、、)
この問題を除き test1, test2, filter test は、うまく動作していると思っていいですか?
おっと、メール通知だと文章がはしょられてしまうのか。。最後の一文を見落としていました。
えーと、test1,test2をコピペした時点でfatalが出てしまうので、「うまく動作していません」、です。
正常表示
このようにカテゴリが表示されている状態で、raindrop/functions.phpに当該コードを貼ると、
途中から真っ白
になり、define(‘WP_DEBUG’, true); すると、
fatal出して死亡
……ということなのです。
https://gist.github.com/tenman/6f591b2430c5c739c06a のコードをちゃんと読み解けていないのですが、
“www.period3.to/category/sound/” というurlの処理で問題が生じている、のでしょうか?
お手数かけます
https://github.com/tenman/raindrops
の、右サイドバーの一番下にある Download zip で、テーマをダウンロードして、FTPからインストールしてみていただけますか?
テーマ内のバージョンは1.309になっています。
こちらでも、PHP Version 5.6.11 でチェック済みで 動作しています。
( WP_DEBUG true です )
esc_url()の preg_replaceの動作も、簡単に、確認してみましたが、問題なさそうです。
Fatalの直接の原因にはならないと思います。
$url = 'www.period3.to/category/sound/';
// ok
$url = 'www.period3.to/category/ sound/';
// ok www.period3.to/category/sound/
$url = 'www.period3.to/category/<>sound/';
// ok www.period3.to/category/sound/
$url = 'www.period3.to/"category/"sound/';
// ok www.period3.to/category/sound/
$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url);
var_dump( $url );
https://gist.github.com/tenman/6f591b2430c5c739c06a
で、やった変更について、
id を get_term_link( intval($tmp_id), 'category' )
だと動くという事だったので、2つの関数とも、absint()を追加しました。
兄弟カテゴリと、階層の異なるカテゴリのセパレータを分けるために、
ループ内に、以下のように条件分岐をして、key – 1 と key の値を比較する事で兄弟、親子の区別をつけることにしました。
if( $sibling == $term->parent ) {
$category_separator = '|';
$flag = 'sibling';
} else {
$category_separator = "»";
$flag = 'parent';
}
で、フィルタを付けてカスタマイズが出来るようにしました。
$category_separator = apply_filters( 'raindrops_category_navigation_separator', $category_separator, $flag );
よろしくおねがいしまーす
最新版(1.309)、入れました。
残念ながら状況かわらず、です。
Catchable fatal error: Object of class WP_Error could not be converted to string in /var/www/wp/wp-includes/formatting.php on line 3177
ですね。
http://www.period3.to/ だと、階層化されたカテゴリがある場合はfatalが出てしまいます。
念のため、全プラグイン停止、も試してみましたが状況変わらず、です。
phpはlinux自体のディストロ、バージョンはかなり違うのですが、別サイトに入れると、wpは最新版/raindropsは1.309の組み合わせで、何の問題もなく表示されますね。。
http://sd.pot.co.jp/category/oshigoto
そうですか
raindrops_category_navigation() を 見直してみました。
変更内容は、get_term_children( $tmp_id, ‘category’ ) の戻り値が empty
get_term_by( ‘id’, $tmp_id, ‘category’ )の戻り値 false をチェックするようにしてみました。
エラーを発生させる条件を持っていないので、アテズッポといえば それまでなんですが、要は WP_Errorクラスが、動かないようにすれば良い事なので、値のチェックで何とかなるかもと考えたものです。
https://github.com/tenman/raindrops/blob/master/functions.php#L9317-L9366
ダウンロードしていただくか、ハイライトされている関数を適用してみてください。
上記コード、ダウンロード→入れ替えしました。
しかし、残念ながら状況変わらず、でした。まったく同じfatalエラーで止まります。
私のブログ(のカテゴリ? エントリ) とraindropsの組み合わせのみで発生しているようなので、申し訳ない限り、なのですが、
●昔使ってたテーマ(Hemingway Reloadedベース)
●Blain
●Twenty Fifteen
●obandes
いすれもsoundカテゴリが正常表示されています。とりわけ、nobita様謹製のobandesテーマでも正常表示できているので、やはりraindrops固有の、なにかサブマリン的なバグが原因なのではなかろうか、とも思っております。。
つたないコーディングにつきわせて申し訳ありません。
コードを、再再度見直しました
発生エラーが cachable fatalなので、エラーの発生するループを飛ばしてみる事にしました。
foreach loop の中で、
if ( is_wp_error( $url ) ) {
continue;
}
更に、それでも不具合のある場合のために、
global $raindrops_category_navigation;
if( isset( $raindrops_category_navigation ) &&
false == $raindrops_category_navigation ) {
return;
}
このため、この変更を行ったうえでも、エラーを回避できない場合
functions.phpの冒頭に、
$raindrops_category_navigation = false;
を記述し、関数自体の動作を停止できるようにしました。
https://github.com/tenman/raindrops/blob/master/functions.php#L9323-L9387
可能であれば、再度テストをお願いします。
hidakatさんの環境で、エラーがやはり出ていたとしても、これで、.org にテーマレビュー依頼したいと思います。
現実の中にRaindropsを投入して、hidakatさん同様の問題の発生を待ちながら
同様の問題が発生するようであれば、別の方法等も含めて検討したいと思います。
hidakatさん 厚かましいお願いばかりで、ごめんなさい。
先ほど、新しいバージョンを .org にレビュー申請しました。
いすれもsoundカテゴリが正常表示されています。とりわけ、nobita様謹製のobandesテーマでも正常表示できているので、やはりraindrops固有の、なにかサブマリン的なバグが原因なのではなかろうか、とも思っております。。
Object of class WP_Error could not be converted to string in .../wp-content/themes/raindrops/functions.php on line 9283
だったものが、コードの変更によって
Catchable fatal error: Object of class WP_Error could not be converted to string in /var/www/wp/wp-includes/formatting.php on line 3177
になっているわけなので、raindrops_category_navigation()のコードに問題がある事は、他のテーマを比較するまでもなく、コードに問題があると考えています。
とりわけ、$url = get_term_link( $tmp_id, 'category' );
のところが、エラーの発生原因になっているのではないかと疑いを持っています。
https://codex.wordpress.org/Function_Reference/get_term_link
のサンプルコードなどでも、エラーを予定済みのようなコードになっているので、
同様のスタイルにしましたが、たとえ、fatalが出なくなっても、何らかのカテゴリーが飛ばされてしまうなどの、事柄が予想されます。
問題のあるテーマは使わない というのが常識とは思いますが、
もし、その時点でお使いのようなら、顛末を書き込んでいただけるとありがたいです。
良いご指摘、ありがとうございました。
おお、うまくいきました!
https://www.period3.to/category/sound/
で、ようやく最初の問題提起の回答ですが、
https://www.period3.to/category/calculator/
無事、並列するカテゴリは「 | 」区切りで表示できております。
hardware | linux | macintosh | network | oss | server admin | web designing | wordpress
私にもっとコード読解能力があればもっとカンタンに解決に辿りつけたような気もしますが……。いずれにしろ、ありがとうございました。大感謝です。
動作が確認できてよかったです。ありがとうございました。
特に気になる問題がないようでしたら、解決済みにお願いします。
あ、そうかそうか。 「解決済み」にいたしました。
ありがとうございました。