かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress ページのURLを取得したい

WordPress のカスタムテーマで web サイトを作ってたらちょいちょい発生するやつ。
最終的に get_permalink($postID) で URL を取得するのだが、特定のページの post id を取得する方法を忘れるのでメモ

1. ページのタイトルから取得する

get_page_by_title は WordPress 6.2.0 から非推奨になっている

前まではこれでOKだった

<?php
$page = get_page_by_title('PAGE TITLE');
get_permalink($page->ID);

get_page_by_title で Warning が出るようになっていた

This function has been deprecated. Use WP_Query instead.
Deprecated: 関数 get_page_by_title は、バージョン 6.2.0 から非推奨になりました ! 代わりに WP_Query を使用してください。

WP_Query を使ってタイトルからページを取得する

毎回 WP_Query を書くのは面倒なので関数化しておく

<?php
function get_my_page_by_title($title) {
  $query = new WP_Query([
    'post_type'              => 'page',
    'title'                  => $title,
    'posts_per_page'         => 1,
    'no_found_rows'          => true,
    'ignore_sticky_posts'    => true,
    'update_post_term_cache' => false,
    'update_post_meta_cache' => false,
  ]);
  wp_reset_postdata();

  $page = $query->post;
  if (empty($page)) {
    return null;
  }

  return $page;
}

作成した関数を使ってページタイトルからページオブジェクトを取得できるようになった

<?php
$page = get_my_page_by_title('PAGE TITLE');
get_permalink($page->ID);

しかし、ページのタイトルは管理画面から変更できるので運用者が変更してしまうと壊れてしまう問題がある

2. ページテンプレートからページを取得する

カスタムテーマを使うようなケースだと、動的に URL を取得したいページにはそれ用のテンプレートを作ることが殆どだと思うので、ページのテンプレートからページが取得できればタイトルが変更されても問題なく動作させることができる

get_pages を使えばテンプレートからページ ($post) が取得できる

<?php
function get_my_page_by_template($template) {
  $pageID = null;
  $pages = get_pages([
    'meta_key'   => '_wp_page_template',
    'meta_value' => $template,
    'number'     => 1, // 1件のみ取得する
  ]);
  foreach($pages as $post){
    $page = $post;
  }
  wp_reset_postdata();

  return $page;
}

$page = get_my_page_by_template('templates/page-my_page.php');

⚠ 渡すテンプレート名は .php まで含んだ文字列でないと意図したとおりに動作しないので注意が必要

テンプレートも管理画面から変更できてしまうが、タイトルよりは事故率が少ないと思う

ページの URL を取得する処理をまとめる

  1. タイトルから $page オブジェクトの取得を試みる
  2. テンプレート名から $page オブジェクトの取得を試みる
<?php
function get_my_page_url($title, $template) {
  $page = get_my_page_by_title($title);

  if (empty($page)) {
    $page = get_my_page_by_template($template);
  }

  if (empty($page)) {
    return null;
  }

  $pageURL = get_permalink($page->ID);
  return $pageURL;
}

よし!

WordPress ホント忘れたことに触る必要が出てきて毎回全部忘れてるからマジで困る
色々メモに残しておきたいことが溜まってるので、今の案件きりが付いたらまとめて書きたい


[参考]

つばな先生の誰何おもしろいです!