思わぬエラーを防ぐためのinstanceof WP_Post の使い方まとめ

※本ブログの目的は個人の備忘録であり、コードは参考用として掲載しています。
実際に使用される際は、ご自身の環境で十分に動作確認を行ってください。
コードの利用によって生じたいかなる問題についても責任を負いかねますので、あらかじめご了承ください。

PHP にはオブジェクトの型を判定できる演算子として instanceof があります。

WordPress の開発では特に 投稿を扱う WP_Post クラス に対して使うと思わぬエラーを未然に防ぐことができ、便利です。

この記事では instanceof WP_Post の基本と、実用的な使い方をいくつか紹介します。

instanceof とは

instanceof は、ある変数が特定のクラス(またはその子クラス)のインスタンスかどうかを判定するための演算子です。

if ( $post instanceof WP_Post ) {
    // $post は WP_Post オブジェクト
}

これにより、対象が期待通りのオブジェクトかどうかを安全に判定できます。

WP_Post オブジェクトとは

WordPress で記事やカスタム投稿を取得すると、投稿データは WP_Post クラスのオブジェクトとして返されます。

このオブジェクトには、IDpost_titlepost_content などのプロパティが含まれ、投稿データを操作・参照するための基本単位です。

$post = get_post(42);
echo $post->post_title; // 投稿タイトルを取得

ただし get_post() は存在しない ID を指定した場合、null を返すことがあります。ここで instanceof を使うと安全です。

このように「投稿に関するすべての情報を持ったオブジェクト」として利用できるのが WP_Post です。

WP_Post と配列の違い

  • 配列(例: get_post(42, ARRAY_A)): キーでアクセスする。$post['post_title'] のように記述。
  • WP_Post オブジェクト(デフォルト): プロパティでアクセスする。$post->post_title のように記述。
// 配列の場合
$post_array = get_post(42, ARRAY_A);
echo $post_array['post_title'];

// オブジェクトの場合(通常)
$post_object = get_post(42);
echo $post_object->post_title;

開発の場面では、ほとんどが WP_Post オブジェクトとして扱われます。そのため instanceof WP_Post での判定が有効です。

実用例

1. get_post() の戻り値を安全に扱う

$post = get_post(123);

if ( $post instanceof WP_Post ) {
    echo $post->post_title;
} else {
    echo '記事が見つかりませんでした。';
}

get_post()null を返した場合でも、エラーを回避できます。

2.ACFの投稿オブジェクトフィールドの返り値判定

ACF の「投稿オブジェクト」フィールドは設定によって 投稿ID または WP_Post オブジェクト を返します。そのため安全に処理するには instanceof を使うのが便利です。

$fixed_post = get_field('fixed_post');

if ($fixed_post instanceof WP_Post) {
    // オブジェクトとして返ってきた → IDに変換
    $fixed_post_id = $fixed_post->ID;
} elseif (is_numeric($fixed_post)) {
    // 投稿IDとして返ってきた
    $fixed_post_id = $fixed_post;
} else {
    $fixed_post_id = null;
}

こうしておけば、返り値の設定が変わっても安全に対応できます。

3.カスタム関数の引数チェック

自作関数に投稿オブジェクトを渡す場合、引数が WP_Post かどうかを検証しておくと安心です。

function print_post_title( $post ) {
    if ( ! ( $post instanceof WP_Post ) ) {
        return;
    }

    echo esc_html( $post->post_title );
}

これにより、配列や文字列が誤って渡された場合でもエラーを防げます。

4.ループ外での投稿変数チェック

テーマ開発中に $post 変数を直接使う場面がありますが、常に WP_Post オブジェクトが入っているとは限りません。instanceof を使えば安全にチェックできます。

global $post;

if ($post instanceof WP_Post) {
    echo '<h2>' . esc_html($post->post_title) . '</h2>';
}

なぜ instanceof が便利なのか

WordPress の関数は、必ずしも WP_Post オブジェクトを返すとは限りません。

例えば、

  • get_post() で存在しない ID なら null
  • apply_filters() で不正な値が返る可能性

こうしたケースで instanceof WP_Post を使うことで、未定義のプロパティ参照によるエラーを防いだり、期待しないデータ型が渡ってきても安全にスキップできます。

また、バグの早期発見にも役立ちます。

まとめ

  • instanceof はオブジェクトの型を安全に判定できる演算子
  • WordPress では WP_Post チェックによく使える
  • 思わぬエラーを防ぎ、コードの堅牢性を高められる

WordPress 開発で投稿データを扱う際は、積極的に instanceof WP_Post を活用してみてください。

参考