WordPress: Desactivar "Añadir Nuevo" en el Tipo de Mensaje Personalizado


¿Hay alguna manera de deshabilitar la opción de agregar un nuevo post bajo un Tipo de Post Personalizado en WordPress (3.0)? He mirado en las etiquetas y argumentos, pero no puedo encontrar nada que se asemeje a una característica de este tipo.

 55
Author: Evan, 2010-07-13

9 answers

Crédito completo a Seamus Leahy

Hay una capacidad de meta create_posts que no está documentada, pero es utilizada por WordPress para verificar antes de insertar los varios botones y enlaces de 'Agregar nuevo'. En su declaración de tipo post personalizado, agregue capabilities (no debe confundirse con cap) y luego configúrelo a false como se muestra a continuación.

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

¿Puedo preguntar por qué quieres hacer esto?

Al principio habría sugerido cambiar las capacidades para su costumbre tipo de post, pero no creo que haya uno que limite quién puede agregar posts, sino solo quién puede editarlos o publicarlos.

Se ve un poco sucio, pero podría intentar desactivar el elemento en el $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');

 57
Author: TheDeadMedic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-20 09:57:48

Hay una capacidad de meta create_posts que no está documentada, pero es utilizada por WordPress para verificar antes de insertar los varios botones y enlaces de 'Agregar nuevo'. En su declaración de tipo post personalizado, agregue capabilities (no debe confundirse con cap) y luego configúrelo a false como se muestra a continuación.

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
));
 102
Author: Seamus Leahy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-16 01:44:37

Las combinaciones de las soluciones anteriores funcionan ocultando los enlaces (aunque alguien podría escribir fácilmente la URL directamente.

La solución mencionada @PavelChernov se basa en get_post_type() que solo funcionará si ya hay un post en el listado. Si no hay publicaciones, la función no devolverá nada, y el enlace" Agregar nuevo " estará disponible. Un método alternativo:

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

EDITAR: Para evitar el acceso directo si alguien escribe la URL en sí mismo: https://wordpress.stackexchange.com/a/58292/6003

 9
Author: Kirk Beard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:37:28

En wordpress y para todos los tipos de post existe la capacidad create_posts. Esta capacidad se utiliza en varios archivos principales:

  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-incluye\admin-bar.php
  8. wp-incluye\class-wp-xmlrpc-server.php
  9. wp-incluye\post.php

Así que si realmente quieres desactivar este feautere debes hacerlo por rol y por tipo de post. Utilizo el gran plugin " User Role Editor" para gestionar las capacidades por rol.

Pero ¿qué pasa con la capacidad create_posts? Bueno, esta capacidad no está mapeada y también create_posts es igual a create_posts por lo que debemos arreglar esto y mapear la capacidad por tipo de post.

Para que pueda agregar este fragmento de código en sus funciones.php y el puede administrar esta capacidad.

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

Así que aquí no estamos ocultar o eliminar elementos del menú... aquí estamos eliminando la capacidad para los usuarios (incluidas las solicitudes xmlrpc).

La acción fue init y no admin_init o cualquier otra cosa porque init en la prioridad 100 impide la visualización de "agregar nuevo" en la barra de administración, la barra lateral, etc. (en toda la interfaz wp).

 7
Author: 3pepe3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 15:09:13
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
Author: andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-19 19:23:00

WordPress Networks: He encontrado que La respuesta de Seamus Leahy no funciona si estás conectado como superadministrador de la red, no importa si el usuario no tiene la capacidad, mapeada o no, cuando current_user_can (cap cap) es llamado por el CMS. Al cavar en el núcleo que encontré se puede hacer lo siguiente.

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

La respuesta aceptada oculta el elemento de menú, pero la página sigue siendo accesible.

 4
Author: Will Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-05 02:14:48

@ Staffan Estberg,

Esta es la mejor manera de ocultar el botón Agregar Nuevo o Crear nuevo en postypes personalizados

'capability_type'    => 'post',

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

        'map_meta_cap'       => true,

Se deshabilita para crear un nuevo post en tipos de post personalizados tanto en el menú de administración como por encima de la lista de tipo de post.

 2
Author: clap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-26 01:23:21

Desactivar la creación de nuevos mensajes para los tipos de mensajes registrados: (ejemplo para post y 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
Author: l2aelba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 10:10:07

Encontré esta manera más simple para esto. Solo ad este código en el tema function.php.

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
Author: Umair Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 21:41:27