サポート » テーマ » raindrops_category_navigation() の型変換問題と表示提案について

  • 解決済 hidakat

    (@hidakat)


    2件あります。

    ●get_term_link()の型チェック
    php5.6/wordpress4.2.3環境で、子カテゴリを持つカテゴリを表示しようとした場合に、表示が止まってしまいました。
    define(‘WP_DEBUG’, true);して確認したところ、

    Object of class WP_Error could not be converted to string in .../wp-content/themes/raindrops/functions.php on line 9283

    となりました。当該部分を

    get_term_link( intval($tmp_id), 'category' )

    としたところ、正常に処理されるようになりました。

    同様の修正が、同functions.phpの9323行目あたりでも必要そうです。

    phpの変数型チェックが、環境により異なっているのかもしれませんが、上記修正を追加いただければ幸いです。

    ●「子カテ」の階層表示/並列表示
    上記エラーを解消したのち、表示をチェックしていたところ、
    「子カテゴリが並列している場合も、あたかも階層化しているように表示される」ということに気づきました。

    つまり、

    http://www.tenman.info/wp3/previewraindrops/category/aciform/

    における表示が

    sub menu » sub

    となっているのは、

    sub menu | sub

    または

    sub menu / sub

    となるのが良いのではないだろうか? ということです。

    (http://www.tenman.info/wp3/previewraindrops/category/parent/ 現状だと、このように階層化している状態と区別がつかないわけですね。)

    こちらも改善いただければ幸いです。

    http://www.tenman.info/wp3/previewraindrops/category/parent-category/

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • こんにちは、

    ご指摘ありがとうございます。

    以下の通り、対策案を作りました。

    お手数ですが、@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のアップデートで修正します。

    トピック投稿者 hidakat

    (@hidakat)

    遅くなりました。
    ……ムムム、さっそく貼ってみたのですが、(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 は、うまく動作していると思っていいですか?

    トピック投稿者 hidakat

    (@hidakat)

    おっと、メール通知だと文章がはしょられてしまうのか。。最後の一文を見落としていました。

    えーと、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 = "&raquo;";
    	$flag = 'parent';
    }

    で、フィルタを付けてカスタマイズが出来るようにしました。

    $category_separator = apply_filters( 'raindrops_category_navigation_separator', $category_separator, $flag );

    よろしくおねがいしまーす

    トピック投稿者 hidakat

    (@hidakat)

    最新版(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

    ダウンロードしていただくか、ハイライトされている関数を適用してみてください。

    トピック投稿者 hidakat

    (@hidakat)

    上記コード、ダウンロード→入れ替えしました。
    しかし、残念ながら状況変わらず、でした。まったく同じ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が出なくなっても、何らかのカテゴリーが飛ばされてしまうなどの、事柄が予想されます。

    問題のあるテーマは使わない というのが常識とは思いますが、

    もし、その時点でお使いのようなら、顛末を書き込んでいただけるとありがたいです。

    良いご指摘、ありがとうございました。

    トピック投稿者 hidakat

    (@hidakat)

    おお、うまくいきました!

    https://www.period3.to/category/sound/

    で、ようやく最初の問題提起の回答ですが、

    https://www.period3.to/category/calculator/

    無事、並列するカテゴリは「 | 」区切りで表示できております。

    hardware | linux | macintosh | network | oss | server admin | web designing | wordpress

    私にもっとコード読解能力があればもっとカンタンに解決に辿りつけたような気もしますが……。いずれにしろ、ありがとうございました。大感謝です。

    動作が確認できてよかったです。ありがとうございました。

    特に気になる問題がないようでしたら、解決済みにお願いします。

    トピック投稿者 hidakat

    (@hidakat)

    あ、そうかそうか。 「解決済み」にいたしました。
    ありがとうございました。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「raindrops_category_navigation() の型変換問題と表示提案について」には新たに返信することはできません。