開発ブログ

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

WordPressで投稿のスラッグを取得する方法、まとめ。

最終更新:2017-08-13 by Joe

WordPressで、特定の投稿の「スラッグ」を取得する方法です。

スラッグとは?

スラッグ(slug)とは、投稿やカテゴリーなどに対する、簡単な名前です。主にユーザフレンドリーなURLの一部として使われる事が意図されています。1つのワードプレスサイト上で、ユニーク(唯一)である必要があります。

投稿のスラッグを取得する関数

スラッグを含む、投稿に関連する任意のフィールドを取得するには、関数「get_post_field()」を使います。第一引数にフィールド名(必須)、第二引数に投稿ID(必須)を引き渡します。

ループの中でスラッグを取得

メインループの例

ループの中では、容易に該当の投稿のIDを、「get_the_ID() 」で取得できます。

ループの中で、「global $post;」を宣言すれば、フィールドに直接アクセスできますが・・・、これは後述もしますが、投稿オブジェクトを上手に取り扱うための関数群がすでにたくさん用意されているので、そちらを利用すべきでしょう。

サブループの例(WPクエリオブジェクト)

念のため、WPクエリオブジェクトを利用したサブループの例です。

サブループの例(投稿オブジェクト配列)

サブループの場合で、投稿オブジェクト配列をforeachでループさせている場合は、「setup_postdata()」が実行されていないと、get_the_IDなどのループ系の関数は使えませんのでご注意ください。

そのような場合は下記を利用できるはずです。

ループの外でスラッグを取得

もちろん、ループの外でも、投稿IDさえわかっていれば、get_post_fieldが利用できます。


開発編:スラッグの取扱いについて

ここからは少し踏み込んで見ていきます。

投稿のスラッグが格納されている場所

スラッグは、データベースの「post」というテーブルの、post_nameというカラムに保存されています。

下記がデータベースから、wp_post.post_nameをふくめた、wp_postテーブルのカラムです。こららのフィールド名と同じ文字列で、すべて上記のget_post_field() 関数を通して、その値にアクセスできるはずです。

テーブルはこちらでも参照できます。

さて、スラッグの話からすこし脱線しますが、関連情報です。

投稿オブジェクトのフィールドには、どうやってアクセスするべきなのか?

get_post_field()が投稿オブジェクトのフィールドにアクセするための関数です。もちろん、ループの中であれば

で同じことが可能です。まあ、できればglobalをしないほうが気持ちがいいでしょう。

感じ方は人によると思いますが・・・、もしそのループ内で、get_the_ID()や、 get_the_tilte()を使って、投稿オブジェクトのフィールドにアクセスしているのであれば、スラッグの時だけ、get_the_slug() なんて名前の関数がないからといって、すぐに「global $post」 というより、やはり用意されているアクセサ関数を利用したほうが、一貫性があって、気持ちがいいのではないでしょうか。

上記のように、get_posts()関数から投稿オブジェクトの配列を取得して、サブループを生成した場合は、すこし勝手が違うかもしれませんね。

get_posts()からの配列でループを作成したとき・・・

そもそも、投稿オブジェクトのフィールドに、直接アクセスするしかありません。get_the_xxx 関数群を使うには、global $post; を含む手続き(参考)を行う必要があります。

get_posts()関数自体が、サブループの作成に適している関数のように思えません。ちょっと特定の投稿のなんらかの値を参照したいときに、小規模にサクッと使う、といった温度感です。

とくに、タイトルや本文などの主要なコンテンツは、本来通っているフィルター関数(the_contentフィルターなど)をとおらないので、the_content関数から出力した本文と大きく異なることに注意が必要です。

英語のDEVリファレンスですが、実コードが見られます:

WPクエリオブジェクトを使ったサブループの例

サブループを作るときあは、わたしは極力既存関数群の恩恵に預かれるよう、こう書きます。

実際コードを見ると、get_posts()関数は、WP_Queryクラスを利用して、いくつかのデフォルト引数を加えたり、フィルターをかけているだけです。最終的に、投稿オブジェクト配列だけを返します。

wp-includes/post.php

 

以上です。

参考