Je me demandais s'il y avait un moyen d'empêcher l'ajout de nouvelles catégories dans une taxonomie, essentiellement en "verrouillant" la taxonomie.
J'inscris par programme une taxonomie que je remplis avec des termes via functions.php et que j'aimerais bien, afin que vous ne puissiez plus rien y ajouter.
Voici comment ma solution a fini par paraître et elle fonctionne très bien! Merci à tous ceux qui ont aidé. Upvotes partout sur votre visage!
// some stuff happens before this...
$labels = array(
'name' => _x( 'Attendees', 'taxonomy general name' ),
'singular_name' => _x( 'Attendee', 'taxonomy singular name' ),
'search_items' => __( 'Search Attendees' ),
'all_items' => __( 'All Attendees' ),
'edit_item' => __( 'Edit Attendee' ),
'update_item' => __( 'Update Attendee' ),
'add_new_item' => __( 'Add New Attendee' ),
'new_item_name' => __( 'New Attendee Name' ),
'menu_name' => __( 'Attendees' )
);
$rewrite = array(
'slug' => 'attendee'
);
$capabilities = array(
'manage_terms' => 'nobody',
'edit_terms' => 'nobody',
'delete_terms' => 'nobody',
'assign_terms' => 'nobody'
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => 'attendee',
'rewrite' => $rewrite,
'capabilities' => $capabilities
);
register_taxonomy('attendees', 'meetings', $args);
}
add_action( 'init', 'todo_create_taxonomies', 1);
function todo_register_attendees() {
$users = get_users();
foreach ( $users as $user ) {
wp_insert_term( $user->display_name, 'attendees', array('description'=> $user->display_name, 'slug' => $user->user_nicename) );
$lockdown[] = $user->user_nicename;
}
$terms = get_terms('attendees', array('get' => 'all') );
foreach ($terms as $term) {
if ( !in_array($term->slug, $lockdown) ) {
wp_delete_term( $term->term_id, 'attendees' );
$message = new WP_Error('force_terms', __('Only Registered Users can be Attendees, ' . $term->name . ' has been deleted.'));
if ( is_wp_error($message) ) { ?>
<div id="aphid-error-<?php echo $message->get_error_code(); ?>" class="error aphid-error">
<p><strong><?php echo $message->get_error_message(); ?></strong></p>
</div>
<?php }
}
}
}
add_action( 'admin_notices', 'todo_register_attendees' );
Premièrement, je veux que celui-ci soit clair: tout est untaxonomie. Les balises sont non hiérarchiques, les catégories hiérarchiques et les deux sont des taxonomies intégrées. Même chose pour par exemple. formats de publication (côté, chat, etc.). C'est le même concept qu'avec post-types (post, page, pièce jointe, nav_menu_item, etc. ne sont que des types de post construits).
Tout ce qui se trouve dans l'une de ces taxonomies est unTerm. Pour par exemple. (à l'intérieur des formats de publication) "apart", "quote", "audio".
register_taxonomy()
- vous permet d'enregistrer une taxonomie à partir de ex. dans votre fichier functions.php
.wp_insert_term()
- vous permet d'enregistrer un termewp_delete_term()
- vous permet de supprimer un termeget_terms()
- permet de récupérer tous les termes à partir d'un taxonomie Ce qui suit concerne votre fichier functions.php
. Cela déclenche à chaque demande de page. Vous pouvez l’améliorer - en utilisant l’API Transients - pour déclencher des horodatages donnés (par exemple, deux fois par jour, toutes les heures, etc.).
function wpse14350_cleanup_taxonomy_terms()
{
// Define your terms inside this array
$predefined_terms = array(
'term A'
,'term B'
,'term C'
);
// Name your taxonomy here
$predefined_taxonomy = 'category';
$all_terms_inside_tax = get_terms(
$predefined_taxonomy
,array(
'hide_empty' => false
,'taxonomy' => $predefined_taxonomy
)
);
foreach ( $all_terms_inside_tax as $term )
{
if ( ! in_array( $term->name, $predefined_terms ) )
wp_delete_term( $term->term_id, $predefined_taxonomy );
}
}
add_action( 'init', 'wpse14350_cleanup_taxonomy_terms' );
Si vous ajoutez des termes à la taxonomie indépendamment et que vous souhaitez masquer l'interface utilisateur, pourquoi ne pas simplement utiliser deux des arguments pris en charge par register_taxonomy
.
capacités
(array) (facultatif) Un tableau des capacités pour cette taxonomie.Par défaut: aucun
'manage_terms' - 'manage_categories'
'edit_terms' - 'manage_categories'
'delete_terms' - 'manage_categories'
'assign_terms' - 'edit_posts'show_ui
(booléen) (facultatif) Indique s'il faut générer une interface utilisateur par défaut pour gérer cette taxonomie.Valeur par défaut: si non défini, valeur par défaut de l'argument public
Si vous définissez les fonctionnalités sur des fonctionnalités inexistantes, vous empêcherez essentiellement les utilisateurs de les modifier, de les créer ou de les supprimer. Si vous devez pouvoir les affecter aux publications de la manière traditionnelle (c.-à-d. Via l'éditeur de publication), utilisez simplement une capacité réelle pour la valeur assign_terms
.
Exemple:
$args = array(
....
'capabilities' => array(
'manage_terms' => 'foobar',
'edit_terms' => 'foobar',
'delete_terms' => 'foobar',
'assign_terms' => 'foobar' // <-- change this one to a desired cap if you need to be able to assign them(you could use manage_options for admins only)
),
);
Définissez show_ui
sur false pour empêcher l'affichage des éléments de menu pour la taxonomie.
J'espère que cela pourra aider...