2021.04.30

WP_Queryのpost_status初期値について

こんにちは、webエンジニアのゾノ( @ozonosho )です。

本日はWordPressで使用する頻度ベスト5ぐらいには入るであろう関数「WP_Query」についての小ネタです。

WP_Queryは投稿データを取得する関数で、Codexに記載のとおり↓のような感じで利用します。

$the_query = new WP_Query( $args ); // $argsの中に取得条件を入れる
if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        the_title();
    }
    wp_reset_postdata();
}

WordPressテーマ内をいじったことがある人には見慣れた処理だと思います。

この時、WP_Queryに渡す引数にはその時々で必要な条件を入れます。

(例)
$args = array(
    'posts_per_page' => 10, //10件取得
    'post_type' => 'page' //投稿タイプが「page」の記事
);

ここで、「post_status」については記述しないことが多いです。
少なくとも僕はそうでした。

post_statusには初期値として「publish(公開)」が入っているのでわざわざ明記しないで良いと思っていたからです。

しかし、会員制サイトにログインした状態でWP_Queryが発行するSQLを見てみると、なんとpost_statusの条件には「publish」だけではなく「private(非公開)」も含まれていました。

Codexをよーく読むと書いてあるのですが、ログイン状態だとpost_statusに渡される初期値が変わるようです。
非公開ステータスで投稿した内容を自分だけは見れるようにするためですね。

それ自体は親切機能なのですが、、、正直、投稿ステータス「private」を利用してユーザーが投稿するサイトというのは珍しいと思います。
つまりフロント側での表示において投稿ステータス「private」はほぼ利用しない可能性が高いです。

そして、wp_postsやwp_postmetaテーブルのレコード件数が100万件とかになってくると、「publish」だけを取得するのか「publishとprivateどちらも取得するのか」によって、SQLのレコード取得速度に差が出てきます。

当然ながらどちらも取得しようとしたほうが遅くなります。

そのため、投稿ステータス「private」を利用しない会員サイトなのであれば、WP_Queryを利用する際はpost_statusの条件を「publish」のみにするよう明示してあげたほうが良いです。

おわりに

以上、今回の記事ではWP_Queryのpost_status初期値について紹介させていただきました。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む