Eliminar el slug de tipos de contenido personalizados de la URL
No he encontrado una respuesta útil para esto. Soy consciente de los conflictos potenciales y problemas que puede causar, pero me interesa saber si es POSIBLE (no recomendable). Sé que esto requerirá reescrituras de WordPress.
Básicamente, supongamos que tenemos un CPT de "eventos". Quiero que la página de un evento individual tenga la URL http://dominio.com/evento-individual y NO http://dominio.com/eventos/evento-individual. ¿Alguna idea sobre cómo hacerlo?

Así es como puedes hacer la primera parte del trabajo - eliminar el slug del CPT en el enlace del post (por ejemplo, para el tipo de entrada '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 );
Ahora deberías añadir reglas de reescritura para 'news', porque obtendrás un error 404.
Añade la regla de reescritura así:
function df_custom_rewrite_rule() {
add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');
Luego necesitaremos limpiar las reglas de reescritura, así que ve a Ajustes - Enlaces permanentes y guarda los cambios.

No deberías estar agregando reglas de reescritura en init. Deberías simplemente agregar tu regla a las reglas actuales.

@Chris_O ¿Puedes elaborar? ¿Cómo se agregaría la regla a las reglas actuales?

Después de agregar este código, todas mis páginas que tienen URLs como http://example.com/about-us dejaron de funcionar. ¿Alguna solución para esto?

Puedes probar este plugin (http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/) para eliminar el slug, pero solo funcionará si la estructura de permalinks es "/%postname%/".

¡Este plugin es increíble! Soy un usuario experimentado de este plugin y lo recomiendo totalmente.
Aquí está el enlace del sitio del plugin que lo explica en profundidad http://www.ultimatewebtips.com/remove-slug-from-custom-post-type/

Este es un excelente plugin, y tiene exactamente la función que estaba buscando. La solución de @bartosz es para un CPT específico, aunque también se puede entender la idea general. Después de investigar este plugin, ahora todo está claro, ¡gracias!

Este plugin ya no parece estar en el repositorio de WordPress. Sin embargo, puedes usar este otro plugin en su lugar... 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');
vaciar/reciclar las reescrituras de URL, luego editar el archivo .htaccess
RewriteRule ^cpt/(.+)$ /$1 [R=301,L]

Siempre puedes engancharte a "parse_request" para realizar una verificación y ver si existe un tipo personalizado con el nombre solicitado, y luego modificar los query_vars apropiadamente. Necesitarás algo similar a la respuesta de @Bartosz para generar el enlace permanente además:
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)
{
//sabemos que existe tu entrada de "evento" así que ahora modificamos los query_vars
//primero eliminamos 'page' y 'pagename'
unset($query_vars['page']);
unset($query_vars['pagename']);
//ahora reconstruimos los query_vars
$query_vars['post_type'] = "event"; //nombre del CPT
$query_vars['name'] = $slug;
$query_vars['event'] = $slug; //de nuevo - esto construye la cadena de consulta "event=myevent"
}
else
{
//simplemente retornamos $wpobj ya que sabemos que no hay un "evento"
return $wpobj;
}
}
Esto asume sin embargo que no tendrás nombres de publicaciones con el mismo nombre que un postname, de lo contrario, la publicación nunca aparecerá ya que coincidirá primero con un tipo de evento.
