カスタム分類法とbase-name / parent-tax / child-tax / custom-post-type-nameなどのカスタム投稿タイプを使用してパーマリンク構造を作成する方法
3 回答
- 投票
-
- 2012-01-23
他のたくさんの答えを組み合わせた後、私はそれを機能させました!ですから、これにも苦労している皆さんのための解決策は次のとおりです.
この投稿と これは私を助けてくれたので、ありがとうあの人たち. 注:このすべてのコードに加えて、最初のカスタム投稿タイプと分類登録コードが
functions.php
ファイルに含まれています.カスタム投稿タイプと分類法を定義するときは、最初にスラッグを正しく取得します.カスタム投稿タイプの場合は
basename/%taxonomy_name%
で、分類法のスラッグはbasename
.'hierarchical' => true
を適用して、URLにネストされた用語を取得します.また、どちらの場合もquery_var
がtrue
に設定されていることを確認してください.WordPressがURL構造を解釈する方法を認識できるように、新しい書き換えルールを追加する必要があります.私の場合、URIのカスタム投稿タイプの部分は常に5番目のURIセグメントになるので、それに応じて一致ルールを定義しました.多かれ少なかれuriセグメントを使用する場合は、これを変更する必要がある場合があることに注意してください.ネストされた用語のレベルが異なる場合は、最後のURIセグメントがカスタム投稿タイプであるか分類用語であるかを確認して、追加するルールを確認する関数を作成する必要があります(ヘルプが必要な場合は私に尋ねてください)それ).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules'); function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment $newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]'; return array_merge($newRules, $rules); }
次に、このコードを追加して、カスタム投稿タイプの書き換えスラッグ構造で
%taxonomy_name%
を処理する方法をworkpressに許可する必要があります.function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Wordpress独自の
get_category_parents
に基づいてカスタム関数を作成しました:// my own function to do what get_category_parents does for other taxonomies function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) { $chain = ''; $parent = &get_term($id, $taxonomy); if (is_wp_error($parent)) { return $parent; } if ($nicename) $name = $parent -> slug; else $name = $parent -> name; if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) { $visited[] = $parent -> parent; $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); } if ($link) { // nothing, can't get this working :( } else $chain .= $name . $separator; return $chain; }
次に、パーマリンクをフラッシュする必要があります(パーマリンク設定ページをロードするだけです).
これで、すべてがうまく機能するはずです.分類用語をたくさん作成して正しくネストしてから、カスタム投稿タイプの投稿を作成して正しく分類します.スラッグ
basename
を使用してページを作成することもでき、すべてが私の質問で指定した方法で機能するはずです.カスタム分類法アーカイブページを作成して、それらの外観を制御し、ある種の分類法ウィジェットを追加することをお勧めします. ネストされたカテゴリをサイドバーに表示するプラグイン.お役に立てば幸いです.
After combining a bunch of pieces of other answers I got it working! So here's the solution for those of you who are struggling with this too:
This post and this one helped me out some, so thanks to those guys.
Note, all this code, plus your initial custom post type and taxonomy registration code goes in your
functions.php
file.First get your slugs right when defining your custom post types and taxonomies: for the custom post type it should be
basename/%taxonomy_name%
and the slug for your taxonomy should be justbasename
. Don't forget to also add'hierarchical' => true
to the taxonomy rewrite array to get nested terms in your url. Also make surequery_var
is set totrue
in both cases.You need to add a new rewrite rule so WordPress knows how to interpret your url structure. In my case the custom post type part of the uri will always be the 5th uri segment, so I defined my match rule accordingly. Note that you may have to change this if you use more or less uri segments. If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules'); function mmp_rewrite_rules($rules) { $newRules = array(); $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment $newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]'; return array_merge($newRules, $rules); }
Then you need to add this code to let workpress how to handle
%taxonomy_name%
in your custom post type rewrite slug structure:function filter_post_type_link($link, $post) { if ($post->post_type != 'custom_post_type_name') return $link; if ($cats = get_the_terms($post->ID, 'taxonomy_name')) { $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below } return $link; } add_filter('post_type_link', 'filter_post_type_link', 10, 2);
I created a custom function based on Wordpress's own
get_category_parents
:// my own function to do what get_category_parents does for other taxonomies function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) { $chain = ''; $parent = &get_term($id, $taxonomy); if (is_wp_error($parent)) { return $parent; } if ($nicename) $name = $parent -> slug; else $name = $parent -> name; if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) { $visited[] = $parent -> parent; $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); } if ($link) { // nothing, can't get this working :( } else $chain .= $name . $separator; return $chain; }
Then you need to flush your permalinks (just load your permalinks settings page).
Now everything 'should' work hopefully! Go make a bunch of taxonomy terms and nest them correctly, then make some custom post type posts and categorize them correctly. You can also make a page with the slug
basename
, and everything should work the way I specified in my question. You may want to create some custom taxonomy archive pages to control how they look and add some kind of taxonomy widget plugin to show your nested categories in the sidebar.Hope that helps you!
-
修正済み-質問を参照してください.ジェフ、説明ありがとう!しかし、カスタムのposttype/taxonomyビルドを投稿することは可能でしょうか?だから私は自分が何をしているのかを見ることができます[間違っています](http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys)?本当にありがたいです!Fixed- see question. Jeff, thanks for your explanation! But might it be possible for you to post the custom posttype / taxonomy build? So i can see what i am doing [wrong](http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys) ? Would be realy thankfull!
- 0
- 2012-03-28
- Reitze Bos
-
ねえジェフ、あなたの答えをありがとう!これと戦って4時間後、私はもうすぐそこにいます.私の唯一の問題は、投稿名の前に二重スラッシュが表示されることです(このように:portfolio/diseno-grafico-2/logo//alquimia-sonora/)助けてくれませんか?Hey Jeff, thanks for your answer! I'm almost there, after 4 hours fighting with this. My only problem is that I get a double slash before the post name (as this: portfolio/diseno-grafico-2/logo//alquimia-sonora/ ) Can you help me?
- 0
- 2012-04-07
- Cmorales
-
@Cmorales、コードを見ないとわかりませんが、cptスラッグ登録やfilter_post_type関数など、投稿名の前に手動でスラッシュを定義する場所を探しますか?余分なスラッシュを追加している場所を追跡できない場合は、filter_post_type_linkで呼び出されるget_taxonomy_parents関数の戻り値から最後の文字を削除するだけで済みます.これにより、末尾のスラッシュが残ります.ダブル.幸運を.@Cmorales, Not sure without seeing your code, but look for a place where you manually define a slash before your post name, like maybe the cpt slug registration or in the filter_post_type function? If you can't track down where you're adding the extra slash then you could just strip the last character from the returned value of the get_taxonomy_parents function called in filter_post_type_link, because that will leave you with a trailing slash, which is the first of the double. Good luck.
- 1
- 2012-04-09
- Jeff
-
私はあなたのガイドのようなパーマリンクを作成しましたが、カスタム投稿タイプのワードプレスのデフォルトリンク: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel)function.phpでコードをテストしただけですが、上記のリンク(domain.com/place/tokyo/lotus-hotel)にカスタム分類を追加する方法が見つかりません-東京は私のカスタム分類法ですI created the permalinks like your guide but the default link in wordpress for custom post type: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) I just test your code in the function.php, I can't find the way to add custom taxonomy to above link ( domain.com/place/tokyo/lotus-hotel) - tokyo is my custom taxonomy
-
これに感謝します.ただし、マイナーな問題の1つは、%taxonomy_name%エントリの束、または私の場合は `apps/%primary_tag%/([^/] +)/page/?([0-9] {1、})/?$]=>index.php?%primary_tag%$matches [1]&apps-post=$matches [2]&paged=$matches [3] `手動で追加したルールが優先され、実行されているようです仕事ですが、これらのエントリは何かが完全に正しくないことを意味します.何か案は?Many many many thanks for this. One minor issue though, it seems to polute the rewrite rules with a bunch of %taxonomy_name% entries or in my case: `apps/%primary_tag%/([^/]+)/page/?([0-9]{1,})/?$] => index.php?%primary_tag%$matches[1]&apps-post=$matches[2]&paged=$matches[3]` The rules I add manually take precedence and seem to do the job, but these entries imply something isn't quite right. Any ideas?
- 0
- 2012-05-16
- Hari Karam Singh
-
「ネストされた用語のレベルが異なる場合は、最後のURIセグメントがカスタム投稿タイプであるか分類用語であるかを確認して、追加するルールを確認する関数を作成する必要があります(ヘルプが必要な場合は私に尋ねてください)その上で)...」まあ、私を助けてくれませんか?:)"If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that)..." Well, can you help me, please? :)
- 1
- 2013-05-22
- Cmorales
-
^それはまさに私が必要としていたものです.誰かがそれを行う方法を知っていますか?ここで私の質問を参照してください:http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules^ that's exactly what i needed. anybody know how to do it? see my question here: http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules
- 2
- 2013-06-07
- reikyoushin
-
これはうまく機能しましたが、何らかの理由で、親カテゴリのみを取得し、子は取得していません.私はあなたが投稿したとおりに正確にコピーし、指示された場合にのみ投稿タイプと税名を変更しました.何か案は?This worked good, but for some reason it's only pulling the parent category and none of the children. I copied exactly as you posted and only changed my post type and tax names where indicated. Any ideas?
- 0
- 2014-02-12
- paper_robots
-
これは少し古いことは知っていますが、分類に関係なく、その投稿タイプの最新のアイテムに「/basename」を向けておく方法について何かアイデアはありますか?I know this is a little old, but do you have any ideas on how to keep '/basename' pointed towards the most recent items in that post type regardless of taxonomy?
- 0
- 2015-02-04
- Daron Spence
-
- 2012-09-17
このプラグインをご覧ください.カテゴリの階層URLを提供しますが、任意の分類法に簡単に適応できます. ルールの作成は、
再帰関数. Take a look at this plugin. It provides hierarchical URLs for categories, but you can easily adapt to any taxonomy.
The rule creation follows a recursive function.
-
このプラグインは使用できなくなりました.This plugin no longer is available.
- 2
- 2018-12-05
- Enkode
-
- 2020-05-03
さまざまなレベルのネストに対処するため
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
rewrite_rules_array
フィルターなしでJeffのソリューションを使用することになりました.代わりに、request
フィルターを使用して、最後のurl部分が有効な投稿名であるかどうかを確認し、query_varsに追加しました.例
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
For dealing with varying level of nesting,
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
I ended up using Jeff's solution without the
rewrite_rules_array
filter. Instead I used therequest
filter to check if the last url part is a valid postname and add it to the query_vars.eg.
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
私はこのサイトとグーグルで答えを探していましたが、完全に空っぽになりました.基本的に、この投稿が求めることを正確に実行したいのですが、必要です階層的な分類法.その投稿で与えられた答えはうまく機能しますが、単一レベルの分類法でのみ機能します.私がやりたいことをすることは可能ですか?私は何百万ものことを試しましたが、どれもうまくいきません.せいぜい正しいパーマリンクを取得できますが、404になります.
私が欲しいものを視覚的に説明するには:
組み込みの投稿とカテゴリを使用してこれをうまく行うことができますが、カスタム分類法とカスタム投稿タイプをどのように使用しますか?
'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),
は、階層型スラッグを取得します.これは、アーカイブページでは正常に機能しますが、カスタム投稿タイプの投稿は404になります.'hierarchical' => true
の部分では、投稿は機能しますが、階層URLが失われます(/basename/grandchild-cat/post-name/のみが機能します).では、解決策はありますか?どうもありがとうございました.これで約3週間、私は頭がおかしくなりました.