[WordPress] パスを元にページを取得するget_page_by_path()

公開

スポンサーリンク

基本的な使い方

get_page_by_path()はページ名(スラッグ)を元にページオブジェクトを取得するWordPress関数です。

ページ名が「nanashi」の固定ページを取得したい場合、以下のコードで可能になります。

$posts = get_page_by_path("nanashi");

注意したいのは、子ページの場合、ページ名だけを与えるのではなく、親ページのスラッグを含めたURL全体を指定しなければならない点です。私はこれに引っかかって大変な時間を無駄にしました…

親ページ「oya」の子ページである「ko」を探す場合はこのようになります。

$posts = get_page_by_path("oya/ko");

ページスラッグに日本語(マルチバイト文字)を使っている場合も、URLエンコードした文字列を与える必要はありません。ページスラッグが「名無し」の場合でも、以下のコードで作動します。

$posts = get_page_by_path("名無し");

第2引数・返り値の取得形式

返り値はデフォルトではオブジェクトです。第2引数で返り値の種類を指定すると連想配列やインデックス配列で取得することが可能となります。連想配列の場合、引数はARRAY_A、インデックス配列の場合、ARRAY_Nが引数となります。初期値はOBJECTです。これらの引数は定数ですので、クオートで囲む必要はありません。

$posts = get_page_by_path("nanashi", ARRAY_A);//返り値が連想配列に

第3引数・検索対象投稿タイプ

get_page_by_path()はデフォルトでは固定ページが検索対象ですが、第3引数を指定することで、通常の投稿なども探索可能になります。ポストを指定したい場合、”post”とします。

$posts = get_page_by_path("nanashi", OBJECT, "post");//投稿ページを対象に検索

代替手段

不具合かどうか分からないのですが、期待通りに動作しない場合があるようです。このエントリを残しておこうと思ったのが、get_page_by_path()を使っていて、予期しない動作で時間を浪費してしまったためです。Googleで「get_page_by_path()」を検索すると、サジェストに「get_page_by_path not working」が上位に出てきます。そこでget_page_by_path()が期待しない動きをするとの報告がいくつもあることが分かるのですが、原因はよく分かりませんでした。

そこで、WP_query()でページ情報の取得を行うことにしました。以下はスラッグ名「名無し」の固定ページをWP_queryで探す(手抜き)コードです。

$args = array(
  'name'=>'名無し',
  'posts_per_page'=>1,
  'post_type'=>'page'
);
$the_query = new WP_Query($args);
if( !$the_query->have_posts() ) {
  //略
}

get_page_by_path()がどうしてもうまく動かない場合はこちらを使うと良いかもしれません。

スポンサーリンク


Comment