開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

WordPressで、投稿/ページのスラッグ(slug)を取得する方法。

最終更新:2017-05-15 by Joe

WordPressで、投稿・ページのスラッグ(slug)を取得する方法です。

投稿・ページのスラッグ(slug)を取得する関数

スラッグは、postsテーブルのnameカラムに入っています。

テーブルのすべてのカラムはget_post_field関数で取得できるようになっています。

$slug = get_post_fields( get_the_ID, 'post_name' );

postsテーブルのカラム一覧です。代表的な関数にget_the_content()などで、contentを取得できるようなものがありますが、get_post_fields()は、フィルターがかかっておらず、ほぼ素の格納値を取得します。

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 | |
+-----------------------+---------------------+------+-----+---------------------+----------------+

より直接的にフィールドにアクセスする

下記でも同じ値が取得できます。

ループ内で使うことと、$postのglobal宣言がキモです。

global $post;

$slug = $post->post_name;

ループ内では、グローバルの$post変数に、現在の投稿オブジェクトが入っています。

「ループ内」の意味がわからない人は、ググって下さい。簡単には

  • while ( have_posts() ) { }の中で
  • the_posts()の後、

ということです。メインループなら、have_posts()、カスタムループなら$custom_query_object->have_posets()の形ですね。(これ以上の説明はまた別の記事で・・)

さて、global宣言により、$postオブジェクトに直接アクセスできるようになりますが、このglobalを使う方法を好むかどうかはあなた次第です。

むやみなglobal宣言は、通常は、設計上のスコープ管理の概念を破壊しますので、通常は避けますが、Wordpressに於いては、グローバルな$postへのアクセスを許したほうがスッキリかける場合もあるので、人によっては使われる事はやや多い気がします・・。

筆者としては、極力、get_post_field()で行儀よくやる派です。

スラッグ取得の関連リンク

うまくスラッグ取得、できたでしょうか?

 

 

 

閉じる