web-dev-qa-db-fra.com

Création d'un terme de taxonomie non amovible

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

"Non catégorisé" est un exemple, mais dans mon cas, il n'est pas nécessaire que ce soit le terme par défaut si un article n'est pas associé à un terme, mais oui, il s'agira toujours d'un terme par défaut dans cette taxonomie personnalisée.

MODIFIER:

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

4
karbuncle

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 ).

Ainsi, si vous avez une taxonomie personnalisée appelée genre, vous devez définir une option default_genre avec l'identificateur de terme 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, toutes les vérifications de capacité sont effectuées 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 globale. 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 dans WP_Posts_List_Table. Il est donc possible de vérifier les capacités de chaque publication.

À l'heure actuelle, 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'administration personnalisée pour gérer les termes en fonction de vos besoins.

3
David

Pour le faire simplement de manière frontale, vous pouvez supprimer l'action de suppression en utilisant un filtre et (comme il ne semble pas y avoir de filtre pour cela), désactivez et masquez la case à cocher en utilisant 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' );
}
2
bonger

Je ne sais pas si vous pouvezarrêterun terme d'être supprimé, 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, ils peuvent techniquement supprimer le terme, mais lors du prochain rechargement du site, le terme sera restauré. Ceci verrouille efficacement le terme.

1
Jason