クラスの中で、WP_QueryなどWordPressで用意されているクラスが見つからないエラー(Class ... not found)が出ることがあります。
修正はかんたんです。そしてエラーが起きる原因は、オブジェクト指向から見ればあたりまえ。
PHPのクラスでWordPressのクラスを使う
まず、クラスの中でWP_Queryを使うときこんな感じです。
<?php
namespace MY;
class Sample {
public function get_posts() {
$args = [
'post_status' => 'publish',
'post_type' => 'post',
'posts_per_page' => -1,
];
return new WP_Query( $args );
}
}
<?php
use MY\Sample as Sample;
$posts = ( new Sample() )->get_posts();
foreach ( $posts as $post ) {
// 何か処理する
}
これを実行するとエラーが出ちゃいます。
Fatal error: Class 'MY\WP_Query' not found...
最初はこう思うかもしれません。でもよく見てください。エラーには、
'MY\WP_Query'
って出てます。これは、
namespace MYに属するWP_Query
と認識してるんですね?
もう一回クラスを見てみましょう。
<?php
namespace MY;
class Sample {
public function get_posts() {
$args = [
'post_status' => 'publish',
'post_type' => 'post',
'posts_per_page' => -1,
];
return new WP_Query( $args );
}
}
いました。『namespace MY』が。
オブジェクト指向プログラミングになれてる人はもう分ったでしょう。my-class.phpの中で使われるクラスは、
デフォルトでMYに属している
と認識します。
でも、WP_QueryはWordPressが用意したグローバルな、どこでも使えるクラスなので、MYに属されても困りますね?
どのネームスペースに属しているクラスを使うのか、明示するのが、
use演算子
エラーの原因は、my-class.phpでuseをつかってWP_Queryを指定していないから、デフォルトでMYに属してしまったんですね?
MYに属しているWP_Queryクラスを作っていたらエラーになりません。
でも、クラスがちがうので処理としてはバグです。
自作クラスでのWordPressクラスの使い方
修正はかんたんです。
new \WP_Query( $args );
どのネームスペースにも属してませんよ。というマーク『\』をつけます。
半角英数の『ろ』キーです。
以上です。
my-class.phpでuseを使うなら、
use \WP_Query as WP_Query;
これで明示すれば、
new WP_Query()
と書いてOK。
クラスを書いたphpファイルにnamespaceを使ってないときはエラーになりません。
でも、namespaceを書かないことはオブジェクト指向として不十分なので、これはこれで問題です。
(WordPressはそこらへんがユルいので許されてますが。)
WP_Query以外のクラスでも同じです。