カスタム分類とbase-name / parent-tax / child-tax / custom-post-type-nameなどのカスタム投稿タイプを使用してパーマリンク構造を作成する方法


53

私はこのサイトとグーグルで答えを探していましたが、まったく空っぽになりました。基本的に、この投稿で求められていることを正確に行いたいのですが、階層的な分類が必要です。その投稿で与えられた答えはうまく機能しますが、単一レベルの分類でのみです。やりたいことはできますか?私は何百万ものことを試しましたが、うまくいきません。せいぜい正しいパーマリンクを取得できますが、それらは404になります。

私が欲しいものを視覚的に説明するには:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

組み込みの投稿とカテゴリでこれをうまく行うことができますが、カスタム分類とカスタム投稿タイプでどのように行いますか?'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),階層的なスラッグを取得するために使用する必要があることは知っていますが、これはアーカイブページでは正常に機能しますが、カスタム投稿タイプの投稿は404 'hierarchical' => trueになります。 / grandchild-cat / post-name /は機能します)。

だから、解決策はありますか?どうもありがとう、これは私に約3週間ずっと気を動かせてきました。

回答:


68

他の答えの束を組み合わせた後、私はそれを機能させました!これに苦労しているあなたのためのソリューションはここにあります:

この記事この1はそれらの人に感謝して、いくつかの私を助けました。

このすべてのコードに加えて、最初のカスタム投稿タイプと分類登録コードが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;    
}

次に、パーマリンクをフラッシュする必要があります(パーマリンク設定ページを読み込むだけです)。

うまくいけば、すべてがうまくいくはずです!多数の分類用語を作成し、それらを正しくネストしてから、いくつかのカスタム投稿タイプの投稿を作成し、それらを正しく分類します。slugを使用してページを作成することもできbasename、すべてが質問で指定したとおりに機能します。いくつかのカスタム分類アーカイブページを作成して、外観を制御し、ある種の分類ウィジェットプラグインを追加して、ネストされたカテゴリをサイドバーに表示できます。

それがあなたを助けることを願っています!


修正済み-質問を参照してください。ジェフ、説明ありがとう!しかし、カスタムポストタイプ/タクソノミービルドを投稿することは可能ですか?だから私は私が間違っいることを見ることができますか?本当にありがたいです!
Reitzeボス

ジェフさん、答えてくれてありがとう!これで4時間戦った後、私はほとんどそこにいます。私の唯一の問題は、投稿名の前にダブルスラッシュが付いていることです(このように:Portfolio / diseno-grafico-2 / logo // alquimia-sonora /)助けていただけますか?
-Cmorales

1
@Cmorales、コードを見ずに確信はありませんが、おそらくcpt slug登録またはfilter_post_type関数のように、投稿名の前に手動でスラッシュを定義する場所を探しますか?余分なスラッシュを追加する場所を追跡できない場合は、filter_post_type_linkで呼び出されるget_taxonomy_parents関数の戻り値から最後の文字を取り除くことができます。ダブル。幸運を。
ジェフ

1
「ネストされた用語のレベルが異なる場合、最後のuriセグメントがカスタム投稿タイプまたは分類用語であるかどうかを確認する関数を作成して、追加するルールを確認する必要があります(サポートが必要な場合はお問い合わせくださいその上で...」まあ、私を助けてくれませんか?:)
Cmorales

2
^それはまさに私が必要としたものです。誰もそれを行う方法を知っていますか?ここで私の質問を参照してください:wordpress.stackexchange.com/questions/102246/…–
reikyoushin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.