WordPress構築の現場で、記事ごとの「スラッグ(URLの末尾)」をCSSのクラス名やアンカーリンクに使いたい場面、ありますよね。
「IDじゃなくて、英数字の文字列で管理したいんだよなあ……」という、あのムズムズする瞬間です。
この記事では、投稿や固定ページのスラッグをサクッと取得し、HTML内に出力する方法を解説します。
ループ内でのスラッグ取得・表示は get_post_field で完結する
結論から言います。single.php や archive.php などのテンプレートファイル(ループ内)であれば、以下のコードをコピペするだけでOKです。
取得・表示用のコード
|
1 |
<?php echo get_post_field( 'post_name', get_the_ID() ); ?> |
これだけ。シンプルすぎて「え、これだけ?」と拍子抜けしたかもしれませんね。
実際にループ処理の中に組み込むと、以下のような記述になります。
|
1 2 3 4 5 6 7 8 9 10 |
<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <div id="section-<?php echo get_post_field( 'post_name', get_the_ID() ); ?>" class="entry-content"> <h2><?php the_title(); ?></h2> <?php the_content(); ?> </div> <?php endwhile; ?> <?php endif; ?> |
正直なところ、グローバル変数の $post->post_name を直接参照しても同じ結果は出ます。
ただ、関数経由(get_post_field)の方がキャッシュを利用してくれる分、行儀が良いコードと言えるでしょう。「急がば回れ」ってやつですね。
なぜ the_slug() みたいな関数はないのか?
WordPressには the_title() や the_content() があるのに、なぜか「the_slug()」という関数は標準で存在しません。そのため、今回紹介した
get_post_field() を使うか、$post オブジェクトから直接引っ張ってくる必要があります。この仕様のおかげで、初心者のうちは「スラッグ 取得 方法」で検索の海をさまようことになるんですよね……。
補足:取得できる「post_name」とは?
ここで指定している post_name というパラメータ。これがデータベース上のカラム名で、いわゆる「スラッグ」を指します。日本語URLを使用している場合は、エンコードされた文字列(%e3%81…みたいなやつ)ではなく、デコードされた状態、あるいは設定した英数字が返ってきます。
- メリット: ページ固有のID(#service, #about 等)を動的に生成できる。
- 注意点: スラッグを変更するとリンク切れやCSS崩れの原因になる。


コメント