これに対する有用な答えは見つかりませんでした。私は衝突の問題とこれが引き起こすかもしれないすべての問題を知っています、それが推奨されないならば私は興味があります。これはWPの書き換えを必要とするでしょう、私はこれを知っています。
基本的に、「イベント」のCPTがあるとしましょう。単一のイベントのページに http://domain.com/single-event-name およびNOT http://domain.com/events/single-event-nameというURLを付けたい 。それをどうやって進めるかについて何かアイデアはありますか?
それはあなたが仕事の最初の部分を行うことができる方法です - ポストリンクのCPTスラグを取り除く(例えば、ニュース投稿タイプ)。
function df_custom_post_type_link( $post_link, $id = 0 ) {
$post = get_post($id);
if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )
return $post_link;
return home_url(user_trailingslashit( "$post->post_name" ));
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );
404エラーになるので、今度は 'news'の書き換え規則を書きます。
このように書き換えルールを追加します。
function df_custom_rewrite_rule() {
add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');
それから書き換えルールをフラッシュする必要があるので、設定 - パーマリンクに行き、変更を保存します。
スラッグを削除するためにこのプラグイン( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ )を試すことができますが、パーマリンク構造が"/%postname%/
function register_cpt_type() {
register_post_type('cpt', array(
'rewrite' => array("slug" => "/cpt", "with_front" => false),
));
}
add_action('init', 'register_cpt_type')
function cpt_rewrite_rule() {
add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');
uRLを書き換えてから.htaccessを編集します。
RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
常に "parse_request"にフックして、要求された名前のカスタムタイプが存在するかどうかを確認してからquery_varsを適切に変更することができます。パーマリンクを生成するには、@ Bartoszの応答に沿ったものが必要です。
add_filter('parse_request', "t21_parse_request" , 1, 1);
function t21_parse_request($wbobj)
{
$vars = $wpobj->query_vars;
$slug = $query_vars['pagename'];
$posts = get_posts(array(
"post_type" => "event",
"post_name" => $slug
));
if($posts)
{
//we know your "event" entry exists so we now amend the query_vars
//first unset the 'page' and 'pagename'
unset($query_vars['page']);
unset($query_vars['pagename'];
//now rebuild the query_vars
$query_vars['post_type'] = "event"; //CPT name
$query_vars['name'] = $slug;
$query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
}
else
{
//just return $wpobj since we know that there is no "event"
return $wpobj;
}
}
ただし、これは、他の投稿名と同じ名前の投稿名がないことを前提としています。投稿が最初にイベントタイプと一致するため、表示されることはありません。