web-dev-qa-db-fra.com

Multisite - Protéger les catégories de la suppression?

UPDATE: Pour tous ceux qui suivent ce fil, la solution de plugin fonctionne, mais semble avoir un problème avec mon format multisite. J'ai maintenant testé sur 3 installations individuelles et sur 3 multisites. Sur les multisites, le marqueur rouge "non supprimable" apparaît en regard des catégories du tableau, mais elles peuvent être supprimées. Cela pourrait bien être dû à un problème avec mon installation particulière, car cela fonctionne correctement avec les sous-sites nouvellement créés.

Message original: Travailler sur un multisite et aimerait trouver un moyen de protéger deux ou trois catégories par défaut contre la suppression par les propriétaires de sites.

J'utilise déjà le plug-in "members" pour définir les rôles d'administrateur, mais la seule option consiste à "gérer les catégories". Si je désactive cette fonctionnalité, ils ne peuvent pas supprimer de catégories, mais ils ne peuvent pas en créer de nouvelles.

Tout moyen de permettre de nouvelles catégories mais de ne pas en supprimer quelques-unes?

5
speedypancake

Prolonger la réponse de @ Roman.


Les éléments suivants ont été développés et testés dans un environnement multisite - installations locales et en direct WP.


En regardant le source de wp_delete_term , il y a des hooks qui sont déclenchés lorsque la fonction est appelée.

Je ne suis pas sûr que ce soit la meilleure façon de procéder, mais cela fonctionne.

add_action( 'delete_term_taxonomy', 'wpse_70758_del_tax', 10, 1 );

function wpse_70758_del_tax( $tt_id )
{
    $undeletable = array( 'undeletable', 'uncategorized', 'other-cat' );
    $term = get_term_by( 'id', $tt_id, 'category' );

    if( in_array( $term->slug, $undeletable ) ) 
        wp_die( 'cant delete' );
}

Ainsi, en essayant de supprimer la catégorie "Undeletable" (en utilisant le menu Édition rapide /), cela produit:

 can't delete category 

Comme la suppression se fait via Ajax, nous interrompons son exécution et WP envoie ce message d'erreur (la modification de ce texte appelle une question distincte).

Si nous utilisons le " Actions en bloc ", wp_die() est imprimé à l'écran.


Mais ce n'est pas tout. Avant la suppression proprement dite (crochet d’action delete_term_taxonomy), les catégories enfants de celle que nous bloquons sont "non parentes", ligne # 1772 :

// Mettre à jour les enfants pour qu'ils pointent vers le nouveau parent

Il y a un autre crochet où cette action se produit et nous pouvons insérer une pause plus tôt pour empêcher le "non-apparenté":

add_action( 'edit_term_taxonomies', 'wpse_70758_del_child_tax', 10, 1 );

function wpse_70758_del_child_tax( $arr_ids )
{
    $undeletable = array( 'undeletable', 'uncategorized', 'other-cat' );
    foreach( $arr_ids as $id )
    {
        $term   = get_term_by( 'id', $id, 'category' );
        $parent = get_term_by( 'id', $term->parent, 'category' );

        if( in_array( $parent->slug, $undeletable ) ) 
            wp_die( 'cant delete' );        
    }
}

Utilisez ceci dans un Must Use Plugin et il sera automatiquement actif sur le réseau.


La capture instantanée ci-dessus a une colonne d'identifiant personnalisé dans la liste des catégories. Cela se fait avec le code suivant (un ici avec une colonne supplémentaire marquant les catégories "non supprimables" avec une grosse puce rouge):

add_filter( 'manage_edit-category_columns', 'wpse_70758_cat_edit_columns' );
add_filter( 'manage_category_custom_column', 'wpse_70758_cat_custom_columns', 10, 3 );

function wpse_70758_cat_edit_columns( $columns )
{
    $columns['tt_id'] = 'ID';   
    $columns['undeletable'] = 'Undeletable';   
    return $columns;
}   

function wpse_70758_cat_custom_columns( $value, $name, $tt_id )
{
    if( 'tt_id' == $name ) 
        echo $tt_id;

    $term = get_term_by( 'id', $tt_id, 'category' );
    $undeletable = array( 'undeletable', 'uncategorized', 'other-cat' );

    if( 'undeletable' == $name && in_array( $term->slug, $undeletable ) )
        echo '<span style="color:#f00;font-size:5em;line-height:.5em">&#149;</span>';
}

Plugin de travail complet: https://Gist.github.com/4110831

5
brasofilo

Peut-être pouvez-vous vous connecter à la fonction wp_delete_term avec l’action "delete_term" (voir info à: http://adambrown.info/p/wp_hooks/hook/delete_term?version=3.4&file=wp-includes/taxonomy.php ) et si ce terme est supprimé, vous pouvez l'insérer à nouveau ...

ce n'est pas une solution si propre et les utilisateurs sembleraient un peu surpris que le terme reste encore après avoir cliqué sur "supprimer le lien" mais il peut faire le travail, en fait je pense que ce n'est que la solution ...

1
Roman