web-dev-qa-db-fra.com

WordPress: Désactiver "Ajouter un nouveau" sur le type de publication personnalisée

Existe-t-il un moyen de désactiver l'option permettant d'ajouter un nouveau message sous un type de message personnalisé dans WordPress (3.0)? J'ai examiné les étiquettes et les arguments, mais je ne trouve rien qui puisse ressembler à une telle fonctionnalité.

55
Staffan Estberg

Crédit complet à Seamus Leahy

Il existe une méta fonctionnalité create_posts qui est documentée ici et est utilisée par WordPress à vérifier avant d'insérer les différents boutons et liens "Ajouter un nouveau". Dans votre déclaration de type de publication personnalisée, ajoutez capabilities (à ne pas confondre avec cap), puis définissez-le sur false comme ci-dessous.

register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => 'do_not_allow', // false < WP 4.5, credit @Ewout
  ),
  'map_meta_cap' => true, // Set to `false`, if users are not allowed to edit/delete existing posts
));

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

Puis-je vous demander pourquoi vous voulez faire cela?

J'aurais d'abord suggéré de changer les fonctionnalités de votre type de publication personnalisé, mais je ne pense pas qu'il en existe qui limitent le nombre de personnes pouvant ajouter des publications, mais uniquement qui peut éditer ou les publier .

Cela semble un peu sale, mais vous pouvez essayer de désélectionner l'élément dans le $submenu global;

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');
68
TheDeadMedic

Il existe une méta fonctionnalité create_posts qui n'est pas documentée mais qui est utilisée par WordPress pour vérifier avant d'insérer les différents boutons et liens "Ajouter un nouveau". Dans votre déclaration de type de publication personnalisée, ajoutez capabilities (à ne pas confondre avec cap), puis définissez-la 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
));
104
Seamus Leahy

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

La solution mentionnée @PavelChernov repose sur get_post_type() qui ne fonctionnera que s’il existe déjà une publication dans la liste. S'il n'y a pas de messages, la fonction ne renverra rien et le lien "Ajouter un nouveau" 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 un accès direct si quelqu'un tape l'URL lui-même: https://wordpress.stackexchange.com/a/58292/6003

9
Kirk Beard

Dans wordpress et pour tous les types de publication, il existe la possibilité create_posts. Cette fonctionnalité est utilisée dans plusieurs fichiers de base:

  1. wp-admin\edit-form-advanced.php
  2. wp-admin\edit.php
  3. wp-admin\includes\post.php
  4. wp-admin\menu.php
  5. wp-admin\post-new.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 ce fichier, vous devez le faire par rôle et par type de message . J'utilise l'excellent plugin " User Role Editor " pour gérer les fonctionnalités par rôle.

Mais qu'en est-il de la capacité create_posts? Eh bien, cette fonctionnalité n’est pas mappée et create_posts est égale à create_posts. Nous devons donc résoudre ce problème et mapper la capacité par type de publication.

Ainsi, vous pouvez ajouter ce morceau de code dans votre functions.php et le gérer. 

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

Donc, ici, nous ne masquons ni ne supprimons les éléments de menu ... nous supprimons ici la capacité pour les utilisateurs (y compris les requêtes xmlrpc).

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

7
3pepe3
add_action("load-post-new.php", 'block_post');

function block_post()
{
    if($_GET["post_type"] == "custom_type") 
        wp_redirect("edit.php?post_type=custom_type");
}
5
andrea

Réseaux WordPress: J'ai trouvé que la réponse de Seamus Leahy ne fonctionne pas Si vous êtes connecté en tant que super administrateur du réseau, peu importe si l'utilisateur n'a pas la capacité, mappée ou autre, lorsque current_user_can ($ cap) est appelé par le CMS. En creusant dans le noyau, j'ai trouvé que vous pouvez 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
));

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

4
Will Craig

@ Staffan Estberg,

C’est le meilleur moyen de masquer le bouton Ajouter un nouveau ou Créer un nouveau dans les postypes personnalisés.

'capability_type'    => 'post',

        'capabilities'       => array( 'create_posts' => false ),       

        'map_meta_cap'       => true,

Il désactive la création de nouvelles publications dans des types de publications personnalisées des deux côtés du menu admin et au-dessus de la liste des publications.

3
clap

Désactive la création d'un nouveau message pour les types de message enregistrés: (exemple pour post et page)

function disable_create_newpost() {
    global $wp_post_types;
    $wp_post_types['post']->cap->create_posts = 'do_not_allow';
    //$wp_post_types['page']->cap->create_posts = 'do_not_allow';
    //$wp_post_types['my-post-type']->cap->create_posts = 'do_not_allow';
}
add_action('init','disable_create_newpost');
2
l2aelba
register_post_type( 'custom_post_type_name', array(
  'capability_type' => 'post',
  'capabilities' => array(
    'create_posts' => false, // Removes support for the "Add New" function 
  ),
  'map_meta_cap' => true, // Set to `false`, if users are not allowed to edit/delete existing posts
));

J'espère que cela vous aidera. Merci beaucoup !

1
Mehul Soni

J'ai trouvé ce moyen le plus simple pour cela. Ajoutez simplement ce code dans le function.php du thème.

function hd_add_buttons() {
    global $pagenow;
    if (is_admin()) {
        if ($_GET['post_type'] == 'custom_post_type_name') {
            echo '<style>.add-new-h2{display: none !important;}</style>';
        }
    }
}
add_action('admin_head', 'hd_add_buttons');
0
Umair Hamid