URLからカスタム投稿タイプのスラッグを削除


15

これに役立つ答えは見つかりませんでした。競合の問題とこれが引き起こす可能性のあるすべての問題を認識していますが、可能性が示唆されていない可能性があるかどうか興味があります。これにはWPの書き換えが必要になります。

基本的に、「イベント」のCPTがあるとします。私は、単一のイベントのページを持ちたいURL持ちhttp://domain.com/single-event-nameとNOT http://domain.com/events/single-event-nameを。どのようにそれについて行くかのアイデアはありますか?


質問をすることを考えたことがなく、常にそれについて調べたいと思っていました。ありがとう!
フィスキ

2015年の@robbennetでは、スタイルでこれを行う正当な方法はまだないようです。
ベンラシコット

回答:


9

それがあなたが仕事の最初の部分をする方法です-投稿リンクの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エラーが発生するため、「ニュース」の書き換えルールが必要になります。

次のような書き換えルールを追加します。

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

次に、書き換えルールをフラッシュする必要があるため、[設定]-[パーマリンク]に移動して、変更を保存します。


1
initに書き換えルールを追加しないでください。ルールを現在のルールに追加するだけです。
Chris_O

2
@Chris_O詳しく説明してもらえますか?現在のルールにルールをどのように追加しますか?
デジ

このコードを追加した後、example.com / about-usとしてURLを持つすべてのページが機能しなくなりましたか?これに対する解決策はありますか?
ラーフルグプタ

4

このプラグイン(http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/)を試してスラッグを削除できますが、パーマリンク構造が "/%postnameの場合にのみ機能します%/


まさにこのプラグインは素晴らしいです!私はこのプラグインの経験豊富なユーザーであり、完全にお勧めです!ここでは深さでそれを説明するプラグインのサイトのリンクですultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

これは素晴らしいプラグインであり、まさに私が探していた機能を備えています。@bartoszの解決策は、1つのCPTに対するものですが、一般的なアイデアも得られます。このプラグインを掘り下げた後、すべてが明確になりました、ありがとう!
フィスキ

0

常に「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;
      }
 }

ただし、これは、ポスト名と同じ名前のポスト名がないことを前提としています。そうでない場合、イベントタイプと最初に一致するため、ポストは表示されません。


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