Usuń ślimak niestandardowego typu posta z adresu URL

15

Nie znalazłem przydatnej odpowiedzi na to pytanie. Jestem świadomy problemów konfliktu i wszystkich problemów, które może to powodować, jestem ciekawy, czy MOŻLIWE nie SUGEROWANE. Będzie to wymagało przepisywania WP, wiem tyle.

Zasadniczo powiedzmy, że mamy CPT „zdarzeń”. Chcę, aby strona pojedynczego wydarzenia miała adres URL http://domain.com/single-event-name, a NIE http://domain.com/events/single-event-name . Wszelkie pomysły, jak to zrobić?

Rob Bennet
źródło
Zawsze chciałem się o tym dowiedzieć, nigdy nie myślałem o zadaniu pytania. Dzięki!
fischi
@robbennet w 2015 roku nadal nie wydaje się, aby istniał legalny sposób na zrobienie tego ze stylem.
Ben Racicot

Odpowiedzi:

9

W ten sposób możesz wykonać pierwszą część pracy - pozbyć się ślimaka CPT w łączu do postu (np. Typ wiadomości).

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 );

Teraz należy przejść do przepisywania reguł dla „wiadomości”, ponieważ pojawi się błąd 404.

Dodaj regułę przepisywania w następujący sposób:

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

Następnie będziemy musieli opróżnić reguły przepisywania, więc przejdź do Ustawienia - Permalinki i zapisz zmiany.

Bartosz
źródło
1
Nie powinieneś dodawać reguł przepisywania przy init. Powinieneś po prostu dodać swoją regułę do bieżących reguł.
Chris_O,
2
@Chris_O Czy potrafisz opracować? Jak dodać regułę do obecnych reguł?
Desi
Po dodaniu tego kodu wszystkie moje strony z adresami URL jak example.com/about-us przestały działać? Jakieś rozwiązania tego?
Rahul Gupta
4

Możesz wypróbować tę wtyczkę ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) w celu usunięcia ślimaka, ale zadziała ona tylko wtedy, gdy struktura łącza bezpośredniego to „/% postname % /

swtshweta
źródło
Właśnie ta wtyczka jest niesamowita! Jestem doświadczonym użytkownikiem tej wtyczki i całkowicie ją polecam! oto link do strony wtyczki, która wyjaśnia to dogłębnie ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary
To ładna wtyczka i ma dokładnie tę funkcję, której szukałem. Rozwiązaniem @ Bartosz jest konkretnie jeden CPT, chociaż ty też masz z tego ogólny pomysł. Po zagłębieniu się w tę wtyczkę wszystko jest teraz jasne, dziękuję!
fischi
0

Zawsze możesz podłączyć się do „parse_request”, aby sprawdzić, czy istnieje niestandardowy typ o żądanej nazwie, a następnie odpowiednio zmodyfikować zmienne query_vars. Będziesz potrzebować czegoś podobnego do odpowiedzi @ Bartosza, aby dodatkowo wygenerować bezpośredni link:

 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;
      }
 }

Zakłada się jednak, że nie będziesz mieć żadnych nazw postów o takiej samej nazwie jak nazwa postu, w przeciwnym razie post nigdy się nie pojawi, ponieważ najpierw pasuje do typu zdarzenia.

Zakalwe
źródło
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');

opróżnij / przetwarza przepisane adresy URL, a następnie edytujesz .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Kristina Childs
źródło