PHP Fatal error: Uncaught Error: Call to undefined function json_encode() エラーでWordPressサイトが動かなった原因と対処法

オールインワンソリューションズ(株)のホスティングサービス “J-web” を利用しているお客さんのWordPressサイトの公開対応時に “Fatal error: Uncaught Error: Call to undefined function json_encode()” という何故か “json_encode()” 関数がないエラーが出てしまいました。

原因がわかって後は何てことがないことでしたがドはまりしてしまったので、同じことを繰り返さないよう内容を残しておきます。

前提

J-webサーバー内のテスト用ディレクトリでは正常にWordPressが動いており公開時にパスを変更した場合にエラーが発生しました。

エラーメッセージ

Fatal error: Uncaught Error: Call to undefined function json_encode() in /var/www/home/example.com/html/wp/wp-includes/functions.php:3923 Stack trace: #0 /var/www/home/example.com/html/wp/wp-includes/widgets/class-wp-widget-text.php(58): wp_json_encode() #1 /var/www/home/example.com/html/wp/wp-includes/class-wp-widget.php(261): WP_Widget_Text->_register_one() #2 /var/www/home/example.com/html/wp/wp-includes/class-wp-widget-factory.php(102): WP_Widget->_register() #3 /var/www/home/example.com/html/wp/wp-includes/class-wp-hook.php(287): WP_Widget_Factory->_register_widgets() #4 /var/www/home/example.com/html/wp/wp-includes/class-wp-hook.php(311): WP_Hook->apply_filters() #5 /var/www/home/example.com/html/wp/wp-includes/plugin.php(478): WP_Hook->do_action() #6 /var/www/home/example.com/html/wp/wp-includes/widgets.php(1773): do_action() #7 /var/www/home/example.com/html/wp/wp-includes/class-wp-hook.php(287): wp_widgets_init() #8 /var/www/home/example.com/html/gs in /var/www/home/example.com/html/wp/wp-includes/functions.php on line 3923

phpinfo()でPHPの設定状況など確認

本番公開用ディレクトリの内容

テスト用ディレクトリの内容

本番とテストの違い

エラーメッセージに json_encode()関数がないエラーが出ていましたので、json関連の内容を比較してみると本番用のディレクトリではJSONモジュールが有効になっていないようでした。

php.ini 確認

本番とテスト用ディレクトリを比較したときに以下の内容が記載された php.ini ファイルがテストディレクトリのみに配置されていましたので、こちらのファイルを本番用ディレクトリにコピーしました。

またパーミッションはテストディレクトリのものと同様に “0740” に変更し実行権限を与えます。

upload_tmp_dir=/home/example.com/phpsession
session.save_path=/home/example.com/phpsession
mbstring.script_encoding=UTF-8
mbstring.internal_encoding=UTF-8
mbstring.language=Japanese
date.timezone=Asia/Tokyo
extension=json.so
extension=mysqlnd.so
extension=mysqli.so
extension=dom.so
extension=gd.so
extension=bcmath.so
extension=curl.so
post_max_size=20M
upload_max_filesize=20M
memory_limit=-1
max_execution_time=60

phpinfo()を再確認

php.ini の追加後、再度 phpinfo() を確認してみたところ正常にJSONモジュールが有効になっていました。

原因

JSONモジュールが有効になっておらず json_encode()関数、json_decode()関数が使えない状態だったため冒頭のエラーが出ていました。

対処法

JSONモジュールを有効にするため php.ini ファイルを追加してJSONモジュールを有効かします。

※よくない対処法

JSONモジュールを有効にしない場合、以下3つのファイルで呼び出している json_encode() , json_decode() 関数をコメントアウトすることでエラーを出さずに動くようにすることは出来ますが、根本的な解決ではないためコアファイルの編集はしないようにしましょう!

\wp\wp-includes\class-wp-block-parser.php
\wp\wp-includes\blocks.php
\wp\wp-includes\class-wp-block-parser.php

まとめ等

テスト用のディレクトリは “J-web” のアプリインストール機能を利用してWordPressをインストールしたため自動的に php.ini ファイルが生成されていましたが、本番用ディレクトリには存在しなかっため今回のエラーが発生しました。

他社レンタルサーバーでは、モジュールの有効/無効のコントロールは出来ないところが殆どだと思いますので、最初は疑いもしませんでしたが、”J-web” はコントロールが出来るサーバーでしたので、WordPress等を用意されたインストール機能を利用せず手動でインストールする場合は、注意が必要ですね。

原因や仕様を知った後は何てことはないのですが、全く想定出来ていないことでしたのでドはまりしてしまいました。

“J-web” をご利用されているかた今後対応するエンジニアの方はご注意願います。

コメント

  1. zunky より:

    初めまして。
    J-webサーバーを使用しているものです。

    まさしくこの問題にぶち当たって、
    困りに困り果てていたところで、ようやくこの記事を見つけ、
    ご指摘のphp.iniをアップロードしたら、解決しました。

    本当に本当にありがとうございました。

    • 深尾 拓生 / FUKAO Takuo より:

      コメントいただき有難うございます!
      お役に立てたようで良かったです(^^)

  2. uuu より:

    こちらの記事の通りに作業したら、無事にできました! 助かった~感謝感謝

    • 深尾 拓生 / FUKAO Takuo より:

      コメントいただき有難うございます!お役に立てたようで幸いです♪

タイトルとURLをコピーしました