Custom Post Typeのスラッグではなく、パーマリンクに分類法を追加したところ、うまくいきました。私はすべてがうまく機能していたのに、WPインストールをMultisiteに変更すると、他のすべての投稿とページ(CPTではなく)を壊したとさえ思います。
パーマリンクは?p = 123または他の推測されたURLとして毎回正しく生成されるので、投稿情報は見つかりますが、ループに対しては見つかりません。
これが、CPTのスラッグの代わりに分類法を採用した方法です。
1)post_typeの書き換えは%listing_type%として定義されており、次のようにうまく機能します。
'rewrite' => array(
'slug' => '/%listing_type%',
'with_front' => false,
2)そして以下の関数は、URLとtermリンクからの%listing_type%と "listing_type"文字列を置き換えます。それぞれwp_list_categories()(URLからCPTの名前を削除)
function listing_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) {
if ( strpos('%listing_type%', $post_link) === 'FALSE' ) {
return $post_link;
}
$post = get_post($id);
if ( !is_object($post) || $post->post_type != 'listing' ) {
return $post_link;
}
$terms = wp_get_object_terms($post->ID, 'listing_type');
if ( !$terms ) {
return str_replace('/listing_type', '/', $post_link);
}
return str_replace('%listing_type%', $terms[0]->slug, $post_link);
}
add_filter('post_type_link', 'listing_type_link_filter_function', 1, 3);
function term_link_filter_function( $termlink, $term, $taxonomy ) {
if ( strpos('listing_type', $termlink) === 'FALSE' ) {
return $termlink;
} else return str_replace('/listing_type', '', $termlink);
}
add_filter('term_link', 'term_link_filter_function', 1, 3);
今、私はそれをマルチサイトにする前にすべてがうまくいっていたことをほぼ確実にしています。安全にそれを実行解除する方法(マルチサイトの事)を研究し、後で更新を投稿します。
上記のCPTに含まれていない投稿やページを壊している可能性があるという考えはありますか? post_typeスラッグから%sを削除すれば、すべてうまくいきます。
UPDATAE
私は他の実用的な例が各カスタムパーマリンクのための書き換え規則を持っていたことに気づいたので、私はそれを追加しました、そしてVOILA、投稿は現在修正されています、しかしページはまだ壊れています
この部分は動作します(投稿のみ)
global $wp_rewrite;
$wp_rewrite->extra_permastructs['listing'][0] = "%listing_type%/%postname%";
add_rewrite_rule("([^/]+)/([^/]+)/?$", 'index.php?post_type=listing&listing_type=$matches[1]&name=$matches[2]', 'bottom');
add_rewrite_rule("([^/]+)/([^/]+)/?$", 'index.php?post_type=listing&listing_type=$matches[1]&page=$matches[2]', 'bottom');
上記のコード(CPT定義関数内)は投稿のみを修正しましたが、ページ(2番目のadd_rewrite_rule行が意図されていたもの)はまだ壊れています。
書き換えルールをtop
ではなくbottom
に追加します。一致するすべてのルールはプロセスを中止します。そのため、以前に単一のの一致しかない場合、ルールはスキップされます。