Come rimuovere il pulsante "+Aggiungi Categoria" dal metabox Categorie?

10 mar 2017, 17:00:15
Visualizzazioni: 5.46K
Voti: 1

Vorrei disabilitare il pulsante "+Aggiungi Categoria" sotto il metabox Categorie in modo che chi crea un articolo possa scegliere solo tra le categorie esistenti.

  1. Ho verificato un altro post che pone esattamente la stessa domanda, Come rimuovere il link "+ Aggiungi nuova categoria" da un metabox Categorie Ma la risposta accettata non ha senso perché fa riferimento alle righe 345-367, che non sono rilevanti (forse a causa degli aggiornamenti di WP, le cose potrebbero essere cambiate). Quindi sono confuso.

  2. Ho installato il plugin 'User Role Editor' e rimosso la capacità 'manage_categories' per l'utente 'Editor', il che ha funzionato. Ma vorrei rimuoverlo per TUTTI gli utenti, inclusi amministratori e super amministratori. Quindi ho provato a modificare il functions.php del tema così:

    add_action( 'add_meta_boxes', 'isa_remove_categories_meta_box' )  
    function isa_remove_categories_meta_box() {  
    
    remove_meta_box( 'categorydiv', 'post', 'side' ); // rimuove l'intero box Categorie  
    
    }  
    

    Tuttavia, questo fa scomparire completamente il box Categorie. Esiste qualcosa che posso usare per sostituire 'categorydiv' per far scomparire solo il pulsante '+Aggiungi nuova categoria'?

Oppure, qualcuno può indicarmi cosa intendeva la risposta accettata nell'altro post con le righe 345-367? Potrei provare anche quello.

4
Commenti

come menzionato dall'OP nella domanda a cui ti colleghi, io uso "hack CSS per nasconderlo" quando voglio questo risultato.

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 mar 2017 17:05:10

Potresti per favore approfondire come procedere con gli hack CSS? Quali file CSS dovrei modificare?

Ashwin Baskaran Ashwin Baskaran
10 mar 2017 17:11:16

la risposta a quell'altra domanda menziona anche "Attualmente non è disponibile un hook per filtrare l'output". Circa 10 giorni fa ho aperto un ticket su Trac e richiesto che un tale filtro venga aggiunto (ammettiamo, per un motivo diverso). Non sembra che il team di core abbia nemmeno esaminato quel ticket, ma forse se tu (e altri) commentaste dicendo che sarebbe utile anche per voi, potrebbero agire.

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 mar 2017 17:12:48

Nel tuo plugin/tema aggiungi il seguente #category-adder { display: none ;} a qualsiasi CSS che carichi su admin_enqueue_scripts

Paul 'Sparrow Hawk' Biron Paul 'Sparrow Hawk' Biron
10 mar 2017 17:21:05
Tutte le risposte alla domanda 3
1

Se stai creando la tua tassonomia personalizzata, puoi impostare le capacità quando registri la tassonomia. Ad esempio...

<?php
    register_taxonomy(
        'members_tax',
        'post',
        array(
            'label'             => __( 'Membri' ),
            'hierarchical'      => true,
            'rewrite'           => array( 'slug' => 'members-tax' ),
            'capabilities'      => array(
                'assign_terms' => 'manage_options',
                'edit_terms'   => 'god',
                'manage_terms' => 'god',
            ),
            'show_in_nav_menus' => false,
        )
    );

Se vuoi che solo l'amministratore possa aggiungere o modificare, cambia 'god' in 'administrator'. Questo rimuoverà la voce "Aggiungi nuova categoria Membri" dal metabox nella pagina di creazione nuovi articoli e rimuoverà il link nel menu sotto Articoli.

Questo codice proviene da questo gist https://gist.github.com/ChrisFlannagan/4cd3bfd0e853cda3d3f7898c59428ac2

7 ago 2019 14:23:45
Commenti

Follow up. Se vuoi che qualsiasi utente possa assegnare i termini, rimuovi la riga 'assign_terms' => 'manage_options',

CDToad CDToad
7 ago 2019 14:26:01
0

Ho installato il plugin 'User Role Editor' e ho rimosso la capacità 'manage_categories' per il ruolo 'Editor', il che ha funzionato. Ma vorrei rimuoverla per TUTTI gli utenti inclusi admin e superadmin.

Se rimuovere la capacità 'manage_categories' dal ruolo editor fornisce la funzionalità che desideri, puoi rimuovere la capacità 'manage_categories' da tutti i ruoli utente abbastanza facilmente, sia utilizzando un plugin esistente, sia scrivendo un nuovo plugin che all'attivazione rimuove la capacità da tutti i ruoli utente. Ecco il codice necessario per rimuovere la capacità da ogni ruolo (in realtà, imposta esplicitamente la capacità a false).

register_activation_hook( __FILE__, 'wpse_259647_remove_manage_categories_cap' );
function wpse_259647_remove_manage_categories_cap() {
  $roles = wp_roles();
  foreach( $roles->role_names as $slug => $name ) {
    $role = get_role( $slug );
    $role->add_cap( 'manage_categories', false );
  }
}

Questo però non rimuoverà la capacità dai "super admin" poiché tecnicamente i "super admin" non sono un ruolo o una capacità.

Se vuoi revocare esplicitamente la capacità manage_categories a tutti gli utenti, puoi farlo anche così.

register_activation_hook( __FILE__, 'wpse_259647_remove_manage_categories_cap' );
function wpse_259647_remove_manage_categories_cap() {
  $users = get_users();
  foreach( $users as $user ) {
    $user->add_cap( 'manage_categories', false );
  }
}

Questo potrebbe comunque non rimuovere la capacità dai "super admin", perché WordPress li gestisce in modo diverso dagli altri utenti.

10 mar 2017 18:50:21
0

La metabox della categoria viene impostata quando la categoria viene registrata con la funzione register_taxonomy. Il comportamento predefinito di questa funzione è impostare il callback della metabox (meta_box_cb) su una funzione di WordPress chiamata post_categories_meta_box. È questa funzione che renderizza il pulsante "+Aggiungi Categoria". Sfortunatamente, questa metabox non consente di nascondere selettivamente questo pulsante. Come hanno sottolineato altri risponditori, nasconderà quel pulsante in base alla capacità edit_terms della tassonomia, quindi puoi nasconderlo efficacemente limitando chi ha questa capacità. Tuttavia, questo non funziona se, come me, vuoi nascondere questo pulsante senza limitare le capacità.

Per fare ciò è necessario fornire il proprio meta_box_cb. Ho fatto questo semplicemente copiando post_categories_meta_box e cancellando quel pulsante.

La mia funzione personalizzata:

function custom_post_categories_meta_box_without_add_new( $post, $box ) {
    $defaults = array( 'taxonomy' => 'category' );
    if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
        $args = array();
    } else {
        $args = $box['args'];
    }
    $parsed_args = wp_parse_args( $args, $defaults );
    $tax_name    = esc_attr( $parsed_args['taxonomy'] );
    $taxonomy    = get_taxonomy( $parsed_args['taxonomy'] );
    ?>
    <div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
        <ul id="<?php echo $tax_name; ?>-tabs" class="category-tabs">
            <li class="tabs"><a href="#<?php echo $tax_name; ?>-all"><?php echo $taxonomy->labels->all_items; ?></a></li>
            <li class="hide-if-no-js"><a href="#<?php echo $tax_name; ?>-pop"><?php echo esc_html( $taxonomy->labels->most_used ); ?></a></li>
        </ul>
 
        <div id="<?php echo $tax_name; ?>-pop" class="tabs-panel" style="display: none;">
            <ul id="<?php echo $tax_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
                <?php $popular_ids = wp_popular_terms_checklist( $tax_name ); ?>
            </ul>
        </div>
 
        <div id="<?php echo $tax_name; ?>-all" class="tabs-panel">
            <?php
            $name = ( 'category' === $tax_name ) ? 'post_category' : 'tax_input[' . $tax_name . ']';
            // Consente l'invio di un set di termini vuoto. 0 è un ID di termine non valido e verrà ignorato dai controlli empty().
            echo "<input type='hidden' name='{$name}[]' value='0' />";
            ?>
            <ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
                <?php
                wp_terms_checklist(
                    $post->ID,
                    array(
                        'taxonomy'     => $tax_name,
                        'popular_cats' => $popular_ids,
                    )
                );
                ?>
            </ul>
        </div>
    </div>
    <?php
}

(Spero di poter includere qui la mia funzione personalizzata che, come ho detto, è in gran parte copiata da WordPress. Se ci sono ragioni legali per cui non posso farlo, per favore fatemelo sapere.)

Applicato alla mia tassonomia personalizzata

register_taxonomy(
    "my_custom_taxonomy",
    "my_custom_type",
    array(
        ...
        'hierarchical'      => true,
        'meta_box_cb' => 'custom_post_categories_meta_box_without_add_new'
    )
);

Lo svantaggio di questo è che, a differenza del predefinito, il tuo meta_box_cb non cambierà se WordPress aggiorna il suo stile.

Nota che questo funziona solo se stai registrando manualmente le tue tassonomie. Se stai usando un plugin, potrebbe non permetterti di configurare il meta_box_cb.

5 nov 2020 22:24:44