Eliminarea slug-ului de tip post personalizat din URL

28 sept. 2012, 06:33:03
Vizualizări: 18.1K
Voturi: 15

Nu am găsit un răspuns util pentru aceasta. Sunt conștient de problemele de conflict și de toate complicațiile pe care această modificare le poate provoca, sunt curios dacă este POSIBIL, nu RECOMANDAT. Știu că aceasta va necesita rescrieri în WP.

De exemplu, să presupunem că avem un CPT "evenimente". Doresc ca pagina unui eveniment să aibă URL-ul http://domeniu.com/nume-eveniment și NU http://domeniu.com/evenimente/nume-eveniment. Aveți idei despre cum se poate realiza acest lucru?

2
Comentarii

Întotdeauna am vrut să aflu despre asta, dar nu m-am gândit niciodată să pun întrebarea. Mulțumesc!

fischi fischi
13 dec. 2012 16:27:43

@robbennet în 2015 încă nu pare să existe o modalitate legitimă de a face asta cu stil.

Ben Racicot Ben Racicot
28 sept. 2015 18:58:41
Toate răspunsurile la întrebare 4
3

Așa poți face prima parte a lucrării - eliminarea slug-ului CPT din linkul articolului (de ex. tipul de postare 'news').

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

Acum ar trebui adăugate reguli de rescriere pentru 'news', altfel vei primi o eroare 404.

Adaugă regula de rescriere astfel:

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

Apoi va trebui să reîncarci regulile de rescriere, așa că mergi la Setări - Legături permanente și salvează modificările.

13 dec. 2012 16:56:11
Comentarii

Nu ar trebui să adăugați reguli de rescriere pe init. Ar trebui doar să adăugați regula dvs. la regulile curente.

Chris_O Chris_O
19 dec. 2012 08:36:04

@Chris_O Poți să elaborezi? Cum am putea adăuga regula la regulile curente?

Desi Desi
25 ian. 2015 15:26:29

După adăugarea acestui cod, toate paginile mele care au URL-uri precum http://example.com/about-us au încetat să funcționeze? Există soluții pentru aceasta?

Rahul Gupta Rahul Gupta
15 dec. 2016 10:09:04
3

Puteți încerca acest plugin (http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/) pentru a elimina slug-ul, dar va funcționa doar dacă structura de legături permanente este "/%postname%/".

13 dec. 2012 16:56:39
Comentarii

Exact acest plugin este minunat! Sunt un utilizator experimentat al acestui plugin și îl recomand cu totul!

aici este linkul site-ului pluginului care îl explică în detaliu http://www.ultimatewebtips.com/remove-slug-from-custom-post-type/

Kuldeep Daftary Kuldeep Daftary
17 dec. 2012 19:17:03

Acesta este un plugin frumos și are exact funcționalitatea pe care o căutam. Soluția lui @bartosz este pentru un CPT specific, deși și de la aceasta poți înțelege ideea generală. După ce am studiat acest plugin, totul este clar acum, mulțumesc!

fischi fischi
19 dec. 2012 14:40:29

Se pare că acest plugin nu mai este în repository-ul WordPress. Totuși, poți folosi acest plugin în schimb.... https://wordpress.org/plugins/remove-cpt-base/

clayRay clayRay
28 nov. 2021 04:22:14
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');

golește/reciclează rescrierile URL-urilor, apoi editează fișierul .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
13 dec. 2012 20:37:23
0

Puteți folosi întotdeauna hook-ul "parse_request" pentru a verifica dacă există un tip personalizat cu numele solicitat și apoi să modificați query_vars în mod corespunzător. Veți avea nevoie de ceva similar cu răspunsul lui @Bartosz pentru a genera permalink-ul în plus:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wpobj)
 {
      $query_vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //știm că intrarea "event" există, așa că acum modificăm query_vars
           //mai întâi eliminăm 'page' și 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename']);

           //acum reconstruim query_vars
           $query_vars['post_type'] = "event"; //numele CPT
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug; //din nou - acesta construiește șirul de interogare "event=myevent"
      }
      else
      {
           //returnăm pur și simplu $wpobj deoarece știm că nu există niciun "event"
           return $wpobj;
      }
 }

Aceasta presupune însă că nu veți avea nicio postare cu același nume ca un postname, altfel postarea nu va apărea niciodată deoarece se potrivește mai întâi cu un tip de eveniment.

13 dec. 2012 21:55:52