Cambiar el slug de un Tipo de Entrada Personalizada
Estoy trabajando con un tema hijo y no quiero editar el archivo que registra un CPT de Portfolio en mi sitio. Utilicé un plugin para cambiar el nombre de Portfolio a Stories, pero el plugin no ofrece una opción para cambiar el slug.
Intenté usar la siguiente función:
function change_slug_of_post_type_portfolio() {
register_post_type('portfolio', array('rewrite' => array ('slug' => 'stories',)));
}
add_action('init', 'change_slug_of_post_type_portfolio', 20);
Pero esto elimina completamente Portfolio de la barra lateral del administrador de WordPress.

El filtro register_post_type_args
puede usarse para modificar los argumentos del tipo de entrada:
add_filter( 'register_post_type_args', 'wpse247328_register_post_type_args', 10, 2 );
function wpse247328_register_post_type_args( $args, $post_type ) {
if ( 'portfolio' === $post_type ) {
$args['rewrite']['slug'] = 'historias';
}
return $args;
}

Esto funcionó para mí después de aplicar el paso adicional mencionado por @Felipe Romero: "refrescar" tus Permalinks yendo a Ajustes > Enlaces permanentes y guardando los cambios.

@DaveRomsey, ¿Podemos usar el mismo nombre para el slug de la página y el slug del tipo de contenido personalizado?

@NarenVerma Técnicamente puedes hacerlo, pero habrá conflictos con los enlaces permanentes. Yo usaría slugs únicos.

@DaveRomsey, En realidad he creado un tipo de publicación personalizado llamado "blog". Ahora también he creado una página de blog y sí, entra en conflicto con la URL. Lo que estoy haciendo es que necesito mostrar todas las publicaciones del blog en esta URL https://example.com/blog y también necesito una URL para un blog de página única llamada https://example.com/blog/post-name

La respuesta de @dave-romsey no funcionó para mí, PHP seguía mostrándome Warning: Cannot use a scalar value as an array in /path/to/functions.php
Así que opté por la vía de array_merge
.
Función completa que necesitas agregar al archivo functions.php
de tu tema hijo:
function update_portfolios_slug( $args, $post_type ) {
if ( 'portfolios' === $post_type ) {
//$args['rewrite']['slug'] = 'presidentes';
$my_args = array(
'rewrite' => array( 'slug' => 'presidentes', 'with_front' => false )
);
return array_merge( $args, $my_args );
}
return $args;
}
add_filter( 'register_post_type_args', 'update_portfolios_slug', 10, 2 );
Después de subir tu código, no olvides "refrescar" tus Permalinks yendo a Ajustes > Enlaces permanentes y haciendo clic en Guardar cambios.
Saludos.

Esto me llevó a la meta, pero algo importante a tener en cuenta es que array_merge
no parece fusionar sub-arreglos. Cuando eliminé el slug
(ya que estaba configurado personalmente por el plugin), eliminó la base pero también restableció el nombre predeterminado del slug del CPT. Parece que fusionará el rewrite
con el resto de los $args
, pero reemplazará todo el rewrite
, sin fusionarlo también. Conclusión: establece todos los valores de tu rewrite
.
