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 を取得する処理をまとめる
- タイトルから $page オブジェクトの取得を試みる
- テンプレート名から $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 ホント忘れたことに触る必要が出てきて毎回全部忘れてるからマジで困る
色々メモに残しておきたいことが溜まってるので、今の案件きりが付いたらまとめて書きたい
[参考]
- get_page_by_title() – Function | Developer.WordPress.org
- The get_page_by_title() function has been deprecated in WordPress 6.2 - how to fix your code / the best alternative - WP Editorial
- WP_Query – Class | Developer.WordPress.org
- wp_reset_postdata() – Function | Developer.WordPress.org
- get_pages() – Function | Developer.WordPress.org