WordPressで、スラッグ(slug)から固定ページを取得する

最終更新:2017-06-23 by Joe

WordPressのページを、スラッグ(slug)を使って文字列を取得する方法です。

念のため、スラッグとはURLのパスの事です。たとえば「https://my-blog.com/the-page-slug」というURLであれば、「the-page-slug」という文字列部分が、いわゆるスラッグです。

スラッグからページを取得する関数

関数にしました。やっている事は極めてシンプルです。説明のシンプルのため、エラーセーフ行はほとんど省いています

/**
 * Get a page object by slug.
 * https://codex.wordpress.org/Template_Tags/get_posts
 */
function wc_get_page_by_slug( $slug = '' ) {
  $pages = get_posts(
      array(
        'post_type'      => 'page',
        'name'           => $slug,
        'posts_per_page' => 1
      )
  );
  return $pages ? $pages[0] : false;
}

get_posts()関数は、投稿オブジェクトの配列を返してくるので、必要な最初の要素だけを参照してやります。扱いやすいように、見つからなければfalseです。

投稿をクエリして取得する時の注意

よくある間違い(?)が、query_posts()を使ってしまう例です。query_postsはメインクエリを操作する関数ですので、今回のようなカスタムクエリに使う代物ではありません。

正しいワードプレスの知識に基づけば、あなたが、query_postsを使う事は(ほぼ)絶対にないはずです。

スラッグってなんなのさ

このスラッグは、ワードプレスのpostテーブル(投稿を格納するテーブルです。)にカラムとして格納されています。1投稿(ページ)あたり1スラッグ、格納する場所が最初から用意されているってことですね。

postテーブルのカラム、貼っておきます。「post_name」ってのがそれですね。スラッグで投稿をクエリする、というのは、post_nameでマッチするやつをクエリする、というそれだけの処理です。

mysql> show columns from wp_posts;
+-----------------------+---------------------+------+-----+---------------------+----------------+
| Field                 | Type                | Null | Key | Default             | Extra          |
+-----------------------+---------------------+------+-----+---------------------+----------------+
| ID                    | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| post_author           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| post_date             | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_date_gmt         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content          | longtext            | NO   |     | NULL                |                |
| post_title            | text                | NO   |     | NULL                |                |
| post_excerpt          | text                | NO   |     | NULL                |                |
| post_status           | varchar(20)         | NO   |     | publish             |                |
| comment_status        | varchar(20)         | NO   |     | open                |                |
| ping_status           | varchar(20)         | NO   |     | open                |                |
| post_password         | varchar(20)         | NO   |     |                     |                |
| post_name             | varchar(200)        | NO   | MUL |                     |                |
| to_ping               | text                | NO   |     | NULL                |                |
| pinged                | text                | NO   |     | NULL                |                |
| post_modified         | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_modified_gmt     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
| post_content_filtered | longtext            | NO   |     | NULL                |                |
| post_parent           | bigint(20) unsigned | NO   | MUL | 0                   |                |
| guid                  | varchar(255)        | NO   |     |                     |                |
| menu_order            | int(11)             | NO   |     | 0                   |                |
| post_type             | varchar(20)         | NO   | MUL | post                |                |
| post_mime_type        | varchar(100)        | NO   |     |                     |                |
| comment_count         | bigint(20)          | NO   |     | 0                   |                |
+-----------------------+---------------------+------+-----+---------------------+----------------+

 

スラッグとページ取得に関する参考リンク