LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

WordPress WP_Query not foundで使えないのを直す

wordpress image
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

クラスの中で、WP_QueryなどWordPressで用意されているクラスが見つからないエラー(Class ... not found)が出ることがあります。

修正はかんたんです。そしてエラーが起きる原因は、オブジェクト指向からみればあたりまえです。

PHPのクラスでWordPressのクラスを使う

まず、クラスの中でWP_Queryをつかうときこんな感じです。

my-class.php
<?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 );
    }
}
main.php
<?php

use MY\Sample as Sample;
$posts = ( new Sample() )->get_posts();
foreach ( $posts as $post ) {
   // 何か処理する
}

これを実行するとエラーが出ちゃうんですね。

Fatal error: Class 'MY\WP_Query' not found...

パソコンをする人。困った編
なんで?
パソコンをする人。困った編
WordPressで用意されてるクラスでしょ?
パソコンをする人。困った編
見つからないはありえない!

最初はこう思うかもしれません。でもよくみてください。エラーには

'MY\WP_Query'

って出てます。これは

namespace MYに属するWP_Query

と認識してるんですね?

もういっかいクラスを見てみましょう。

my-class.php
<?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いがいのクラスでも同じです。

前のページ
WordPress WP_Query 全件を取得する

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください