Notice: Undefined offset: 6 in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 480
Notice: Undefined offset: 7 in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 483
Notice: Undefined variable: blogcard in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 350
Notice: Undefined variable: blogcard in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 350
Notice: Undefined offset: 6 in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 480
Notice: Undefined offset: 7 in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 483
Notice: Undefined variable: blogcard in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 350
Notice: Undefined variable: blogcard in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/functions.php on line 350
【D-01】【D-02】で、カスタム投稿タイプのアーカイブページでのページ送りに関する記述が抜けていたので、追加しました! ご指摘ありがとうございました!!
こんにちは、asです
前回の記事をもとにカスタムタクソノミーを作ると、パーマリンクがもっとこうだったらと思うこともあるかと思います。
その場合にどうやって変更するのか、数パターンに分けてまとめていきます(^^)
難易度というか、手間かからない順です(笑)
とても長くなったので、デフォルトのパーマリンク項目のところに早見表を作成してあります。
Contents
カスタム投稿タイプ、カスタムタクソノミーのパーマリンク
前回の記事をもとにカスタムタクソノミーを作ると、カスタムタクソノミーのパーマリンクは下記のようになっていると思います。
ちなみに、登録したスラッグは下記の通りです。
カスタム投稿タイプ:ownersblog
階層化カスタムタクソノミー:ownersblog-cat
└ターム:親 tabearuki 子 wasyoku
階層なしカスタムタクソノミー:ownersblog-tag
└ターム:italian-tag
デフォルトのパーマリンク
わかりやすくするため、カスタム投稿タイプ名を赤色に、カスタムタクソノミー名を青色、ターム名を緑色にしています。
■カスタム投稿タイプ記事一覧ページ(archive-ownersblog.php)
http://サイトアドレス/カスタム投稿タイプ名/
http://libre-co.com/ownersblog/
■タクソノミーページ(taxonomy.php)
階層化タイプ:
http://サイトアドレス/カスタムタクソノミー名/親ターム名/子ターム名/
http://libre-co.com/ownersblog-cat/tabearuki/wasyoku/
階層なしタイプ:
http://サイトアドレス/カスタムタクソノミー名/ターム名/
http://libre-co.com/ownersblog-tag/italian-tag/
*タクソノミーページにはカスタム投稿タイプ名が入りません。
■記事詳細ページ(single-ownersblog.php)
http://サイトアドレス/カスタム投稿タイプ名/投稿名/
http://libre-co.com/ownersblog/はじめてのつぶやき/
*記事詳細ページにはカスタムタクソノミー名、ターム名が入りません。
カスタム投稿タイプの記事一覧ページは問題ないですね!
ただ、記事詳細ページは運用次第ですが、タクソノミーページにカスタム投稿タイプ名が入らないのは、少しわかりにくい印象です。
実現したいパーマリンクを探す早見表
記事がとても長くなったので、早見表を作成しました(^^)
それぞれの項目へジャンプします。
【A】詳細ページの投稿名をスラッグから投稿IDにする
http://サイトアドレス/カスタム投稿タイプ名/投稿ID/
【B】タクソノミーページを「/カスタム投稿タイプ名/任意の単語/ターム名/」にする
http://サイトアドレス/カスタム投稿タイプ名/任意の単語/親ターム名/子ターム名/
【C】タクソノミーページは「/カスタム投稿タイプ名/ターム名/」にし、詳細ページにもターム名をいれる(子タームは使用しない、タグタイプのタクソノミー)
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/ターム名/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ/ターム名/投稿名スラッグ/
【D】Cタイプで、子タームも使用する
【D-01】パターン01:投稿スラッグは投稿IDにする
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿ID/
【D-02】パターン02:投稿名はスラッグのままで親タームを選択させない様にする
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/子タームを持たない親ターム名/
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿名スラッグ/
【A】詳細ページの投稿名を投稿IDにする
まずは記事詳細ページから。
投稿名のところは、デフォルトでは投稿画面で指定した日本語または英語の単語(スラッグ)ですが、これを投稿IDにする場合の手順です。
記事が複数のタームやタクソノミーに該当する場合パーマリンクは簡素にしておきたい場合などに。
下記の様なパーマリンクになります。
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/投稿ID/
http://libre-co.com/ownersblog/15/
/* カスタム投稿のパーマリンク設定
-----------------------------------------------------*/
//カスタム投稿タイプのパーマリンクを投稿IDに変更する。
add_filter('post_type_link', 'generateCustomPostLink', 1, 2);
add_filter('rewrite_rules_array', 'addRewriteRules');
function generateCustomPostLink($link, $post){
if($post->post_type === 'ownersblog'){
//投稿IDに書き換えたパーマリンク文字列を返す
return home_url('/ownersblog/'.$post->ID);
} else {
return $link;
}
}
//投稿IDに書き換えたパーマリンクに対応したクエリルールを追加
function addRewriteRules($rules){
$new_rule = array(
'ownersblog/([0-9]+)/?$' => 'index.php?post_type=ownersblog&p=$matches[1]'
);
//ルール配列に結合
return $new_rule + $rules;
}
【B】タクソノミーページを「/カスタム投稿タイプ名/任意の単語/ターム名/」にする
まずは一番手軽な方法から。
タクソノミーページを下記のパーマリンクに変更したいと思います!
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/任意の単語/親ターム名/子ターム名/
http://libre-co.com/ownersblog/category/tabearuki/wasyoku/
先にコード内容を。
register_taxonomy( //カテゴリー形式
'ownersblog-cat', //★カスタムタクソノミー名
'ownersblog', //★紐づける投稿タイプ名、デフォルト分類に使う場合はpost、page
array(
'label' => 'つぶやきカテゴリー', //★管理画面で表示する名前
'labels' => array(
'add_new_item' => '新規カテゴリーを追加' //★管理画面で表示する名前
),
'public' => true, //投稿タイプをパブリックにするか (true/false)
'hierarchical' => true, //カテゴリーのような階層構造にするかどうか (true/false)
'show_in_rest' => true, //新エディタ Gutenberg を有効化
'show_admin_column'=> true, //管理画面の記事一覧に項目を作るか (true/false)
'rewrite' => array(
'slug' => 'ownersblog/category', //書き換え後のスラッグ
//'with_front' => false //通常投稿のパーマリンク構造を引き継ぐかどうか (true/false)
'hierarchical' => true //階層化したURLを使用可能にする
)
)
);
// 書き換えたスラッグに対応したリライトルールを追加
//★スラッグを実際に合わせて変更
//★ownersblogはカスタム投稿タイプ名、ownersblog-catはカスタムタクソノミー名を挿入
add_rewrite_rule('ownersblog/category/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
//リダイレクト処理
add_action( 'template_redirect', 'my_redirect' );
function my_redirect() {
$url_now = $_SERVER['REQUEST_URI'];
if($url_now == "/ownersblog/category/"){ //★リダイレクトさせたいurl
$url = home_url('/ownersblog/', 'http'); //★リダイレクト先のurl
wp_safe_redirect( $url, 301 );
exit();
}
}
functions.phpでカスタムタクソノミーを登録した際のregister_taxonomyの中で、rewrite設定を追加します。
パラメーターの'slug'を'カスタム投稿タイプ名/任意の単語'に変更すると、パーマリンクからカスタムタクソノミー名の表示をなくすだけでなく、どの投稿タイプに属するのか分かりやすくなります(^^)
また直接URLから任意の単語を削除してもエラーにならず、カスタム投稿タイプの記事一覧ページになります。
ここでは、'ownersblog-cat'を'ownersblog/category'に書き換えます。(15行目)
続いて、このままだと新しいパーマリンクにアクセスしても404エラーになるので、リライトルールを追加します。(25行目)
さらに、http://libre-co.com/ownersblog/category/にアクセスした場合も404エラーにならない様に、カスタム投稿タイプの記事一覧ページへリダイレクトさせておくと安心かと思います。(28行目以降)
変更後のパーマリンク
これでタクソノミーページのパーマリンクが目標通りになりました♪
一応まとめて書いておくと、下記の様な感じです。
記事詳細ページのスラッグを投稿名から投稿IDにしたい場合は、前の項を参考ください。併用できます(^^)
■カスタム投稿タイプ記事一覧ページ
http://サイトアドレス/カスタム投稿タイプ名/
http://libre-co.com/ownersblog/
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/任意の単語/親ターム/子ターム/
http://libre-co.com/ownersblog/category/tabearuki/wasyoku/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/投稿名/
http://libre-co.com/ownersblog/はじめてのつぶやき/
【C】タクソノミーページは「/カスタム投稿タイプ名/ターム名/」にし、詳細ページにもターム名をいれる
この方法が一番手間ですが、今回一番検証したかった大本命です。
タクソノミーページはタクソノミー名を抜き、変わりに投稿タイプ名を表示させたい。
詳細ページにはターム名も含めたい。
こんな感じ。
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/ターム名/
http://libre-co.com/ownersblog/tabearuki/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ/ターム名/投稿名/
http://libre-co.com/ownersblog/tabearuki/はじめてのつぶやき/
STEP01:プラグイン『Custom Post Type Permalinks』の設定
まずは記事詳細ページにターム名を追加します。
ここはスクラッチじゃ大変なので、おとなしくプラグインを使用します(^^)
『Custom Post Type Permalinks』というプラグインを使用します。
ダウンロードして有効化すると、管理画面の「パーマリンク設定」の下部に「カスタム投稿タイプのパーマリンク設定」という項目が追加されます。
パーマリンクを「/%ownersblog-cat%/%postname%/」にしておきます。
「カスタマイズされたカスタムタクソノミーのパーマリンクを使用する」にもチェックを入れます。
これでパーマリンクは下記の様になりました。
■タクソノミーページ
http://libre-co.com/ownersblog/ownersblog-cat/tabearuki/
http://libre-co.com/ownersblog/ownersblog-tag/italian-tag/
■記事詳細ページ
http://libre-co.com/ownersblog/tabearuki/はじめてのつぶやき/
記事詳細ページは目標通りになりました!
あともう一息です!
タクソノミーページのパーマリンクからカスタムタクソノミー名の/ownersblog-cat/をはずしていきます。
ここからはfunctions.phpに記載します。
STEP02:functions.phpの編集
functions.phpに以下を追加し、タクソノミーページのパーマリンクからタクソノミー名を削除し、リライトルールを設定します。
ページ送りにも対応できる様に12行目も加えます。
/* カスタム投稿のパーマリンク設定
-----------------------------------------------------*/
//パーマリンクからタクソノミー名を削除
function my_custom_post_type_permalinks_set($termlink, $term, $taxonomy){
return str_replace('/'.$taxonomy.'/', '/', $termlink);
}
add_filter('term_link', 'my_custom_post_type_permalinks_set',11,3);
//カスタムタクソノミーアーカイブ用のリライトルールを追加 ページ送り時もリライト
//★それぞれownersblogはカスタム投稿タイプ名、ownersblog-catはカスタムタクソノミー名を挿入
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/page/([0-9]+)/?$', 'index.php?ownersblog-cat=$matches[1]&paged=$matches[2]', 'top');
STEP03:タクソノミーを必ず選択させる様にする
【C】の方法だと、タクソノミーに属さない投稿の詳細ページが404になってしまいますので対策します。
必ずカテゴリーを選択する様にすれば問題ないのですが、うっかり忘れることもあるかもしれません。
その時のために、あらかじめ選択なしで公開した際に特定のタクソノミーを選択させる様にしておきましょう!
functions.phpに加筆します。
ownersblog(カスタム投稿タイプ名)、ownersblog-cat(カスタムタクソノミー名)を適宜書き換え、選択させたいタームIDを指定してください。
/*
タクソノミー未選択時に特定のタームを選択させる
----------------------------------------------------- */
function add_defaultcategory_automatically($post_ID) {
global $wpdb;
//カスタムタクソノミーのタームを取得
$curTerm = wp_get_object_terms($post_ID, 'ownersblog-cat');//★カスタムタクソノミー名
//既存のターム指定数が未設定の時に特定のタームを指定
if (0 == count($curTerm)) {
$defaultTerm= array(1);//★選択させたいタームID
wp_set_object_terms($post_ID, $defaultTerm, 'ownersblog-cat');//★カスタムタクソノミー名
}
}
// ownersblogを作成する際に指定
add_action('publish_ownersblog', 'add_defaultcategory_automatically');//★publish_カスタム投稿タイプ名
これでうっかり何もタクソノミーを選択せず公開すると、タームID:1の「その他」のカテゴリーに勝手にチェックが入る様になりました!
変更後のパーマリンク
これで、パーマリンクは目標の下記になりました!
階層なしのタクソノミーの場合や、子タームを使わない場合はこれでOKです!
ただ、子タームがある場合、そのタクソノミーページが404になってしまいます。
子ターム使うよって場合は次の項目:Dタイプへ。
■カスタム投稿タイプ記事一覧ページ
http://サイトアドレス/カスタム投稿タイプ名/
http://libre-co.com/ownersblog/
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/ターム名/
http://libre-co.com/ownersblog/tabearuki/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/ターム名/投稿名/
http://libre-co.com/ownersblog/tabearuki/はじめてのつぶやき/
【D】Cタイプで、子タームも使用する
ここまでだと多くのブログに書かれていたりしてすんなりいくのですが、カスタムタクソノミーに階層を持たせた場合(子タームがある場合)だとうまくいきません。。。
子タームのタクソノミーページが404になってしまいます。
基本のパーマリンクが階層を持っていないので、リライトルールが複雑化してしまうのだと思います。
まずはパーマリンクのおさらいです(タクソノミー構成が下記の場合)。
・食べ歩き tabearuki
└和食 wasyoku
・その他 others(親のみのターム)
■タクソノミーページ
基本:http://サイトアドレス/?カスタムタクソノミー名=親・子ターム名/
親 http://libre-co.com/?ownersblog-cat=tabearuki
http://libre-co.com/?ownersblog-cat=others
子 http://libre-co.com/?ownersblog-cat= wasyoku
目標
親 http://サイトアドレス/カスタム投稿タイプ名/ターム名/
http://libre-co.com/ownersblog/others/
子 http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/
http://libre-co.com/ownersblog/tabearuki/wasyoku/
■記事ページ
基本:http://サイトアドレス/?カスタム投稿タイプ名=投稿名
親 http://libre-co.com/?ownersblog=投稿名
子 http://libre-co.com/?ownersblog=投稿名
目標
親 http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿名/
http://libre-co.com/ownersblog/others/投稿名/ (←親のみのターム)
子 http://libre-co.com/ownersblog/tabearuki/wasyoku/投稿名/
リライトルールがかなり複雑化するので、下記2パターンに分けて対応します!
【D-01】パターン01:投稿スラッグは投稿IDにする
【D-02】パターン02:投稿名はスラッグのままで親タームを選択させない様にする
やっぱり楽な順です(^^)
※【C】までの手順は同じです。
【D-01】パターン01:投稿スラッグは投稿IDにする
記事詳細ページのパーマリンクを投稿名ではなく、投稿IDでOKな場合は手軽です(^^)
まず、【C】のSTEP01で設定した「カスタム投稿タイプのパーマリンク設定」のパーマリンクを「/%ownersblog-cat%/%post_id%/」に変更します。
そして【C】のSTEP02のリライトの部分を子タームに対応させて下記の様に書き換えます。
//親タームに属する記事ページ
add_rewrite_rule('ownersblog/([^/]+)/([0-9]+)/?$', 'index.php?post_type=ownersblog&p=$matches[2]', 'top');
//親ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
//子ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[2]', 'top');
ページ送りのことも考えた全記述は以下のとおり。
【C】のSTEP03で書いたカテゴリー未選択記事の404対策も忘れずに入れます。
『Custom Post Type Permalinks』の設定をしたら、functions.phpに下記を記載すればOKです(^^)
/* カスタム投稿のパーマリンク設定
-----------------------------------------------------*/
//パーマリンクからタクソノミー名を削除
function my_custom_post_type_permalinks_set($termlink, $term, $taxonomy){
return str_replace('/'.$taxonomy.'/', '/', $termlink);
}
add_filter('term_link', 'my_custom_post_type_permalinks_set',11,3);
//リライトルールの追加
//★それぞれownersblogはカスタム投稿タイプ名、ownersblog-catはカスタムタクソノミー名を挿入
//↓カスタム投稿タイプの一覧ページ
add_rewrite_rule('ownersblog/page/([0-9]+)/?$', 'index.php?post_type=ownersblog&paged=$matches[1]', 'top');
//↓親タームに属する記事ページ
add_rewrite_rule('ownersblog/([^/]+)/([0-9]+)/?$', 'index.php?post_type=ownersblog&p=$matches[2]', 'top');
//↓親ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/page/([0-9]+)/?$', 'index.php?ownersblog-cat=$matches[1]&paged=$matches[2]', 'top');
//↓子ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[2]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/page/([0-9]+)/?$', 'index.php?ownersblog-cat=$matches[1]&paged=$matches[2]', 'top');
/* タクソノミー未選択公開時にデフォルトで特定のタームを選択させる
-----------------------------------------------------*/
function add_defaulttaxonomy($post_ID) {
global $wpdb;
//カスタム分類のタームを取得
$curTerm = wp_get_object_terms($post_ID, 'ownersblog-cat');//★カスタムタクソノミー名
//ターム指定数が未設定の時に特定のタームを指定
if (0 == count($curTerm)) {
$defaultTerm= array(1);//★選択させたいタームID
wp_set_object_terms($post_ID, $defaultTerm, 'ownersblog-cat');//★カスタムタクソノミー名
}
}
//カスタム投稿
add_action('publish_ownersblog', 'add_defaulttaxonomy');//★publish_カスタム投稿タイプ名
変更後のパーマリンク
これで、なんとかパーマリンクは目標の下記になりました!
■カスタム投稿タイプ記事一覧ページ
http://サイトアドレス/カスタム投稿タイプ名/
http://libre-co.com/ownersblog/
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/
http://libre-co.com/ownersblog/tabearuki/wasyoku/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿ID/
http://libre-co.com/ownersblog/tabearuki/wasyoku/15/
【D-02】パターン02:投稿名はスラッグのままで親タームを選択させない様にする
リライトルールで、親子のタームを切り分けるのが(私の力量では)非常に難しいので、子タームがある親タームは選択できない様にしておくことにしました!
下記の「食べ歩き」、「簡単レシピ」は選択できなくさせちゃいます。
階層のない「その他」だけ、別にリライトルールに書くことに。
・食べ歩き
├和食
├イタリアン
└スイーツ
・簡単レシピ
├メインディッシュ
├サイドメニュー
└デザート
・その他
子ターム分のリライトルールを加えます。
パーマリンク に合わせて /([^/]+)/ を増やしました。
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[2]', 'top');
これだと親タームに属する詳細ページ(/ownersblog/others/投稿名/)と子タームの一覧(/ownersblog/tabearuki/wasyoku/)が見分けられません。
そこで、子タームを持たない親タームだけのターム(紛らわしい!)である、「その他(others)」のタームだけ別に記述することに。(1行目)
add_rewrite_rule('ownersblog/others/([^/]+)/?$', 'index.php?ownersblog=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[2]', 'top');
また、子タームをもつ親タームはあらかじめ選択させない様にしました。
【C】のSTEP03で書いたカテゴリー未選択記事の404対策も忘れずに入れます。
これで何とか実現できました! ページ送りのことも考えた全記述は以下のとおり。
【C】のSTEP01の『Custom Post Type Permalinks』の設定をしたら、functions.phpに下記を記載すればOKです(^^)
/* カスタム投稿のパーマリンク設定
-----------------------------------------------------*/
//パーマリンクからタクソノミー名を削除
function my_custom_post_type_permalinks_set($termlink, $term, $taxonomy){
return str_replace('/'.$taxonomy.'/', '/', $termlink);
}
add_filter('term_link', 'my_custom_post_type_permalinks_set',11,3);
//カスタムタクソノミーアーカイブ用のリライトルールを追加 ページ送り時もリライト
//★それぞれownersblogはカスタム投稿タイプ名、ownersblog-catはカスタムタクソノミー名を挿入
//↓カスタム投稿タイプの一覧ページ
add_rewrite_rule('ownersblog/page/([0-9]+)/?$', 'index.php?post_type=ownersblog&paged=$matches[1]', 'top');
//↓親タームに属する記事ページ ★othersには子タームのないタームスラッグを挿入
add_rewrite_rule('ownersblog/others/([^/]+)/?$', 'index.php?ownersblog=$matches[1]', 'top');
//↓親ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[1]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/page/([0-9]+)/?$', 'index.php?ownersblog-cat=$matches[1]&paged=$matches[2]', 'top');
//↓子ターム一覧ページ
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/?$', 'index.php?ownersblog-cat=$matches[2]', 'top');
add_rewrite_rule('ownersblog/([^/]+)/([^/]+)/page/([0-9]+)/?$', 'index.php?ownersblog-cat=$matches[2]&paged=$matches[3]', 'top');
/* タクソノミー未選択公開時にデフォルトで特定のタームを選択させる
-----------------------------------------------------*/
function add_defaultcategory_automatically($post_ID) {
global $wpdb;
//カスタムタクソノミーのタームを取得
$curTerm = wp_get_object_terms($post_ID, 'ownersblog-cat');//★カスタムタクソノミー名
//ターム指定数が未設定の時に特定のタームを指定
if (0 == count($curTerm)) {
$defaultTerm= array(1); //★選択させたいタームIDに変更する
wp_set_object_terms($post_ID, $defaultTerm, 'ownersblog-cat');//★カスタムタクソノミー名
}
}
//カスタム投稿
add_action('publish_ownersblog', 'add_defaultcategory_automatically');//★publish_カスタム投稿タイプ名
/* 親タームを選択できないようにする コピペでOK
-----------------------------------------------------*/
require_once(ABSPATH . '/wp-admin/includes/template.php');
class Nocheck_Category_Checklist extends Walker_Category_Checklist {
function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
extract($args);
if ( empty( $taxonomy ) )
$taxonomy = 'category';
if ( $taxonomy == 'category' )
$name = 'post_category';
else
$name = 'tax_input['.$taxonomy.']';
$class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
$cat_child = get_term_children( $category->term_id, $taxonomy );
if( !empty( $cat_child ) ) {
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), true, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
} else {
$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
}
}
}
function wp_category_terms_checklist_no_top( $args, $post_id = null ) {
$args['checked_ontop'] = false;
$args['walker'] = new Nocheck_Category_Checklist();
return $args;
}
add_action( 'wp_terms_checklist_args', 'wp_category_terms_checklist_no_top' );
変更後のパーマリンク
これで、なんとかパーマリンクは目標の下記になりました!
■カスタム投稿タイプ記事一覧ページ
http://サイトアドレス/カスタム投稿タイプ名/
http://libre-co.com/ownersblog/
■タクソノミーページ
http://サイトアドレス/カスタム投稿タイプ名/子タームを持たない親ターム名/
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/
http://libre-co.com/ownersblog/tabearuki/wasyoku/
http://libre-co.com/ownersblog/others/
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿名/
http://libre-co.com/ownersblog/tabearuki/wasyoku/はじめてのつぶやき/
あとがき
だいぶ長くなりました!が、まとめられてスッキリしました!(^^)
カスタムタクソノミーのパーマリンクは厄介ですね。
個人的には、やるとしてもタイプBまでにしておきたい感じです(笑)
Comments
はじめまして。
サイトを参考にさせていただきました。
【D-02】を設定したところ、
■カスタム投稿タイプ記事一覧ページ
http://サイトアドレス/カスタム投稿タイプ名/
は表示されるのですが、
http://サイトアドレス/カスタム投稿タイプ名/page/2/
のページネーションと
■記事詳細ページ
http://サイトアドレス/カスタム投稿タイプ名/親ターム名/子ターム名/投稿名/
がエラーになります。
解決方法はありますか?
環境
WordPress 5.6.1
コメントありがとうございます!
そしてご指摘のとおり、カスタム投稿タイプのアーカイブページのページ送りに関するリライトの記載が抜けてました(^_^;)
記事にも追加しましたが、functions.phpのリライトルールに以下を追加してみてください!
add_rewrite_rule(‘ownersblog/page/([0-9]+)/?$’, ‘index.php?post_type=ownersblog&paged=$matches[1]’, ‘top’);
また、詳細ページですが、こちらの環境では表示されるので、パーマリンク設定とリライトルールの記述にミスがないか確認してみてください(^^)
早速のご教示ありがとうございます。
add_rewrite_rule(‘ownersblog/page/([0-9]+)/?$’, ‘index.php?post_type=ownersblog&paged=$matches[1]’, ‘top’);
こちらを追加したらカスタム投稿タイプのアーカイブページのページ送りはエラーになりませんでした。
ありがとうございます。
子タームをの記事ページがどうしてもエラーになるため試行錯誤で下記を記述したらエラーはしませんでした。
//↓親タームに属する記事ページ ★othersには子タームのないタームスラッグを挿入
add_rewrite_rule(‘ownersblog/others/([^/]+)/?$’, ‘index.php?ownersblog=$matches[1]’, ‘top’);
↓追記
add_rewrite_rule(‘ownersblog/tabearuki/wasyoku/([^/]+)/?$’, ‘index.php?ownersblog=$matches[1]’, ‘top’);
add_rewrite_rule(‘ownersblog/tabearuki/子ターム/([^/]+)/?$’, ‘index.php?ownersblog=$matches[1]’, ‘top’);
postname→post_idにしたらエラーにならなかったので、WPが記事ページのパーマリンクを誤認識してるかもしれませんでした。
解決できたようでよかったです!
ターム名のスラッグ文字列にもよったりするのかもしれません。
リライトルールは1文字のミスでエラーになるので難しいですよね。。。
また、D-02だと、『Custom Post Type Permalinks』の設定は「/%ownersblog-cat%/%postname%/」なのですが、この書き方だとわかりにくかったかもしれませんね。
後日記事も修正しておこうと思います(^^)
はじめまして。だいしと申します。
とてもわかりやすく記載頂きありがとうございます。
参考にさせてもらいながらHPを作成致しました。
もし、ご存知でしたら教えて頂けると幸いです。
2点ほどあり、
1点目が
【C】にて
http://wordpress-cafe.com/wp/ownersblog/ownersblog-cat/tabearuki/
を
http://wordpress-cafe.com/wp/ownersblog/tabearuki/
に変換されてると思うのですが
http://wordpress-cafe.com/wp/ownersblog/ownersblog-cat/tabearuki/
へは【C】対応後もアクセスできてしまうものでしょうか?
私が作ったHPだとアクセスできてしまって。。。重複コンテンツでSEOの評価が別れてしまうのでこまっています。
2点目が
いつの変更で発生しててるのかわからないのですが、
カスタムタクソノミー名をURLの任意の場所に追加してもターム一覧ページが表示されてしまいます。
たとえば
http://wordpress-cafe.com/wp/ownersblog-cat/ownersblog/tabearuki/
http://wordpress-cafe.com/wp/ownersblog-cat/ownersblog-cat/ownersblog/tabearuki/
みたいな感じです。
もし、可能でしたら解決方法をご教授いただけると幸いです。
だいしさん、はじめまして!コメントありがとうございます!
とんでもなく遅いレスポンスで申し訳ないのですが、、、
この記事はあくまでもアクセスできるようにする、のが目的なので、
既存のURLは別途対応する必要があります。
リダイレクトで対応するのが簡単かな、と思うのですがいかがでしょうか?
半ば無理やりですが、例えば、、、
add_action( ‘template_redirect’, ‘my_redirect’ );
function my_redirect() {
$url_now = $_SERVER[‘REQUEST_URI’];
if(strstr($url_now,’ownersblog-cat’)){ //urlにownersblog-catが含まれていたら
$url = home_url(‘/ownersblog/’, ‘http’); //home/ownersblog/へリダイレクト
wp_safe_redirect( $url, 301 );
exit();
}
}
もちろん、もっと細かくリダイレクト設定しても良いかと思います(^^)
はじめまして。
色々と試した結果このサイトに辿り着きました。
大変参考になります。
上の質問でもありますが、【D-02】で子タームの記事ページがエラーになってしまいます。
いろいろ試した結果、子ターム記事ページのリライトを記述すると動作したのですが、なにか設定が間違ってるのでしょうか?
ーーーーーーーーーーーーーーー
//カスタムタクソノミーアーカイブ用のリライトルールを追加 ページ送り時もリライト
//★それぞれownersblogはカスタム投稿タイプ名、ownersblog-catはカスタムタクソノミー名を挿入
//↓カスタム投稿タイプの一覧ページ
add_rewrite_rule(‘ownersblog/page/([0-9]+)/?$’, ‘index.php?post_type=ownersblog&paged=$matches[1]’, ‘top’);
//↓親タームに属する記事ページ ★othersには子タームのないタームスラッグを挿入
add_rewrite_rule(‘ownersblog/others/([^/]+)/?$’, ‘index.php?ownersblog=$matches[1]’, ‘top’);
//↓親ターム一覧ページ
add_rewrite_rule(‘ownersblog/([^/]+)/?$’, ‘index.php?ownersblog-cat=$matches[1]’, ‘top’);
add_rewrite_rule(‘ownersblog/([^/]+)/page/([0-9]+)/?$’, ‘index.php?ownersblog-cat=$matches[1]&paged=$matches[2]’, ‘top’);
//↓子ターム一覧ページ
add_rewrite_rule(‘ownersblog/([^/]+)/([^/]+)/?$’, ‘index.php?ownersblog-cat=$matches[2]’, ‘top’);
add_rewrite_rule(‘ownersblog/([^/]+)/([^/]+)/page/([0-9]+)/?$’, ‘index.php?ownersblog-cat=$matches[2]&paged=$matches[3]’, ‘top’);
//↓子ターム記事ページ(追記箇所)
add_rewrite_rule(‘ownersblog/([^/]+)/([^/]+)/([^/]+)/?$’, ‘index.php?custom02=$matches[3]’, ‘top’);
ーーーーーーーーーーーーーーー
コーダー名無しさん、はじめまして!
コメントありがとうございます。
うーん、何ででしょう、当方で再度コピペして試してみましたが、問題なく動くのですよね(^_^;)
詳細ページのパーマリンクは『Custom Post Type Permalinks』で設定しているのですが、そちらも「/%タクソノミー名%/%postname%/」になっていますでしょうか?
設定内容は【C】のSTEP01と同様です。
ご返信ありがとうございます。
はい、「/%タクソノミー名%/%postname%/」に設定しています。
ただ、with_front: falseにしています。
共有設定をカスタム構造にし『/blog/%category%/%post_id%/』にしているためです。
asさんの共有設定はカスタム構造でしょうか?
この箇所が悪さしているような気がします。
よろしくお願いします。
コーダー名無しさん、
パーマリンク設定>カスタム構造のところでしょうか?
そこが原因のような気がします。
ここに/blog/が入っているので、リライトルールと齟齬が生じているのだと思います。
add_rewrite_ruleの「ownersblog」の部分を全て「blog/ownersblog」とすれば良いかと思います。
例)add_rewrite_rule(‘blog/ownersblog/([^/]+)/?$’, 〜〜以後省略〜〜
試してみてください(^^)!
また、記事もこの点がクリアになるように追ってリライトしておきます!
ご返信ありがとうございます。
分かりづらくて申し訳ございません。
運用の設定をお伝えしていなかったです。
初期の『投稿』はブログで使用しているため、共通パーマリンク設定で下記のような設定をしています。
『/blog/%category%/%post_id%/』
ブログ以外にも『お知らせ』を管理画面から投稿出来るようにカスタム投稿タイプを設定しています。
カスタム投稿タイプ…news
カスタムタクソノミー…news-category
ターム…sals(親カテゴリーのみ)・info・store(infoの子カテゴリー)
カスタムパーマリンク設定…/%news-category%/%postname%/
上記の設定の場合に下記のように表示させようと思っていました。
子カテゴリーがない場合、…news/sals/入荷情報/
子カテゴリーの場合…/news/info/store/年末の営業時間/
asさんの設定状況ですと、ブログ投稿で初期の投稿は使用せず、下記の設定を行いfunctions.phpへ追加しないと思い通りの挙動にはならないということですね。
共通パーマリンク設定…/%category%/%post_id%/(/blogを削除)
カスタム投稿タイプ…blog
カスタムタクソノミー…blog-category
カスタムパーマリンク設定…/%blog-category%/%postname%/
コーダー名無しさん、こんにちは、時間取れず返信が遅くなってしまいました(^_^;)
新たにblogで投稿タイプを追加してもOKですが、
共通パーマリンクがカスタム投稿タイプには適用されないようにすれば良いかと思います。
実際にはregister_post_typeの中のarrayの中に、更に以下を追記すれば大丈夫です。
テスト環境で試しましたが、これで
通常投稿は
〜〜/blog/cat/投稿名/
カスタム投稿タイプは
〜〜/ownersblog/parent-cat/child-cat/投稿名/
〜〜/ownersblog/no-child-cat/投稿名/
となること確認いたしました(^^)
‘rewrite’ => array(
‘slug’ => ‘ownersblog’,//slugが投稿タイプ名と同じなら省略可能
‘with_front’ => false
)
>ただ、with_front: falseにしています。
すでに と書かれていますが、ここの設定を見直してみてください!
‘rewrite’の中になっているかなど。。。
はじめまして、るみと申します。
以前より、何度も参考にさせていただいております。わかりやすいご説明を本当にありがとうございますm(_ _)m
1点お伺いしたいことがございます。
【C】タクソノミーページは「/カスタム投稿タイプ名/ターム名/」にし、詳細ページにもターム名をいれる
上記をもとにカスタマイズしているのですが、今回、詳細ページには「ターム名」を入れない方法を模索しております。
いろいろなサイトを参考に試してみたのですが、勉強中ということもあり、うまくいきません。
実現したいことは、
・タクソノミーページは「/カスタム投稿タイプ名/ターム名/」
・詳細ページは「「/カスタム投稿タイプ名/投稿名/」
です。
もし【C】の方法をもとに実現するのでしたら、どのようにすればよいでしょうか?
お忙しいところ恐縮ですが、教授いただけましたら、幸いです。
どうぞよろしくお願いいたします。
るみさん、
コメントありがとうございます!!
気づくのが遅くてごめんなさい!もう既に解決されているかもしれないのですが、、、
試してみたので、ご参考いただければ幸いです(^^)
まず、【C】のStep:01でターム名を付け加えているので、
「/%ownersblog-cat%/%postname%/」と入力されている箇所を「/%postname%/」と、投稿名だけにします。
(下のチェックはタクソノミーページに適用されるのでそのまま入れておいてください。)
そうすると、リライトルールが詳細ページとタクソノミーページでバッティングしてしまうので、
正規表現ではなく実際のタームスラッグを入れてしまいます。
↓このような形です。
add_rewrite_rule(‘ownersblog/tabearuki/?$’, ‘index.php?ownersblog-cat=tabearuki’, ‘top’);
add_rewrite_rule(‘ownersblog/tabearuki/page/([0-9]+)/?$’, ‘index.php?ownersblog-cat=$tabearuki&paged=$matches[1]’, ‘top’)
(aged=$matches[1]も2→1に変えています。)
こうすると、
・タクソノミーページは「/カスタム投稿タイプ名/ターム名/」
・詳細ページは「「/カスタム投稿タイプ名/投稿名/」
になるかと思います。
タームごとに記述を増やさないといけないので面倒ですし、他にもっと良い案があるかもしれませんが、、、、
お役に立てばよいのですが。
お忙しいなかご親切にご回答くださり、ありがとうございます!!
「そうすると、リライトルールが詳細ページとタクソノミーページでバッティングしてしまうので、
正規表現ではなく実際のタームスラッグを入れてしまいます。」
そういうことなのですね!404になってしまう意味もわかりました!ありがとうございます。
教授いただいた方法で試したところ、理想どおりの形にすることができました!
おっしゃるとおり、「タームごとに記述を増やさないといけない」点は課題ですね。
本当にありがとうございました!!
るみさん
コメントありがとうございます(^^)
そうなのです、記述増えてしまうのですが、、、
お力になれたようで嬉しいです!
WordPressの実装でどのサイトを参考にしてもうまくいかず何時間もハマっていたのですが、こちらのサイトを参考にさせていただいて解決することができました!!本当にありがとうございます!!
コメントありがとうございます!励みになります!解決の一助になれた様で嬉しいです(^^)
Notice: Undefined variable: post_id in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/comments.php on line 20
Notice: Undefined variable: aria_req in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/comments.php on line 23
Notice: Undefined variable: aria_req in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/comments.php on line 28
Notice: Undefined variable: html5 in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/comments.php on line 31
Notice: Undefined variable: aria_req in /home/users/0/sub.jp-unicanails/web/libre-co/wp/wp-content/themes/Libreco/comments.php on line 31