質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

314閲覧

wordpress カスタム投稿タイプにおいてスラッグ表記を一種類はID名にもう一種類をページ名にしたい。

holic

総合スコア134

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

1クリップ

投稿2017/08/28 02:38

編集2017/08/28 09:09

###前提・実現したいこと
カスタム投稿タイプにおいてスラッグ表記を一種類はID名にもう一種類をページ名にしたいです。
まずカスタム投稿タイプの設定をfunctions.phpに記述しました。
作りたいカスタム投稿名
①ニュース /news/
②実績 /coordination/

php

1//ニュース 2add_action('init', 'add_news_post_type'); 3function add_news_post_type() { 4 $params = array( 5 'labels' => array( 6 'name' => 'ニュース', 7 'singular_name' => 'ニュース記事', 8 'add_new' => '新規追加', 9 'add_new_item' => 'ニュース記事を新規追加', 10 'edit_item' => 'ニュース記事を編集する', 11 'new_item' => 'ニュース記事', 12 'all_items' => 'ニュース記事一覧', 13 'view_item' => 'ページを確認', 14 'search_items' => '検索する', 15 'not_found' => 'ニュース記事が見つかりませんでした。', 16 'not_found_in_trash' => 'ゴミ箱内にニュース記事が見つかりませんでした。' 17 ), 18 'public' => true, 19 'has_archive' => true, 20 'menu_position' => 5, 21 'supports' => array( 22 'title', 23 'editor', 24 'thumbnail', 25 //'author', 26 //'custom-fields', 27 //'revisions', 28 ), 29 'taxonomies' => array('news_cat') 30 ); 31 register_post_type('news', $params); 32 /* カスタムタクソノミーを定義 */ 33 register_taxonomy( 34 'news_cat', 35 'news', 36 array( 37 'label' => 'カテゴリー', 38 'hierarchical' => true,//カテゴリタイプ 39 'rewrite' => array('slug' => 'news/cat') 40 ) 41 ); 42} 43//コーディネーション実績 44add_action('init', 'add_coordination_post_type'); 45function add_coordination_post_type() { 46 $params = array( 47 'labels' => array( 48 'name' => 'これまでのコーディネイト実績', 49 'singular_name' => 'コーディネーション実績記事', 50 'add_new' => '新規追加', 51 'add_new_item' => 'コーディネーション実績を新規追加', 52 'edit_item' => 'コーディネーション実績を編集する', 53 'new_item' => 'コーディネーション実績', 54 'all_items' => 'コーディネーション実績一覧', 55 'view_item' => 'ページを確認', 56 'search_items' => '検索する', 57 'not_found' => 'コーディネーション実績が見つかりませんでした。', 58 'not_found_in_trash' => 'ゴミ箱内にコーディネーション実績が見つかりませんでした。' 59 ), 60 'public' => true, 61 'has_archive' => true, 62 'menu_position' => 5, 63 'supports' => array( 64 'title', 65 'editor', 66 'thumbnail', 67 //'author', 68 //'custom-fields', 69 //'revisions', 70 ), 71 'taxonomies' => array('coordination_cat') 72 ); 73 register_post_type('coordination', $params); 74 /* カスタムタクソノミーを定義 */ 75 register_taxonomy( 76 'coordination_cat', 77 'coordination', 78 array( 79 'label' => 'カテゴリー', 80 'hierarchical' => true,//カテゴリタイプ 81 'rewrite' => array('slug' => 'coordination/cat') 82 ) 83 ); 84}

上記を記述後にwp管理画面の「パーマリンク設定」でカスタム構造 を「/%category%/%post_id%/」に更新しましたら、カスタム投稿ページの準備が完了しました。
ここでの記事名は
・ニュース記事
/news/任意のslug名

・実績記事
/coordination/任意のslug名

となります。これを


・ニュース記事
/news/自動で与えられるID番号
・実績記事
/coordination/任意のslug名
にしたいのです。

そのために、下記の記述をしました。

php

1//カスタムポストのパーマリンクを投稿IDにする 2function myposttype_permalink($post_link, $id = 0, $leavename) { 3 global $wp_rewrite; 4 $post = get_post($id); 5 if ( is_wp_error( $post ) ) 6 return $post; 7 $newlink = $wp_rewrite->get_extra_permastruct($post->post_type); 8 $newlink = str_replace('%'.$post->post_type.'%', $post->ID, $newlink); 9 $newlink = home_url(user_trailingslashit($newlink)); 10 return $newlink; 11 } 12 add_filter('post_type_link', 'myposttype_permalink', 1, 3); 13 function myposttype_rewrite() { 14 global $wp_rewrite; 15 $wp_rewrite->add_rewrite_tag('%news%', '([0-9]+)', 'post_type=news&p='); 16 } 17 add_action('init', 'myposttype_rewrite');

記述後にwp管理画面の「パーマリンク設定」を更新しましたら、ページ名の設定がニュースも実績もID名になってしまいました。ID名になるのはニュースだけでよいのです。どのように記述を変えればよいのでしょうか。
wordpressにお詳しい方でお分かりになる方がいらっしゃいましたらご教示をお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

追記したので試してみてください。
カスタムポストニュース記事にだけ限定しているので大丈夫だと思います

if ( get_post_type() === 'news' ) { ~ }

このような形でポストタイプを指定してあげれば良いと思います。

追記

function post_type_news_slug( $link ){ global $post; if ( get_post_type() === 'news' ){ return home_url( 'news/' . $post->ID ); } else { return $link; } } add_filter( 'post_type_link', 'post_type_news_slug' ); function post_type_news_rewrite_rule(){ add_rewrite_rule( 'news/([0-9]+)?$', 'index.php?post_type=news&p=$matches[1]', 'top' ); } add_action( 'init', 'post_type_news_rewrite_rule' );

投稿2017/08/28 06:56

編集2017/08/28 09:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

holic

2017/08/28 08:27

ご回答ありがとうございます。 私が上記で設定したものをif文でくくるということですね。 実際にやってみましたが、上手く行きませんでした。 管理画面内でget_post_type()が反応していないのが原因なのでしょうか。
退会済みユーザー

退会済みユーザー

2017/08/28 08:52

任意のIDというのは自動で割り当てられる投稿IDのことなんでしょうか?
holic

2017/08/28 09:08

すいません、書き間違えです。 正しくは自動で与えられるID番号です。
退会済みユーザー

退会済みユーザー

2017/08/28 09:20

追記したので試してみてください。 カスタムポストニュース記事にだけ限定しているので大丈夫だと思います
holic

2017/08/28 09:28

試してみました。 目的とした挙動になりました。 ay03さん回答頂きまして本当に助かります。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問