web-dev-qa-db-ja.com

これは簡単ではないでしょうか。カスタム投稿タイプ/カスタム分類パーマリンク

それで、これは私を絶対に非常識なものにしています。私はこれを直すために何日も費やしてきましたが、きわめて一般的なパーマリンク構造なのでなぜこれが難しいのかわからないのですが!

私は何百もの答えと投稿を調べましたが、どれも問題を解決するようには見えません。

私は単にこの構造が欲しいのです:

mysite.com/custom-post-type/custom-taxonomy-term/post-name

それで、私は以下を達成します:

mysite.com/literature - all literature posts
mysite.com/literature/fiction - all literature posts with 'fiction' term
mysite.com/literature/fiction/mybook - the post

私が何かをしようとするたびに私は404エラーが出たり、ページネーションがうまくいかない。

なぜこれがそんなに難しいのかわかりません!

任意の助けは本当に感謝しています!

ありがとうございました

=================================================== ==== ================追加情報============== ====

現在、私は以下のように投稿タイプと分類法を登録しています。

register_post_type('literature',$args);
'rewrite' => array('slug' => 'literature/books','with_front' => false),

register_taxonomy('literature_category',array('literature'), array(
'rewrite' => array( 'slug' => 'literature','with_front' => false ),

両方とも「文学」として登録した場合、mysite.com/articleページに404が表示されますが、これは私のパーマリンクを次のように表示します。mysite.com/literature/books/mybook

この質問に対するアドバイスに従った後 - カスタム投稿タイプ、分類法、およびパーマリンク

これを私の機能に追加しました:

function filter_post_type_link($link, $post) {
    if ($post->post_type != 'literature')
        return $link;

    if ($cats = get_the_terms($post->ID, 'literature_category'))
        $link = str_replace('%literature_category%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

投稿タイプを'slug' => 'literature/%literature_category%'に変更し、分類法を'slug' => 'literature'に変更しました

mysite.com/literatureではページ付けが機能しないことを除けば、これは非常にうまく機能します。そのため、次のURLで404エラーが発生します。

mysite.com/literature/page/2/

11
fxfuture

この質問 のアドバイスに従ってください。ただし、これはあなたのコードに追加してください。

add_action( 'generate_rewrite_rules', 'fix_literature_category_pagination' );
function fix_literature_category_pagination( $wp_rewrite ) {
    unset($wp_rewrite->rules['literature/([^/]+)/page/?([0-9]{1,})/?$']);
    $wp_rewrite->rules = array(
        'literature/?$' => $wp_rewrite->index . '?post_type=literature',
        'literature/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=literature&paged=' . $wp_rewrite->preg_index( 1 ),
        'literature/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?literature_category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
    ) + $wp_rewrite->rules;
}

最後に、設定>パーマリンクへ行き、保存をクリックしてください。それでもうまくいかない場合は、パーマリンクをもう一度保存してください。時々私はあなたがそれらを二度保存しなければならないように感じるが、誰が知っている。とにかく、あなたがどうやって作ったのか教えてください。 Computer Science Standard Answer#1が適用されることに注意してください。 それは私のために働きます ... ;-)

TMIの国から….

参考までに、why​​ _デフォルトでページが機能しないのは、WordPressが文学/%literature_category%/%book%/%page%の書き換え規則を設定しているからです。それについて。だからあなたのデフォルトパーマリンクはこの順番でこれらの競合するルールを持っている:

[literature/([^/]+)/([^/]+)(/[0-9]+)?/?$] => index.php?literature_category=$matches[1]&book=$matches[2]&page=$matches[3]
[literature/([^/]+)/page/?([0-9]{1,})/?$] => index.php?literature_category=$matches[1]&paged=$matches[2]

ここで実際に行っているのは、後者の設定を解除することでこれらの順序を変更し(それを保持することはできますが、その後のすべての書き換えでページ読み込み時に実行する正規表現が1つ増えます)、配列の先頭に追加します。

おかしな事実:あなたがこれまでに "ページ"というタイトルの "本"を持っていて、それが複数のページを持っている場合、この順序は矛盾し、その後のページは機能しません!

6
Matthew Boynes