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 })
Mina
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.
user3445853
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?
Paul Keister
È 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.
Stefan
+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.
noway
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);