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

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

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

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

Q&A

解決済

2回答

2131閲覧

【WordPress】1つのカスタム投稿タイプに2つのカスタムタクソノミーを追加しアーカイブページを作成

monchan58

総合スコア10

WordPress

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

0グッド

0クリップ

投稿2022/06/09 15:43

編集2022/06/21 02:15

1つのカスタム投稿タイプ(projects)を作成し、その中で2つのカスタムタクソノミーを作成しました。
1つはカテゴリーのように、もう1つはタグのように使用をしています。
どちらのカスタムタクソノミーにおいてもアーカイブページを作成したいと思っているのですが、リライトの方法がわからずつまづいてしまいました。

カスタム投稿タイプ
projects

カスタムタクソノミーA
projects_cat

カスタムタクソノミーB
projects_tag


目標
タームのアーカイブページの完成形のURLとして
/projects/ターム名/

記事詳細ページの完成形のURLとして
/projects/カスタムタクソノミーAのターム名/記事タイトル
を目指しています。


記事詳細ページに関しては
プラグインの
Custom Post Type Permalinks
を使用し、
/projects/%projects_cat%/%postname%/

カスタマイズされたカスタムタクソノミーのパーマリンクを使用する
にチェックを入れています。

アドバイスをもらえると幸いです。よろしくお願いいたします。

カスタム投稿タイプとカスタムタクソノミーの追加

php

1function cpt_register_projects() { //add_actionの2つのパラメーターを定義 2 $labels = [ 3 "singular_name" => "projects", 4 "edit_item" => "projects", 5 ]; 6 $args = [ 7 "label" => "設計実績", //管理画面に出てくる名前 8 "labels" => $labels, 9 "description" => "", 10 "public" => true, 11 "show_in_rest" => true, 12 "rest_base" => "", 13 "rest_controller_class" => "WP_REST_Posts_Controller", 14 "has_archive" => true, 15 "delete_with_user" => false, 16 "exclude_from_search" => false, 17 "map_meta_cap" => true, 18 "hierarchical" => true, 19 "query_var" => true, 20 "rewrite" => [ "with_front" => false ], 21 // 'rewrite' => true, 22 "menu_position" => 5, 23 "supports" => [ "title", "editor", "thumbnail" ], 24 ]; 25 26 register_taxonomy( 27 'projects_cat', 28 'projects', 29 array( 30 'hierarchical' => true, 31 'update_count_callback' => '_update_post_term_count', 32 'label' => '設計実績カテゴリー', 33 'public' => true, 34 'show_ui' => true, 35 'show_in_rest' => true, 36 'meta_box_cb' => 'post_categories_meta_box', 37 // 'rewrite' => array('slug' => 'projects','with_front' => true,'hierarchical' => true ), 38 'rewrite' => array( 'hierarchical' => true ), 39 'query_var' => true, 40 'has_archive' => true, 41 'show_admin_column'=> true, 42 ) 43 ); 44 45 register_taxonomy( 46 'projects_tag', 47 'projects', 48 array( 49 'label' => '設計実績タグ', 50 'update_count_callback' => '_update_post_term_count', 51 'show_ui' => true, 52 'hierarchical' => false, 53 'public' => true, 54 'show_in_rest' => true, 55 'meta_box_cb' => 'post_categories_meta_box', 56 // 'rewrite' => array( 'slug' => 'projects','with_front' => true,'hierarchical' => true ), 57 'rewrite' =>true, 58 'query_var' => true, 59 'has_archive' => true, 60 'show_admin_column'=> true, 61 ) 62 ); 63 64 register_post_type( "projects", $args ); 65 66} 67add_action( 'init', 'cpt_register_projects' );

リライト

php

1function add_custom_rewrite_rules() { 2 add_rewrite_rule('projects/([^0-9]+)/?$', 'index.php?projects_cat=$matches[1]&taxonomy=projects_cat', 'top'); 3 add_rewrite_rule('projects/([^0-9]+)/page/([^/]+)/?$', 'index.php?projects_cat=$matches[1]&taxonomy=projects_cat&paged=$matches[2]', 'top'); 4 // add_rewrite_rule('projects/([^0-9]+)/?$', 'index.php?projects_tag=$matches[1]&taxonomy=projects_tag', 'top'); 5 // add_rewrite_rule('projects/([^0-9]+)/page/([^/]+)/?$', 'index.php?projects_tag=$matches[1]&taxonomy=projects_tag&paged=$matches[2]', 'top'); 6} 7add_action('init', 'add_custom_rewrite_rules');

どちらのタクソノミーもスラッグをprojectsと書き換えているため、上記の方法だとカテゴリーのみアーカイブページが作成できタグではできない。
また、コメントアウトしている下2行を記載すると、上書きされているのかタグアーカイブは表示されるが、カテゴリーのアーカイブが作成できなくなります。

よろしくお願いいたします。

2022/6/13追記

php

1function add_custom_rewrite_rules($termlink, $term, $taxonomy) { 2 return str_replace('/'.$taxonomy.'/', '/', $termlink); 3} 4add_filter('term_link', 'add_custom_rewrite_rules',11,3); 5 6$url = $_SERVER['REQUEST_URI']; 7 if(strstr($url, 'ターム名1') || strstr($url,'ターム名2') || strstr($url,'ターム名3') ){ 8 add_rewrite_rule('projects/([^0-9]+)/?$', 'index.php?projects_cat=$matches[1]&taxonomy=projects_cat', 'top'); 9 add_rewrite_rule('projects/([^0-9]+)/page/([^/]+)/?$', 'index.php?projects_cat=$matches[1]&taxonomy=projects_cat&paged=$matches[2]', 'top'); 10 } 11 else{ 12 add_rewrite_rule('projects/([^0-9]+)/?$', 'index.php?projects_tag=$matches[1]&taxonomy=projects_tag', 'top'); 13 add_rewrite_rule('projects/([^0-9]+)/page/([^/]+)/?$', 'index.php?projects_tag=$matches[1]&taxonomy=projects_tag&paged=$matches[2]', 'top'); 14 }

6/18追記→解決しました

上記色々触っていましたが、なかなか解決できず、表示されないパターンが見つかりました。
参考にさせていただいたものがこちらの2点になります。
https://100webdesign.jp/services/wordpress/wp_result/wp_result-221/
https://libre-co.com/wordpress/custom_taxonomy_permalink/

簡単に説明させていただきますと
カスタムタクソノミーのスラッグをprojects_catからprojectsに書き換えをする方法、
/projects/projects_cat/ターム名と表示させるようにし、functions.phpにてprojects_catを消す方法です。

パターンとして、カスタムタクソノミーAの記事一覧が表示されると、記事詳細ページが表示できない。
記事詳細ページが表示されると、カスタムタクソノミーの記事一覧が表示されない。
状況です。

一旦、カスタムタクソノミーBの方はパーマリンクをprojects_tagとして表示させ、干渉しないようにしています。

※こちらは
記事詳細ページの完成形のパーマリンクの設定を
/projects/カスタムタクソノミーAのターム名/記事タイトル
から
/projects/カスタムタクソノミーAのターム名/記事id
に変更することで解決いたしました。

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

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

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

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

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

monchan58

2022/06/12 16:30

2022/6/13追記いたしました。
guest

回答2

0

自己解決

こちらの記事を参照させていただき、解決しました。
https://wordpress.stackexchange.com/questions/222212/getting-a-404-on-single-custom-post-type-page-when-using-rewrite-on-a-custom-tax

また、ページ内にも書かれていますが、カスタムタクソノミーの記載時に

php

1'rewrite' =>false,

とすると問題なく表示されるようになりました。

ご回答いただきありがとうございました。

投稿2022/06/20 17:15

monchan58

総合スコア10

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

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

0

$_SERVER['REQUEST_URI']
に現在のurlが格納されていますのでif文でどちらにリライトするか分岐できると思います。

投稿2022/06/09 23:05

tabuu

総合スコア2449

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

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

monchan58

2022/06/12 16:34

tabuu様 アドバイスありがとうございます。 上記のように変更してみたのですが、うまく表示されませんでした。 どのように記載したら良いかアドバイスいただけますでしょうか?
tabuu

2022/06/13 02:05

if文の書き方については問題なさそうに見えるので、 ・そのif文にたどり着いているか ・if文はtrue、false想定通りになっているか ・$_SERVER['REQUEST_URI']は想定通りの値が取得できているか ・念のためターム名を英数字のみにしてみる などご確認してみてください。
monchan58

2022/06/13 16:55

ありがとうございます! 確認していきます。
monchan58

2022/06/16 16:21

ご指摘いただいた点、確認をしてみました。 ・if文にたどり着いているか →6/13追記分のif〜を削除するとprojects_tagの方でもアーカイブが404エラーになり、if文までたどり着いていると判断をしました。 ・if文のtrue、falseについて、$_SERVER['REQUEST_URI']の値について 一度6/13追記分のifの中身だけを記載し(elseの部分も消した状態)、projects_catでアーカイブページが表示されるような状態に変更。 projects_catのアーカイブページ内で、 echo $_SERVER['REQUEST_URI'] をすると /projects/ターム名(英語表記)/ と表示された。 次に同じくprojects_catのアーカイブページ内でif文の if(strstr($url, '/projects/ターム名1/') || strstr($url,'/projects/ターム名2/') ){ 正しいです。 } を記載すると、期待している該当アーカイブページのみ「正しいです」の表記がされました。 ・ターム名は英語表記にて記載していました。 そのため、6/13のif文の'ターム名'と記載している箇所を /projects/ターム名/ に変更し、試してみましたが現在もfunctionに記載しているelseの内容のみが正しく動いている状況です…
tabuu

2022/06/16 23:02

strstrは検索する文字以降を返すので「/projects/ターム名1/」の後ろに文字が無いので ブランク文字が返ってきてfalseになっているのかも。 strposに変更してみてください。 それもダメならurlを「$_SERVER['REQUEST_URI'];」ではなく 「/projects/ターム名1/」固定値にして確認してみてください。
monchan58

2022/06/17 22:01

アドバイスありがとうございます。 上記試してみましたが、エラーのままでした。 色々と触っていると、違う箇所で問題があるように感じてきましたので、新たに追記をさせていただきます。
monchan58

2022/06/19 07:21

何度も申し訳ありません。 6/18に追記した分は解決いたしました。
tabuu

2022/06/20 00:30

add_rewrite_ruleを変更したあとに管理ツールの設定のパーマリンクを保存し直していますか?
monchan58

2022/06/20 17:14

ご回答ありがとうございました。 解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問