続きはWEBで。

技術的なこともそうでないことも、自由気ままに書き留めていくためのサイト

get_page_by_pathの第3引数にはarrayを使う

固定ページの情報を取得したくて「get_page_by_path」関数をよく使用するのですが、クエリを眺めていて少し気になった点。
Codexではget_page_by_pathの第3引数の初期値は「page」になっていると説明。

$post_type
(文字列 または array) (オプション) 投稿タイプまたは投稿タイプの配列。
初期値: 'page'
・'page' - 固定ページ

でも何も考えずに固定ページの投稿オブジェクトを取得するだけだから〜と第2、第3引数を省略してしまうと・・・

// 実行コード
get_page_by_path('page_path');

// 実行クエリ
SELECT ID, post_name, post_parent, post_type
FROM wp_posts
WHERE post_name IN ('page_path')
AND post_type IN ('page','attachment')

なぜか、検索条件のpost_typeにattachment(画像)が含まれてしまう。
そこで該当部分のコアを眺めてみると、

if ( is_array( $post_type ) ) {
    $post_types = $post_type;
} else {
    $post_types = array( $post_type, 'attachment' );
}

どうやら第3引数がarrayでない限りattachmentを含めてしまう模様。
ということで改めて第2、第3引数を指定してみると・・・

// 実行コード
get_page_by_path('page_path', OBJECT, array('page'));

// 実行クエリ
SELECT ID, post_name, post_parent, post_type
FROM wp_posts
WHERE post_name IN ('page_path')
AND post_type IN ('page')

無事、固定ページだけを対象にSELECTされるようになりました。
思わぬトラブルを避けるためにぜひとも第3引数はarrayで指定することをお勧めします。