Come rimuovere il tipo di post predefinito dalla barra degli strumenti di amministrazione

5 feb 2018, 05:30:30
Visualizzazioni: 21.2K
Voti: 11

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?

2
Commenti

Se rimuovi le capacità relative ai post dal ruolo di Editor (o qualunque ruolo tu stia usando) queste opzioni non dovrebbero più apparire.

Jacob Peattie Jacob Peattie
5 feb 2018 05:38:30

Se il post type non si cancella dalla registrazione e se la funzione "register_post_type" non si trova nel file functions.php, controlla se la registrazione è salvata in un "must use plugin". Come promemoria, inserisco questo commento all'inizio del mio functions.php "/ se qualcosa è bloccato, controlla nei must use plugins!!! /"

Dave Miller Dave Miller
22 apr 2023 15:53:20
Tutte le risposte alla domanda 4
2
17

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' );
}
5 feb 2018 16:21:21
Commenti

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 Mina
27 lug 2019 13:39:46

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 user3445853
25 mar 2021 22:55:42
0
14

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);
4 gen 2020 09:03:45
4

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);
5 feb 2018 16:42:35
Commenti

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 Paul Keister
5 feb 2018 19:48:37

È 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 Stefan
5 feb 2018 20:47:33

+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 noway
17 nov 2019 13:37:41

Nota che questo non rimuove le tassonomie "category" e "post_tag", quindi la voce di menu "Articoli" rimane (sebbene non ti permetta di visualizzare o modificare gli articoli stessi).

W Biggs W Biggs
22 lug 2020 18:31:32
1

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);
18 mar 2019 12:20:48
Commenti

current_user_can genera un errore. Non è ancora definito a questo stadio.

noway noway
17 nov 2019 13:59:09