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()で行儀よくやる派です。
スラッグ取得の関連リンク
うまくスラッグ取得、できたでしょうか?