この記事ではWordPressで発生する「Call to undefined function get_header()」というエラーの原因と解決方法をまとめています。
概要
WordPressサイトのエラーログで以下のようなエラーが発生しました。
[28-Jul-2021 05:50:11 UTC] PHP Fatal error: Uncaught Error: Call to undefined function get_header() in /wordpress/wp-content/themes/XXXXXXXX/index.php:1 Stack trace: #0 {main} thrown in /wordpress/wp-content/themes/XXXXXXXX/index.php on line 1
メッセージは表示されますが、サイトは問題なく動作しています。
エラーメッセージから、テーマに問題があると思われます。しかし特に編集した記憶もなく、テーマを再度アップロードしても直りません。
この問題を調査し、原因を特定しました。
原因
エラーメッセージを読むと「Call to undefined function get_header()」とあります。つまりget_header()という関数が定義されていないのがエラーの原因です。
エラーが発生しているindex.phpを確認すると、エラーの行に以下のような記述があります。
<?php get_header(); ?>
このファイルを見ても、get_header()の定義は存在しません。なので「Call to undefined function get_header()」というエラーが出るのも当然です。
今回のエラーの原因となっているWordPressテーマのindex.phpはWordPress本体から呼び出されることを前提としたファイルなのです。そのためget_header()の定義はこのファイルにはなく、WordPress本体側で定義されています。
対策
テーマファイルの直接アクセスは想定されていない動作のようです。対策としては、テーマファイルを編集するか、アクセス制限を掛けるなどの方法が考えられます。テーマファイルの編集は、アップデート時に修正が必要になりメンテナンス性が良くありません。なので、今回は.htaccessによるアクセス制限を紹介します。
以下の.htaccessを/wp-content/themesに配置します。以下は「example.com」からのアクセスのみ許可する例です。
SetEnvIf Referer "example\.com" ref_allow Order Deny,Allow Deny from all Allow from env=ref_allow