Rimuovere lo slug del custom post type dall'URL
Non ho trovato una risposta utile per questo. Sono consapevole dei problemi di conflitto e di tutti i problemi che questo potrebbe causare, sono curioso se è POSSIBILE non SUGGERITO. Questo richiederà rewrite di WP, questo lo so.
In pratica, supponiamo di avere un CPT di "eventi". Voglio che la pagina di un singolo evento abbia l'URL http://domain.com/nome-evento-singolo e NON http://domain.com/eventi/nome-evento-singolo. Qualche idea su come procedere?

Ecco come puoi fare la prima parte del lavoro - rimuovere lo slug del CPT dal link dell'articolo (ad esempio per il post type 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 );
Ora dovrai aggiungere le regole di riscrittura per 'news', altrimenti otterrai un errore 404.
Aggiungi la regola di riscrittura in questo modo:
function df_custom_rewrite_rule() {
add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');
Infine dovrai svuotare le regole di riscrittura, quindi vai su Impostazioni - Permalink e salva le modifiche.

Non dovresti aggiungere regole di riscrittura su init. Dovresti semplicemente aggiungere la tua regola alle regole correnti.

@Chris_O Puoi approfondire? Come si potrebbe aggiungere la regola alle regole correnti?

Dopo aver aggiunto questo codice, tutte le mie pagine con URL come http://example.com/about-us hanno smesso di funzionare? Qualche soluzione per questo?

Puoi provare questo plugin (http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/) per rimuovere lo slug, ma funzionerà solo se la struttura dei permalink è impostata su "/%postname%/".

Esattamente questo plugin è fantastico! Sono un utente esperto di questo plugin e lo consiglio vivamente!
Ecco il link del sito del plugin che lo spiega in profondità http://www.ultimatewebtips.com/remove-slug-from-custom-post-type/

Questo è un bel Plugin, e ha esattamente la funzionalità che stavo cercando. La soluzione di @bartosz è specifica per un CPT, anche se da lì si capisce l'idea generale. Dopo aver approfondito questo Plugin ora è tutto chiaro, grazie!

Sembra che questo plugin non sia più nel repository di Wordpress. Tuttavia puoi usare questo plugin invece... 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');
svuota/ricicla le riscritture URL, poi modifica .htaccess
RewriteRule ^cpt/(.+)$ /$1 [R=301,L]

Puoi sempre agganciarti a "parse_request" per eseguire un controllo e verificare se esiste un tipo personalizzato con il nome richiesto e quindi modificare i query_vars in modo appropriato. Avrai bisogno di qualcosa simile alla risposta di @Bartosz per generare anche il permalink:
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)
{
//sappiamo che la tua voce "event" esiste, quindi ora modifichiamo i query_vars
//prima rimuoviamo 'page' e 'pagename'
unset($query_vars['page']);
unset($query_vars['pagename']);
//ora ricostruiamo i query_vars
$query_vars['post_type'] = "event"; //nome del CPT
$query_vars['name'] = $slug;
$query_vars['event'] = $slug; //di nuovo - questo costruisce la stringa di query "event=myevent"
}
else
{
//restituiamo semplicemente $wpobj poiché sappiamo che non c'è nessun "event"
return $wpobj;
}
}
Tuttavia, questo presuppone che non avrai nessun nome di post con lo stesso nome di un postname, altrimenti il post non apparirà mai poiché corrisponde prima a un tipo di evento.
