Création d'un terme de taxonomie non amovible

4

Existe-t-il un moyen, sans modifier le noyau, de créer un terme pour une taxonomie personnalisée non supprimable par programmation?

"Non classé" est un exemple, mais dans mon cas, il ne doit pas nécessairement être le terme par défaut si un message n'est pas associé à un message, mais oui, ce sera un terme par défaut existant toujours dans cette taxonomie personnalisée.

EDIT:

Par non-amovible, je veux dire principalement sur le front-end. Autrement dit, la case à cocher supprimer le lien et l'action en bloc ne s'affichera pas, tout comme "Non classé".

    
posée karbuncle 22.08.2014 - 16:45

3 réponses

3

Mettre à jour

En effet, il existe un moyen de définir un terme par taxonomie comme terme par défaut, ce qui le rend non supprimable à partir de l'interface graphique d'administration.

WP_Terms_List_Table recherche une option get_option( 'default_' . $this->screen->taxonomy ) .

Donc, si vous avez une taxonomie personnalisée appelée genre , vous devez définir une option default_genre avec l'identifiant du terme que vous souhaitez protéger contre la suppression via l'interface graphique d'administration:

$taxonomy = 'genre';
$key = get_option( 'default_' . $taxonomy );
$term = get_term_by( 'name', 'Your default genre term', $taxonomy );
if ( empty( $key ) && $term )
     update_option( $key, $term->term_id );

tl; dr Dans ma première réponse, j'ai raté cette fonctionnalité. Mais la description de la gestion des capacités est toujours valide.

première réponse

À ce stade, ce n'est pas possible. En effet, dans WP_Terms_List_Table , tous les contrôles de capacité sont effectués comme suit:

current_user_can( $tax->cap->delete_terms );

Cela signifie que toutes les vérifications de vue sont, si l'utilisateur a le privilège de supprimer les termes de cette catégorie dans son ensemble. Ce serait possible si l'appel de fonction ressemblait à ça:

current_user_can( $tax->cap->delete_terms, $tag )

$tag serait le terme objet.

Dans ce cas, vous pouvez facilement filtrer map_meta_cap (où la vérification de capacité et le second paramètre sont passés) pour révoquer le privilège de supprimer un terme spécifique.

En passant, il s’agit du comportement par défaut de WP_Posts_List_Table . Il est donc possible de vérifier les capacités de chaque publication.

Pour l'instant, la seule façon dont je vois les choses est d'enregistrer une taxonomie sans les éléments d'interface utilisateur d'administration par défaut et de créer une page d'administrateur personnalisée pour gérer les termes en fonction de vos besoins.

    
réponse donnée David 22.08.2014 - 18:05
1

Je ne sais pas si vous pouvez arrêter de supprimer un terme, mais vous pouvez vous assurer qu'il existe toujours. Il suffit de jeter ceci dans votre functions.php (ou plugin):

if ( !term_exists('locked-term', 'category' ) )
  wp_insert_term('Locked Term', 'category', array('slug' => 'locked-term'));

Donc, pour être clair, techniquement, ils peuvent supprimer le terme, mais lors du prochain rechargement du site, le terme sera restauré. Ceci verrouille efficacement le terme.

    
réponse donnée Jason 22.08.2014 - 17:23
1

Pour le faire simplement de manière frontale, vous pouvez supprimer l’action de suppression à l’aide d’un filtre et (comme il ne semble pas y avoir de filtre pour cela), désactivez & masquer la case à l'aide de jquery:

define( 'PROTECTED_TERM_ID', 2 );
define( 'CUSTOM_TAX', 'genres' );
function wpse158784_custom_tax_row_actions( $actions, $tag ) {
    if ( $tag->term_id == PROTECTED_TERM_ID ) unset( $actions['delete'] );
    return $actions;
}
function wpse158784_admin_footer_edit_tags_php() {
    if ( ! isset( $_GET['taxonomy'] ) || $_GET['taxonomy'] != CUSTOM_TAX ) return;
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery('input#cb-select-<?php echo PROTECTED_TERM_ID; ?>').prop('disabled', true).hide();
    });
    </script>
    <?php
}
if ( is_admin() ) {
    add_filter( CUSTOM_TAX . '_row_actions', 'wpse158784_custom_tax_row_actions', 10, 2 );
    add_action( 'admin_footer-edit-tags.php', 'wpse158784_admin_footer_edit_tags_php' );
}
    
réponse donnée bonger 22.08.2014 - 20:09

Lire d'autres questions sur les étiquettes