WordPress Tips

urlencode() expects parameter 1 to be string ...PHP警告の原因

2022-04-06

本記事にはプロモーションが含まれています。

urlencode() expects parameter 1 to be string ...PHP警告の原因

PHP Warningが出た時の例と対処法についてまとめています。

WordPressの自作ショートコードでPHP Warningが出た例

ショートコードでカテゴリを選んで新着投稿記事を出力しようとしていたところ思うような出力にならず、ログを確認したところ下記のPHPwarningが出ていました。

PHP Warning:  urlencode() expects parameter 1 to be string, array given in /wp-includes/formatting.php on line 5501

この警告メッセージは、urlencode()関数が、文字列以外の配列を第一引数として受け取ったことを示しています。文字列であるべきところに配列がある場合に出る警告ということです。

urlencode()関数は文字列をURLエンコードするための関数であり、文字列以外のデータ型を受け取ることができません。

間違えたコード

3行目のカテゴリスラッグを複数指定する際、array()で囲っていました。

$args = array(
	'post_type'   => 'post',
	'category_name'=> array( 'info', 'item' ),
	'post_status' => 'publish',
	'posts_per_page' => 10,
	'orderby'     => 'desc'
);

正しいコード

$args = array(
	'post_type'   => 'post',
	'category_name'=> 'info,item',
	'post_status' => 'publish',
	'posts_per_page' => 10,
	'orderby'     => 'desc'
);

「urlencode() expects parameter 1 to be string, array given in...」という警告が発生する例

上の例ではWordPressで警告が発生しましたが、そのほか警告になる例を挙げてみます。

既に説明していますが、この警告メッセージは、通常URLエンコードを行うためにurlencode()関数が呼び出された際に、その関数に渡された引数が文字列ではなく配列だった場合に発生します。

例1)フォームの送信時に、複数の同名の入力フィールドがある場合

例えば、HTMLのフォームで、name属性が同じ複数の入力フィールドがある場合、その入力値は配列として送信されます。そのため、PHPでURLエンコードを行う際に、この配列が誤ってurlencode()関数に渡されることがあります。

同じ名前の入力フィールドが2つあるフォーム

<form action="process_form.php" method="post">
  <label>名前:
    <input type="text" name="name[]">
  </label>
  <label>名前:
    <input type="text" name="name[]">
  </label>
  <input type="submit" value="送信">
</form>

name[]という配列をURLエンコードを行うコードを以下のように書いた場合、

$name = $_POST['name'];
$name_encoded = urlencode($name);

変数$nameには、送信された名前の配列が格納されますが、この配列がurlencode()関数に直接渡されるため、PHP Warningが発生します。

正しいコード

$name = $_POST['name'];
foreach ($name as $value) {
  $name_encoded[] = urlencode($value);
}

foreach文を使用して配列の各要素を個別に処理し、urlencode()関数に渡すようにします。

例2)配列をURLクエリパラメータとして渡した場合

PHPで、配列をURLのクエリパラメータとして渡すことができます。ただし、その際には配列を文字列に変換する必要があります。文字列に変換せずに、そのままurlencode()関数に渡してしまった場合に、この警告が発生することがあります。

//配列
$data = array(
  'name' => 'Taro Ymada',
  'email' => 'taro.yamada@example.com',
  'hobbies' => array('reading', 'swimming', 'traveling')
);

//文字列に変換
$query_string = http_build_query($data);
$url = 'https://example.com/page.php?' . urlencode($query_string);

上記の場合、urlencode()関数に渡されるのは、文字列ではなく配列のため警告メッセージが発生します。

Warning: urlencode() expects parameter 1 to be string, array given in /path/to/file.php on line X

この警告メッセージを回避するためには、http_build_query()関数で文字列に変換し、urlencode()関数でURLエンコードを行った後、str_replace()関数を使用して、文字列中の%5Bと%5Dをそれぞれ[と]に置換します。

正しいコード

$query_string = http_build_query($data);
$url = 'https://example.com/page.php?' . urlencode($query_string);
$url = str_replace('%5B', '[', $url);
$url = str_replace('%5D', ']', $url);

警告を回避する方法

以上のようにPHP Warning: urlencode() expects parameter 1 to be string, array given in /wp-includes/formatting.php という警告メッセージは、urlencode()関数に配列が渡された場合に発生する警告です。

警告を回避するには配列を文字列に変換する必要があります。

対処法

  • 配列を文字列に変換する
    配列を文字列に変換するには、implode()関数を使用します。
  • 関数の引数に配列が渡されないようにする
    事前に引数の型をチェックして配列以外の場合にエラーを返すようにします

今月キャンペーン特典があるサービス

  • エックスサーバー
    利用料最大50%キャッシュバッグ月額495円&ドメイン永久無料 - 2024年4月3日(水)12:00まで
  • ConoHa WING
    WINGパック36ヶ月で月額678円 53%OFF ドメイン2個無料 - 2024年3月13日(木)16:00まで
  • カラフルボックス
    ドメイン永久無料特典とBOX2以上の月額費用が50%OFFのクーポンコード「SERVER50

-WordPress Tips
-