WordPressのお話です。最近はたくさんのサイト構築のお手伝いで脳味噌混乱気味ですが、そんな中、チェックボックスを使用すると出てくるPHPの警告で悩んだのでその件について。
form の checkbox でPHP警告
HTMLにフォームありますね、<form> 。チェックボックスありますね、checkbox。チェックボックスですから、結果を配列で受けとりたいですね、そのときどうしますか。 name に [] を付けますね。
するとPHPの警告が出るんです。
Warning: urlencode() expects parameter 1 to be string, array given in…
最初は自分のミスを疑います。案の定些細なミスがあちこちにあって、丹念に修正するのですがそれとは関係なしにこの警告が出続けます。
どの部分にエラーが出ているかというと、WordPressのここなんですね、これが。
/wp-includes/formatting.php on line 5424
formatting.phpなんて知らんがな。
<form>の部分は行数の多いので、テストのために行数を減らして基本的なところだけを書いてみたりします。
<form method="post"> <label><input type="checkbox" name="genre[]" value="craft">craft</label> <label><input type="checkbox" name="genre[]" value="wood_work">wood_work</label> <label><input type="checkbox" name="genre[]" value="clay">clay</label> <label><input type="checkbox" name="genre[]" value="frame">frame</label> <input type="submit" value="送信"> </form> <?php var_dump($_POST["genre"]); if (isset($_POST['genre'])) { $genre = implode(",", $_POST["genre"]); echo 'genre:' . $genre; } ?>
ここまでシンプルにして、さてテストすると
Warning: urlencode() expects parameter 1 to be string, array given in…
このあと、phpの部分を削って<form>だけにしてみました。
<form method="post"> <label><input type="checkbox" name="genre[]" value="craft">craft</label> <label><input type="checkbox" name="genre[]" value="wood_work">wood_work</label> <label><input type="checkbox" name="genre[]" value="clay">clay</label> <label><input type="checkbox" name="genre[]" value="frame">frame</label> <input type="submit" value="送信"> </form>
ここまで単純化してどうすんのというレベルですが、試してみると
Warning: urlencode() expects parameter 1 to be string, array given in…
で、[] を削除してみると警告でません。[]を付けると警告。何のこっちゃ。
他のサイトでテストしてみた
他のサイトでテストしてみたんです。すると警告なしに普通に動きます。そうか、これは警告の出るサイト固有の問題だなと判断できます。
お門違いの対処
まずテーマを疑います。子テーマを作っていますから、この子テーマで何かヘマをやらかしたに違いない。新しい子テーマをひとつ作って何もカスタムせず<form>だけを記入してテストします。果たして試してみると
Warning: urlencode() expects parameter 1 to be string, array given in…
そうか。では親のtwentyseventeenで何かトラブルが発生したか。と、twentyseventeenをダウンロード仕立ての新品と丸ごと交換しました。早速試しますと
Warning: urlencode() expects parameter 1 to be string, array given in…
PHPの警告やエラーを表示させない関数があるんですか。あるみたいなのでそれを試してみると、この警告はコア警告という種類であるとわかりました。コアの警告ですからwordpress本体に原因があるに違いない。ということで、wordpressの再インストールを行いました。これでスッキリしたはず。テストしてみると
Warning: urlencode() expects parameter 1 to be string, array given in…
おっとそうだ。PHPのバージョンの関係に違いない。と、確認してみるものの、警告が出ないサイトも出るサイトも同じ7.4.xでした。これではないか。
とするとデータベースのどこかのデータがとち狂っておかしなことになってるのか。と、テーブルの修復やオプションテーブルの確認なんぞを行います。特に問題を発見できません。
なぜ
しばし訳が分からず呆然と佇みます。助けて知恵袋。と、冗談ではなく本当にソレ系で検索してみても「この警告を直訳すると」みたいな馬鹿なのしかヒットしません。
日本語を除外しても、同じような警告の報告も質問も見当たりません。普通何かしらヒットするでしょうに。全然出ないってどういうこと?私、あほなんですか?はい、その通りでした。
タクソノミーの設定
他のサイトでは警告が出ないことが確認済みなので文法の間違いはないということです。それで安心しきっていた私があほでした。
テストでは当然、テストサイトに合わせたnameに変更します。警告は name=”genre[]” で出ていました。genre はサイト固有のカスタムタクソノミーです。
他のサイトでテストするときはgenreなんていうのはありませんから他のタクソノミーに置き換えます。
よくよく考えれば判ること。文法、コードの書き方に問題があるのだと思い込んでいたけれども、問題は genre にあったわけです。
カスタムタクソノミーを作るとき、いろんな設定しますよね。プラグイン CustomPostType UI を使う人も多いでしょう。私も使います。設定の中に曲者おりました。
階層リライト
階層リライト、これ普通はfalseにしています。デフォルトでもfalseですが、何かのおりにこれをtrueにすることがあります。それはそれで何かいろいろ理由や事情があったように記憶していますが、とにかく階層リライトですね、これが true になっていたのを false にしたのです。なぜなら、他のテストサイトで警告が出ないタクソノミーの設定でそうなっていて、警告が出るサイトでは true であったからです。これが唯一の違いだったのです。
さっそくチェックボックスの動作テストをしてみると、PHP警告が出ることはありませんでした。答えはっけーん。
<form>のcheckboxを使う時、name に指定するタクソノミーの階層リライトがfalseでないとPHP警告が出ます
と、でっかくまとめておいて今日はこのへんで。ごくろうさまでした。