Cómo eliminar el tipo de entrada predeterminado de la barra de herramientas de administración
Estamos configurando un nuevo WordPress para usar tipos de entrada personalizados, y queremos que nuestros editores inicien sesión y vean solo los tipos de entrada personalizados, no el tipo de entrada predeterminado 'post'. Hemos podido eliminar 'post' del menú de Administración usando este truco, pero eso todavía deja el botón "+ Nuevo" en la barra de herramientas de administración, que contiene una opción de entrada y por defecto crea una entrada. ¿Hay alguna manera fácil y segura de eliminar 'post' del botón de la barra de herramientas nuevo y/o ocultar el botón nuevo de la barra de herramientas?

Necesitas engancharte a 3 diferentes hooks de acción para ocultar completamente el tipo de entrada predeterminado. Sin embargo, el acceso directo a la entrada predeterminada mediante URL sigue siendo posible. Así que, comencemos.
El Menú Lateral
add_action( 'admin_menu', 'remove_default_post_type' );
function remove_default_post_type() {
remove_menu_page( 'edit.php' );
}
El enlace + Nuevo > Entrada en la Barra de Administración
add_action( 'admin_bar_menu', 'remove_default_post_type_menu_bar', 999 );
function remove_default_post_type_menu_bar( $wp_admin_bar ) {
$wp_admin_bar->remove_node( 'new-post' );
}
El enlace + Nuevo en la Barra de Administración
function remove_add_new_post_href_in_admin_bar() {
?>
<script type="text/javascript">
function remove_add_new_post_href_in_admin_bar() {
var add_new = document.getElementById('wp-admin-bar-new-content');
if(!add_new) return;
var add_new_a = add_new.getElementsByTagName('a')[0];
if(add_new_a) add_new_a.setAttribute('href','#!');
}
remove_add_new_post_href_in_admin_bar();
</script>
<?php
}
add_action( 'admin_footer', 'remove_add_new_post_href_in_admin_bar' );
function remove_frontend_post_href(){
if( is_user_logged_in() ) {
add_action( 'wp_footer', 'remove_add_new_post_href_in_admin_bar' );
}
}
add_action( 'init', 'remove_frontend_post_href' );
El Widget de Borrador Rápido en el Escritorio
add_action( 'wp_dashboard_setup', 'remove_draft_widget', 999 );
function remove_draft_widget(){
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
}

Esta es la forma más limpia, aunque el botón Nuevo
en la barra de administración todavía apunta a post-new.php
- se puede desactivar con un poco de Javascript como $(document).on('click', '#wp-admin-bar-new-content', function(){ return false })

Esto parece funcionar perfectamente, pero: "A simple vista" todavía muestra las publicaciones (¡y no muestra los CPTs en ningún caso!), al igual que la parte "Próximos pasos" del elemento del panel "Bienvenido a WP" [que personalmente odio y descarto de todos modos]. Además, "Actividad" podría seguir mostrando publicaciones, aunque no debería si lo configuras correctamente.

Una solución alternativa, pero similar a la de Stefan y Rafa. Esto no genera errores y ten en cuenta que si navegas directamente a /wp-admin/edit.php no podrás ver la lista de entradas (tipo de publicación por defecto), ni editarlas.
Nota: este código no desactiva realmente el tipo de publicación por defecto, es decir, las publicaciones existentes seguirán publicadas y accesibles a través de su URL pública. Lo que hace es desactivar efectivamente el acceso en el backend al tipo de publicación por defecto para todos los usuarios.
function remove_default_post_type($args, $postType) {
if ($postType === 'post') {
$args['public'] = false;
$args['show_ui'] = false;
$args['show_in_menu'] = false;
$args['show_in_admin_bar'] = false;
$args['show_in_nav_menus'] = false;
$args['can_export'] = false;
$args['has_archive'] = false;
$args['exclude_from_search'] = true;
$args['publicly_queryable'] = false;
$args['show_in_rest'] = false;
}
return $args;
}
add_filter('register_post_type_args', 'remove_default_post_type', 0, 2);

En principio es posible eliminar tipos de entradas ya registrados utilizando unregister_post_type()
. Desafortunadamente esto no es posible para los tipos de entradas _builtin
.
Alternativamente, es posible cambiar las capacidades requeridas para editar/crear/eliminar/... entradas de un tipo de entrada específico. Puedes usar el filtro register_post_type_args
para modificar las capacidades requeridas para el tipo de entrada predeterminado post
. Estableciendo todas las capacidades en false
resultará en que nadie tenga acceso al tipo de entrada post predeterminado. WordPress es lo suficientemente inteligente como para ocultar automáticamente las entradas de navegación.
add_filter('register_post_type_args', function($args, $postType){
if ($postType === 'post') {
$args['capabilities'] = [
'edit_post' => false,
'read_post' => false,
'delete_post' => false,
'edit_posts' => false,
'edit_others_posts' => false,
'publish_posts' => false,
'read' => false,
'delete_posts' => false,
'delete_private_posts' => false,
'delete_published_posts' => false,
'delete_others_posts' => false,
'edit_private_posts' => false,
'edit_published_posts' => false,
'create_posts' => false,
];
}
return $args
}, 0, 2);

Gracias, puse este código en una función que se ejecutaba en el evento 'init', pero no pareció tener ningún efecto en mi interfaz de usuario. ¿Estoy enganchando el evento equivocado?

Eso es demasiado tarde. WordPress registra todos los tipos de post _builtin
en la acción init
pero con una prioridad de 0
.
El código anterior solo está registrando un filtro, no tienes que ponerlo dentro de otra acción/filtro, simplemente escríbelo directamente en el functions.php
de tu tema, por ejemplo.

+1. El problema es que muestra 3 avisos. "Notice: Undefined offset: 0 in /var/www/html/wp-includes/capabilities.php on line 70". No pude eliminarlos.

La solución de Stefan es genial, pero si activas el modo de depuración podrás ver: Undefined offset: 0 en wp-includes/capabilities.php en la línea 62 además hay un ; faltante después de return $args
El código exhaustivo debería ser:
add_filter('register_post_type_args', function($args, $postType){
if ($postType === 'post' && current_user_can( 'create_posts' ) && current_user_can( 'edit_post' ) ) {
$args['capabilities'] = [
'edit_post' => false,
'read_post' => false,
'delete_post' => false,
'edit_posts' => false,
'edit_others_posts' => false,
'publish_posts' => false,
'read' => false,
'delete_posts' => false,
'delete_private_posts' => false,
'delete_published_posts' => false,
'delete_others_posts' => false,
'edit_private_posts' => false,
'edit_published_posts' => false,
'create_posts' => false,
];
}
return $args;
}, 0, 2);
