WordPressで子ページのスラッグからURLを取得するには?

特定のページやナビゲーションから、固定ページやカテゴリーアーカイブなどへリンクをする際、直接URLを記述してしていますか? ライトユーザーであれば特に問題はないかもしれませんが、ガッツリ使い倒す感じですと後になって少々問題が発生するかもしれません。たとえば、やっぱりURL変えたいな…とか、ディレクトリ構造を変えたいな…とか。これを気軽にやってしまうと、直接URLを書いてリンクした箇所はリンク切れしてしまいますよね。そんな事にならないよう仕込みをしておくと、後になってだいぶ楽ができるんじゃないかなと思います。

あとで楽するための仕込み。それは、URLは直接書くんじゃなくて取得&出力する、です。IDから取得する方法はスムーズにいくことが多いと思うので割愛するとして、スラッグをもとにURLを取得する方法はいかがでしょう。

get_page_by_path の場合

やり方を探してみると、 get_page_by_path() を使った方法を目にすることが多いです。が、これって子ページのURLを取得したいなと思ったときにちょっとした罠があるんです。

親を持たないページであれば、そのページのスラッグだけあればOKなのですが

// スラッグが「foo」の固定ページ
get_page_by_path( "foo" );

親を持つページ、子ページ(サブページ)のURLを取得するとなると、親のスラッグも必要になってしまうんです。

// スラッグが「bar」の固定ページ(foo の子ページ)
get_page_by_path( "foo/bar" );

コレだと親子関係が変わったときに対応できない。そして面倒くさい。

WP_Query だったらどうか

普段からとてもお世話になっている WP_Query に頼ってみます。こうすると子ページでも、自分のスラッグだけで取得できます。

// スラッグが「baz」の固定ページ
$args = array(
    'name' => 'baz',
    'post_type' => 'page',
    'posts_per_page' => 1
);
$the_query = new WP_Query( $args );
if ($the_query -> have_posts()):
    // ココになにがしかの処理
endif;
wp_reset_postdata();

もっといい方法あるんじゃないかと思いつつ、ひとまず理想の動作を実現できました。コレを関数にして使えば便利かな。その場合は公開状態なども考慮して処理を変えると良さそうですshine.gif

トラックバックURL