Eliminarea slug-ului de tip post personalizat din URL
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?

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.

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 Poți să elaborezi? Cum am putea adăuga regula la regulile curente?

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?

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%/".

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/

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!

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/

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]

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.
