投稿IDやカテゴリIDから、投稿やカテゴリの情報を取得することは多いと思うのですが、今回はそのためのIDをスラッグから取得する方法について。
というのも先日、カテゴリスラッグからIDを取得する必要があり、調べてみると「スラッグからIDを取得する方法」は、投稿・固定ページ・カテゴリ・タグ・カスタムタクソノミーでそれぞれ方法が異っていて、なかなかややこしかったのです。
投稿・固定ページ
投稿・固定ページの情報をスラッグ名から取得するには、 get_page_by_path()
という関数が便利です。
get_page_by_path()を使う
使用形式
$page_data = get_page_by_path($page_path, $output, $post_type);
引数は3つ。それぞれの説明は以下。
引数 | 説明 |
---|---|
$page_path | スラッグ名(ページを示すパス)。子ページの場合「/」で親ページからのパスを指定する。 先頭・末尾の「/」はあってもなくても構わない。/ 初期値 : なし |
$output | 戻り値の種類を指定。 初期値 : OBJECT
|
$post_type | 投稿タイプを指定。 初期値 : 'page'(固定ページ) |
通常の投稿の場合は第3引数に'post'
を、 カスタム投稿タイプの場合はその投稿タイプ名を指定します。
この関数によって投稿オブジェクトが取得できるので、そこからIDを取得する。という流れです。
例:ページスラッグからIDを取得
//固定ページ
$page_data = get_page_by_path('parent_slug/child_slug');
$page_id = $page_data->ID;
//投稿
$post_data = get_page_by_path('slug_name', OBJECT, 'post');
$post_id = $post_data->ID;
*上記の 'parent_slug/child_slug' の部分は '/parent_slug/child_slug/' でも可。
get_posts()にスラッグを指定しても可
get_posts()という強力な関数があるので、こちらでも可能。
//固定ページ
$page_data = get_posts('name=sulg_name&post_type=page');
$page_id = $post_data[0]->ID;
//投稿
$post_data = get_posts('name=sulg_name');
$post_id = $post_data[0]->ID;
カテゴリ
次はカテゴリIDをスラッグ名から取得する方法です。二種類の関数があります。
get_cat_ID()を使う
get_cat_ID()
という関数がすごく簡単です。
使用形式
$cat_id = get_cat_ID( $cat_name );
引数は1つだけ。スラッグ名を指定します。
指定したカテゴリが見つかればそのIDを、カテゴリが見つからない場合は0を返します。
また、 投稿がないカテゴリの場合も0が返ってきます 。
*ちなみに、タグ・カスタムタクソノミーには使用できませんでした。(0が返ってくる)
get_category_by_slug()
もう一つ、get_category_by_slug()という関数も使えます。
使用形式
$cat_obj = get_category_by_slug( $slug );
引数にはカテゴリスラッグ名を指定します。
WP_Termオブジェクトを取得できるので、そこからIDを取得することができます。
カテゴリがなければ、 false を返します。
また、こちらの関数の場合、 投稿数がなくても問題なくオブジェクトが取得できます。
例 :カテゴリスラッグからIDを取得
$cat_obj = get_category_by_slug( 'cat_slug ');
$cat_id = $cat_obj->term_id; //$cat_obj->cat_IDでも同じ
タグ・カスタムタクソノミー
タグやカスタムタクソノミーの場合、カテゴリのような関数は用意されていないので get_tags()・ get_terms()を使用するか、 get_term_by()を使用します。
get_tags()またはget_terms()を使う
これら関数の詳細については以下の記事でまとめていますので、そちらを参照してください。
例だけのせておきます。
//スラッグを指定するための配列
$args = array('slug' => 'slug_name');
//タグの場合
$tag_data = get_tags($args);
$tag_id = $tag_data[0]->term_id;
//カスタムタクソノミーの場合
$term_data = get_terms($args,'taxonomy_slug');
$term_id = $term_data[0]->term_id;
これらと同様の方法で、get_categories()を使用してカテゴリIDを取得することもできます。
get_term_by()
get_term_by()という関数を使用すれば、スラッグ名からカテゴリ・タグ・ターム情報を取得できるので、これを利用する方法もあります。
使用例
$term_data = get_term_by( $field, $value, $taxonomy, $output, $filter );
引数は5種類。
引数 | 説明 |
---|---|
$field | 何から情報を取得するか。'id', 'slug', 'name', または 'term_taxonomy_id'。 初期値 : 'id' |
$value | $fieldに応じてIDやスラッグ名を指定。 |
$taxonomy | タクソノミー名を指定。'category'でカテゴリ。'post_tag'でタグ。 |
$output | 返り値を何で取得するかを指定。指定できるのは OBJECT,ARRAY_A, ARRAY_N 初期値 : OBJECT |
$filter | フィルタを指定。 初期値 : 'raw' (フィルタなし) |
今回の用途である、スラッグ名からIDを取得したい場合は以下の様に使用します。
//タグ
$tag_data = get_term_by('slug', 'slug_name', 'post_tag');
$tag_id = $tag_data->term_id;
//カスタムタクソノミー
$term_data = get_term_by('slug', 'slug_name', 'taxonomy_name');
$term_id = $term_data->term_id;
もちろん、カテゴリもこの関数を使用できます。