75 votes

WordPress : Désactiver l'option "Ajouter un nouveau" sur les types d'articles personnalisés

Existe-t-il un moyen de désactiver l'option d'ajout d'un nouvel article sous un Custom Post Type dans WordPress (3.0) ? J'ai cherché dans les étiquettes et les arguments mais je n'ai rien trouvé qui ressemble à une telle fonctionnalité.

130voto

Seamus Leahy Points 456

Il existe une méta-capacité create_posts c'est-à-dire documenté ici et est utilisé par WordPress pour vérifier avant d'insérer les différents boutons et liens "Ajouter un nouveau". Dans la déclaration de votre type d'article personnalisé, ajoutez capabilities (à ne pas confondre avec cap ) et de le régler sur false comme ci-dessous.

register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => false, // Removes support for the "Add New" function ( use 'do_not_allow' instead of false for multisite set ups )
  ),
  'map_meta_cap' => true, // Set to `false`, if users are not allowed to edit/delete existing posts
));

Vous voudrez probablement définir map_meta_cap a true également. Sans cela, vous ne pourrez plus accéder aux pages d'édition des articles.

13voto

Kirk Beard Points 1794

Les combinaisons des solutions ci-dessus permettent de masquer les liens (bien que quelqu'un puisse facilement taper l'URL directement).

En solution mentionnée @3pepe3 s'appuie sur get_post_type() ce qui ne fonctionnera que s'il y a déjà un message dans la liste. S'il n'y a pas d'articles, la fonction ne renverra rien et le lien "Ajouter un nouvel article" sera disponible. Une méthode alternative :

function disable_new_posts() {
    // Hide sidebar link
    global $submenu;
    unset($submenu['edit.php?post_type=CUSTOM_POST_TYPE'][10]);

    // Hide link on listing page
    if (isset($_GET['post_type']) && $_GET['post_type'] == 'CUSTOM_POST_TYPE') {
        echo '<style type="text/css">
        #favorite-actions, .add-new-h2, .tablenav { display:none; }
        </style>';
    }
}
add_action('admin_menu', 'disable_new_posts');

EDIT : Pour empêcher l'accès direct si quelqu'un tape l'URL lui-même : https://wordpress.stackexchange.com/a/58292/6003

9voto

TheDeadMedic Points 6943

Puis-je vous demander pourquoi vous voulez faire cela ?

J'aurais d'abord suggéré de modifier les capacités de votre type d'article personnalisé, mais je ne pense pas qu'il y en ait un qui limite le nombre de personnes qui peuvent le faire. ajouter les messages, mais seulement qui peut les modifier ou les publier les.

Cela semble un peu sale, mais vous pourriez essayer de désactiver l'élément dans le fichier $submenu globale ;

function hide_add_new_custom_type()
{
    global $submenu;
    // replace my_type with the name of your post type
    unset($submenu['edit.php?post_type=my_type'][10]);
}
add_action('admin_menu', 'hide_add_new_custom_type');

8voto

Will Craig Points 158

Réseaux WordPress : J'ai constaté que Réponse de Seamus Leahy ne fonctionne pas si vous êtes connecté en tant que super administrateur du réseau, cela n'a pas d'importance si l'utilisateur n'a pas la capacité, mappée ou non, lorsque current_user_can($cap) est appelé par le CMS. En creusant dans le noyau, j'ai découvert qu'il était possible de faire ce qui suit.

register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => 'do_not_allow', // Removes support for the "Add New" function, including Super Admin's
  ),
  'map_meta_cap' => true, // Set to false, if users are not allowed to edit/delete existing posts
));

En réponse acceptée masque l'élément de menu, mais la page reste accessible.

7voto

3pepe3 Points 28

Dans wordpress et pour tous les types d'articles, il existe la capacité create_posts. Cette fonction est utilisée dans plusieurs fichiers centraux :

  1. wp-admin \edit -formulaire-avancé.php
  2. wp-admin \edit.php
  3. wp-admin \includes\post.php
  4. wp-admin \menu.php
  5. wp-admin \post -nouveau.php
  6. wp-admin \press -this.php
  7. wp-includes \admin -bar.php
  8. wp-includes \class -wp-xmlrpc-server.php
  9. wp-includes \post.php

Donc si vous voulez vraiment désactiver cette fonctionnalité, vous devez le faire par rôle et par type de message. J'utilise l'excellent plugin " Editeur de rôle d'utilisateur "pour gérer les capacités par rôle.

Mais qu'en est-il de la capacité create_posts ? Cette capacité n'est pas mappée et create_posts est égal à create_posts. Nous devrions donc corriger cela et mapper la capacité par type de message.

Vous pouvez donc ajouter ce bout de code dans votre fichier functions.php et gérer cette capacité.

function fix_capability_create(){
    $post_types = get_post_types( array(),'objects' );
    foreach ( $post_types as $post_type ) {
        $cap = "create_".$post_type->name;
        $post_type->cap->create_posts = $cap;
        map_meta_cap( $cap, 1); 
    }
}
add_action( 'init', 'fix_capability_create',100);

Il ne s'agit donc pas ici de cacher ou de supprimer des éléments de menu, mais de supprimer les possibilités offertes aux utilisateurs (y compris les requêtes xmlrpc).

L'action était init et non admin_init ou autre car init à la priorité 100 empêche l'affichage de "add new" sur la barre d'administration, sidebar, etc (dans toute l'interface de wp).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X