web-dev-qa-db-ja.com

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

私はこのサイトとグーグルで答えを探していましたが、まったく空っぽになりました。基本的に、私は この投稿 が要求することを正確に行いたいのですが、階層的な分類が必要です。その投稿で与えられた答えはうまく機能しますが、単一レベルの分類でのみです。やりたいことはできますか?私は100万ものことを試しましたが、うまくいきません。せいぜい正しいパーマリンクを取得できますが、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しかし、階層URLは失われます(/ basename/grandchild-cat/post-name /のみが機能します)。

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

53
Jeff

他にもたくさんの答えをまとめた結果、うまくいきました。だからこれもこれに苦労しているあなたの人々のための解決策です:

この記事この記事 が私を助けてくれました。

このコードすべてに加えて、あなたの最初のカスタム投稿タイプと分類登録コードがあなたのfunctions.phpファイルに入っています。

カスタム投稿タイプと分類法を定義するときは、最初にナメクジを正しく作成します。カスタム投稿タイプの場合はbasename/%taxonomy_name%、分類法のスラッグはbasenameとします。あなたのURLに入れ子になった用語を取得するために'hierarchical' => trueを分類法書き換え配列に追加することを忘れないでください。どちらの場合もquery_vartrueに設定されていることも確認してください。

あなたはあなたのURL構造を解釈する方法をWordPressが知っているようにあなたは新しい書き換え規則を追加する必要があります。私の場合、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を使ってページを作成することもできます。すべてが私の質問で指定した方法で機能するはずです。サイドバーにネストされたカテゴリを表示するための外観を制御して taxonomy widget _プラグインを追加するためのカスタム分類アーカイブページを作成することをお勧めします。

お役に立てば幸いです。

68
Jeff

このプラグイン を見てください。それはカテゴリのための階層的なURLを提供します、しかしあなたはどんな分類法にも容易に適応することができます。

ルールの作成は 再帰関数 に従います。

2
vmassuchetto