WordPress3.5.1 の不具合?(includes/functions.php on line 658)


Warning: stripos() [function.stripos]: needle is not a string or an integer

WordPressを3.5から3.5.1 に変更したら、以下のような現象が発生するようになりました。
寄稿者で記事を投稿し、編集者(editor)または管理者(administrator)で『公開』しようとすると、警告が表示されます。

Warning: stripos() [function.stripos]: needle is not a string or an integer in /host/wordpress/wp-includes/functions.php on line 658

Warning: stripos() [function.stripos]: needle is not a string or an integer in /host/wordpress/wp-includes/functions.php on line 661

Warning: Cannot modify header information - headers already sent by (output started at /host/wordpress/wp-includes/functions.php:658) in /host/wordpress/wp-includes/pluggable.php on line 876

PHPはPHP 5.2.17を使用。WordPressは3.5.1。
検索してみたら、ここの人も困っているようで解決策まで至っていない状況でした。
こちらのもう1つのフォーラムでは、php.iniの『mbstring.func_overload = 0』オプションがどうたらこうたらと記載されていました。

mbstring.func_overloadについて

mbstring.func_overload は、php.iniにしか設定できない属性でhtaccessでは設定不可らしいです。
デバッグトレースもせずに、さっそくmbstring.func_overloadの値を変更して試してみましたが、結果、Warningメッセージは解消されませんでした。

軽くトレース、最初の警告「wp-includes/functions.php on line 658」のソースがここです。ついでに、WordPress3.4.2の同じ個所のソースも貼っておきます。

wordpress3.5.1-jaの該当箇所

function add_query_arg() {
	$ret = '';
	$args = func_get_args();
	if ( is_array( $args[0] ) ) {
		if ( count( $args ) < 2 || false === $args[1] )
			$uri = $_SERVER['REQUEST_URI'];
		else
			$uri = $args[1];
	} else {
		if ( count( $args ) < 3 || false === $args[2] )
			$uri = $_SERVER['REQUEST_URI'];
		else
			$uri = $args[2];
	}

	if ( $frag = strstr( $uri, '#' ) )
		$uri = substr( $uri, 0, -strlen( $frag ) );
	else
		$frag = '';

	if ( 0 === stripos( 'http://', $uri ) ) { // ★★★
		$protocol = 'http://';
		$uri = substr( $uri, 7 );
	} elseif ( 0 === stripos( 'https://', $uri ) ) {
		$protocol = 'https://';
		$uri = substr( $uri, 8 );
	} else {
		$protocol = '';
	}

wordpress3.4.2-jaの該当箇所

function add_query_arg() {
        $ret = '';
        if ( is_array( func_get_arg(0) ) ) {
                if ( @func_num_args() < 2 || false === @func_get_arg( 1 ) )
                        $uri = $_SERVER['REQUEST_URI'];
                else
                        $uri = @func_get_arg( 1 );
        } else {
                if ( @func_num_args() < 3 || false === @func_get_arg( 2 ) )
                        $uri = $_SERVER['REQUEST_URI'];
                else
                        $uri = @func_get_arg( 2 );
        }

        if ( $frag = strstr( $uri, '#' ) )                             // ★★★
                $uri = substr( $uri, 0, -strlen( $frag ) );
        else
                $frag = '';

        if ( preg_match( '|^https?://|i', $uri, $matches ) ) {
                $protocol = $matches[0];
                $uri = substr( $uri, strlen( $protocol ) );
        } else {
                $protocol = '';
        }

警告内容からすると★★★マークのところでstriposの第2パラメータ「$uri」がおかしいということらしいです。値が入っていなかったり、文字列ではない可能性が高いです。3.4と3.5では処理自体もちょっと違いますね。
根本的な解決は分かりませんでしたが、WordPressを3.5.1から3.4.2にバージョンダウンさせたら警告はでなくなりました。
もしかしたら3.5.1に対応していない『プラグインの問題』という可能性もありますね。

環境設定で、警告表示だけなくす方法

あまりお勧めしませんが、警告はApacheログに出させるのみにして、画面に出力しないようにするならhtaccessに以下追記すればよさそうです。

php_value display_errors Off

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です