Come rimuovere il tipo di post predefinito dalla barra degli strumenti di amministrazione
Stiamo configurando un nuovo WordPress per utilizzare tipi di post personalizzati e vogliamo che i nostri editor accedano e vedano solo i tipi di post personalizzati, non il tipo di post predefinito 'post'. Siamo riusciti a rimuovere 'post' dal menu di amministrazione usando questo trucco, ma ciò lascia ancora il pulsante "+ Nuovo" nella barra degli strumenti di amministrazione, che contiene un'opzione post e per impostazione predefinita crea un post. Esiste un modo semplice e sicuro per rimuovere post dal pulsante nuovo della barra degli strumenti e/o nascondere il pulsante nuovo della barra degli strumenti?

Devi agganciarti a 3 diversi action hook per nascondere completamente il post type predefinito. Tuttavia, l'accesso diretto al post predefinito tramite URL rimane possibile. Quindi, iniziamo.
Il menu laterale
add_action( 'admin_menu', 'remove_default_post_type' );
function remove_default_post_type() {
remove_menu_page( 'edit.php' );
}
Il link + Nuovo > Post nella barra di amministrazione
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' );
}
Il link + Nuovo nella barra di amministrazione
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' );
Il widget Quick Draft nella bacheca
add_action( 'wp_dashboard_setup', 'remove_draft_widget', 999 );
function remove_draft_widget(){
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
}

Questo è il modo più pulito, anche se il pulsante Nuovo
nella barra di amministrazione punta ancora a post-new.php
- può essere disabilitato con del Javascript ad esempio $(document).on('click', '#wp-admin-bar-new-content', function(){ return false })

Sembra funzionare perfettamente, ma: "A colpo d'occhio" mostra ancora gli articoli (e non mostra i CPT in alcun caso!), proprio come la parte "Prossimi passi" dell'elemento dashboard "Benvenuto in WP" [che odio e chiudo comunque]. Anche "Attività" potrebbe mostrare ancora articoli, ma non dovrebbe se configurato accuratamente.

Una soluzione alternativa, ma simile a quella di Stefan e Rafa. Questo codice non genera errori e tieni presente che se navighi direttamente su /wp-admin/edit.php non potrai visualizzare l'elenco degli articoli (post type predefinito) né modificarli.
Nota che questo codice non disabilita effettivamente il post type predefinito, cioè i post esistenti rimarranno pubblicati e accessibili tramite URL pubblico. Disabilita efficacemente l'accesso al backend per il post type predefinito per tutti gli utenti.
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);

In linea di principio è possibile annullare la registrazione di tipi di post già registrati utilizzando unregister_post_type()
. Purtroppo questo non è possibile per i tipi di post _builtin
.
In alternativa è possibile modificare le capacità necessarie per modificare/creare/eliminare/... i post per un tipo di post specifico. Potresti utilizzare il filtro register_post_type_args
per modificare le capacità richieste per il tipo di post predefinito post
. Impostando tutte le capacità su false
si otterrà che nessuno avrà accesso al tipo di post predefinito. WordPress è abbastanza intelligente da nascondere automaticamente le voci di navigazione.
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);

Grazie, ho inserito questo codice in una funzione che veniva richiamata sull'evento 'init', ma sembra non avere alcun effetto sulla mia interfaccia utente. Sto utilizzando l'evento sbagliato?

È troppo tardi. WordPress registra tutti i post type _builtin
nell'azione init
ma con una priorità di 0
.
Il codice sopra sta solo registrando un filtro, non devi inserirlo all'interno di un'altra azione/filtro, puoi semplicemente scriverlo direttamente nel file functions.php
del tuo tema, ad esempio.

+1. Il problema è che genera 3 notice. "Notice: Undefined offset: 0 in /var/www/html/wp-includes/capabilities.php on line 70". Non sono riuscito a eliminarle.

La soluzione di Stefan è ottima, ma se attivi il debug puoi vedere: Undefined offset: 0 in wp-includes/capabilities.php on line 62 inoltre manca un ; dopo return $args
Il codice completo dovrebbe essere:
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);
