WordPress: tipo de publicación personalizada, rol personalizado, capacidad personalizada

9 minutos de lectura

Estoy atascado en un problema al asignar la capacidad personalizada con el tipo de publicación personalizada a un rol personalizado.

El problema es que quiero eliminar el Agregar nuevo ( No con un truco de CSS o desarmando el elemento del menú ) opción de mi tipo de publicación personalizada. Ya he encontrado respuestas que sugieren muchas soluciones, pero ninguna funciona a la perfección.

Lo más cercano a lo que quiero es esto:

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

Este código elimina el enlace Agregar nuevo pero asigna el valor predeterminado correo slug para capacidades. Observe la línea 2 del código anterior. Si lo cambio a mi slug de tipo de publicación personalizado, deja de funcionar y ni siquiera puedo ir a la página de publicaciones.

Una cosa a tener en cuenta es que estoy trabajando con un rol personalizado, que solo tiene capacidad de lectura de forma predeterminada.

Si también asigno el edit_posts capacidad entonces se logra mi objetivo, pero luego el usuario también puede acceder a publicaciones y comentarios, que no quiero.

Woocommerce está haciendo esto. Me sumerjo en el código de woocommerce y agrego esta línea donde registra sus productos y pedidos.

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

Y todo funciona como yo quiero. He explorado el código de WooCommerce todo el día, pero no puedo encontrar cómo lo hace. ¿Puede alguien más ayudarme en esto con otro par de ojos? 🙂

Muy apreciado. Gracias..

  • ¿Ha intentado establecer ‘create_posts’ en una cadena nula o vacía?

    – Gaurav

    7 de octubre de 2017 a las 6:35

  • si lo hice con los mismos resultados

    – Shahbaz A.

    7 oct 2017 a las 11:25

  • Creo que estás configurando esto en el lugar equivocado. Debe dar a esta capacidad un nombre único y luego agregarla a la matriz de capacidades para los roles respectivos, O, mientras define el rol personalizado, establezca la capacidad correspondiente en falso. Consulte stackoverflow.com/questions/8198038/…

    – Gaurav

    7 oct 2017 a las 12:05


  • ¿Puede actualizar su pregunta con un poco más de información, como qué es lo que realmente quiere lograr? Actualmente, lo que supongo de aquí es que intentó ocultar CPT agregar una nueva capacidad a un rol de usuario específico. pero también le da a ese rol de usuario para editar y modificar, volver a editar la capacidad/permiso?

    – mlimon

    7 oct 2017 a las 12:59

  • @Gaurav no permitir es lo correcto en lugar de establecer falso como sugiere. Y ya he probado todas estas cosas.

    – Shahbaz A.

    8 de octubre de 2017 a las 5:21

avatar de usuario
mlimon

Ya te comenté que nos das un poco más de detalles sobre el plan que quieres hacer?

Aquí está la solución que creo que sería útil para usted.

Si quieres usar map_meta_cap => true entonces tendrás que cambiar capability_type así como con tu propio tipo, ver más https://codex.wordpress.org/Function_Reference/register_post_type#capability_type

Pero si estableces tu propio capability_type valor, entonces deberá agregar capacidad a los roles de los usuarios que desee agregar.

aquí hay un ejemplo completo.

if ( !class_exists( 'WPSE64458_CPT_Register' ) ) {
  class WPSE64458_CPT_Register {

    function __construct() {
      add_action( 'init', array( $this, 'wpse64458_register_post_types' ), 5 );
      add_action( 'admin_init', array( $this, 'wpse64458_add_caps' ), 5 );
      add_filter( 'register_post_type_args', array( $this, 'wpse64458_modify_cpt_registry' ) , 10, 2 );

    }

    /**
     * Register core post types.
     */
    public function wpse64458_register_post_types() {

      if ( ! is_blog_installed() || post_type_exists( 'member' ) ) {
        return;
      }

      register_post_type( 'member',
        apply_filters( 'wpse64458_callb_post_type_member',
          array(
            'labels'              => array(
              'name'                  => __( 'Members', 'domaintext' ),
              'singular_name'         => __( 'Member', 'domaintext' ),
              'all_items'             => __( 'All Members', 'domaintext' ),
              'menu_name'             => _x( 'Members', 'Admin menu name', 'domaintext' ),
              'add_new'               => __( 'Add New', 'domaintext' ),
              'add_new_item'          => __( 'Add new member', 'domaintext' ),
              'edit'                  => __( 'Edit', 'domaintext' ),
              'edit_item'             => __( 'Edit member', 'domaintext' ),
              'new_item'              => __( 'New member', 'domaintext' ),
              'view'                  => __( 'View member', 'domaintext' ),
              'view_item'             => __( 'View member', 'domaintext' ),
              'search_items'          => __( 'Search members', 'domaintext' ),
              'not_found'             => __( 'No members found', 'domaintext' ),
              'not_found_in_trash'    => __( 'No members found in trash', 'domaintext' ),
              'parent'                => __( 'Parent member', 'domaintext' ),
              'featured_image'        => __( 'Member image', 'domaintext' ),
              'set_featured_image'    => __( 'Set member image', 'domaintext' ),
              'remove_featured_image' => __( 'Remove member image', 'domaintext' ),
              'use_featured_image'    => __( 'Use as member image', 'domaintext' ),
              'insert_into_item'      => __( 'Insert into member', 'domaintext' ),
              'uploaded_to_this_item' => __( 'Uploaded to this member', 'domaintext' ),
              'filter_items_list'     => __( 'Filter members', 'domaintext' ),
              'items_list_navigation' => __( 'Members navigation', 'domaintext' ),
              'items_list'            => __( 'Members list', 'domaintext' ),
            ),
            'public'              => true,
            'show_ui'             => true,
            'capability_type'     => 'member',
            'map_meta_cap'        => true,
            'menu_icon'          => 'dashicons-groups',
            'publicly_queryable'  => true,
            'exclude_from_search' => false,
            'hierarchical'        => false, // Hierarchical causes memory issues - WP loads all records!
            'rewrite'            => array( 'slug' => 'member' ),
            'query_var'           => true,
            'supports'            => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
            'has_archive'         => 'members',
            'show_in_nav_menus'   => true,
            'show_in_rest'        => true,
          )
        )
      );

    } // end of wpse64458_register_post_types


    /**
     * Get capabilities.
     *
     * @return array
     */
     private function wpse64458_set_caps() {
      $capabilities = array();

      $capability_types = array( 'member' );

      foreach ( $capability_types as $capability_type ) {

        $capabilities[ $capability_type ] = array(
          // Post type
          "edit_{$capability_type}",
          "read_{$capability_type}",
          "delete_{$capability_type}",
          "edit_{$capability_type}s",
          "edit_others_{$capability_type}s",
          "publish_{$capability_type}s",
          "read_private_{$capability_type}s",
          "delete_{$capability_type}s",
          "delete_private_{$capability_type}s",
          "delete_published_{$capability_type}s",
          "delete_others_{$capability_type}s",
          "edit_private_{$capability_type}s",
          "edit_published_{$capability_type}s",

          // Terms
          // "manage_{$capability_type}_terms",
          // "edit_{$capability_type}_terms",
          // "delete_{$capability_type}_terms",
          // "assign_{$capability_type}_terms",

        );
      }

      return $capabilities;
    }

    /*
      Add Capability
     */
    public function wpse64458_add_caps(){

      global $wp_roles;

      if ( ! class_exists( 'WP_Roles' ) ) {
        return;
      }

      if ( ! isset( $wp_roles ) ) {
        $wp_roles = new WP_Roles();
      }

      $capabilities = $this->wpse64458_set_caps();

      foreach ( $capabilities as $cap_group ) {
        foreach ( $cap_group as $cap ) {
          $wp_roles->add_cap( 'editor', $cap );
          $wp_roles->add_cap( 'administrator', $cap );
        }
      }
    }

    public function wpse64458_modify_cpt_registry( $args, $post_type ){

      // Do not filter any other post type
      if ( 'member' !== $post_type ) {

        // Give other post_types their original arguments
        return $args;

      }

      if( current_user_can('editor') ) {
        $args['capabilities']['create_posts'] = false;
      }

      // Give the custom-css-js post type it's arguments
      return $args;

    }


  }
}

entonces heredar el class con new WPSE64458_CPT_Register();

Con este ejemplo, deshabilito el rol de editor para agregar una nueva funcionalidad de publicación de miembros. modifique lo que quiera, o puede hacer esto con otros también. pero anteriormente mencionas que ya intentaste seguir a WooCommerce, en realidad también lo hacen de esta manera,

Espero que tenga sentido para ti.

¡FelizCodding!

  • Gracias por una respuesta tan excelente y detallada. Pero ya he hecho esto. Y como mencioné en la pregunta. Necesito esto para un rol personalizado. Que solo tendrá capacidad de lectura. Funciona con cualquier rol predeterminado o el rol personalizado si tiene capacidad de edición de publicaciones junto con lectura. Pero no quiero dar la capacidad de editar publicaciones al rol personalizado. Eso es. Todo lo demás es exactamente como lo codificaste y explicaste. Espero que esto aclare lo que estabas pidiendo.

    – Shahbaz A.

    8 de octubre de 2017 a las 10:11

  • Me alegra saber que ya lo hiciste. De todos modos, si realmente no desea otorgar otras capacidades además de la capacidad de lectura, entonces realmente confundí lo que queda para hacer este control. Si no doy el rol de usuario a edit_posts o edit_cpt, ¿entonces no puedo encontrar ningún problema aquí? Sin embargo, HappyCodding! 🙂

    – mlimon

    8 oct 2017 a las 11:05

  • Ese es el problema. Simplemente no puedo entender que lo que falta aquí. Pensé que tal vez alguien más podría averiguarlo. No funciona a menos que le dé permiso a edit_posts. Y si doy eso, entonces todo funciona absolutamente bien. Quiero dar y he dado edit_cpt pero no quiero dar edit_posts

    – Shahbaz A.

    8 de octubre de 2017 a las 12:11

  • Te estoy otorgando esta recompensa ya que has hecho un intento honesto y tu respuesta es válida. Pero como no resuelve mi problema, no puedo aceptarlo. Salud.

    – Shahbaz A.

    13 oct 2017 a las 10:27

avatar de usuario
dineshkashera

Puede restringir la función de usuario específica a la publicación personalizada mediante el siguiente script:

Agregar rol personalizado

add_action('init','add_my_custom_role');
    function add_my_custom_role() {

     add_role('my_custom_role',
                'Custom Role',
                array(
                    'read' => true,
                    'edit_posts' => false,
                    'delete_posts' => false,
                    'publish_posts' => false,
                    'upload_files' => false,
                    'publish_posts' => false,
                    'create_posts' => false, 
                )
            );
       }

Registrarse Publicación personalizada

add_action( 'init', 'my_custom_post_type');
function my_custom_post_type() {
     $args = array(
 'label'               => __( 'Custom post', 'custom-text-domain' ),
 'description'         => __( 'Custom post', 'custom-text-domain' ),
 'labels'              => $labels,
 'supports'            => array( 'title', 'comments', 'revisions', ),
 'hierarchical'        => false,
 'public'              => true,
 'show_ui'             => true,
 'rewrite'             => $rewrite,
                        'capability_type'     => array('custom_post','custom_post'),
                        'map_meta_cap'        => true, // Set to `false`, if users are not allowed to edit/delete existing posts 
 );
 register_post_type( 'custom_post', $args );
}

Permitir capacidades de usuario para publicar en función de los roles

    add_action('admin_init','custom_post_add_role_caps',999);
        function custom_post_add_role_caps() {

     // Add the roles you'd like to administer the custom post types
     $roles = array('my_custom_role','editor');

     // Loop through each role and assign capabilities
     foreach($roles as $the_role) { 

          $role = get_role($the_role);

                  $role->add_cap( 'read' );
                  $role->add_cap( 'read_custom_post');
                  $role->add_cap( 'read_private_custom_post' );
                  $role->add_cap( 'edit_custom_post' );
                  $role->add_cap( 'edit_custom_post' );
                  $role->add_cap( 'edit_others_custom_post' );
                  $role->add_cap( 'edit_published_custom_post' );
                  $role->add_cap( 'publish_custom_post' );
                  $role->add_cap( 'delete_others_custom_post' );
                  $role->add_cap( 'delete_private_custom_post' );
                  $role->add_cap( 'delete_published_custom_post' );

     }
}

Espero que esto le ayude, para obtener más ayuda por favor visite

https://codex.wordpress.org/Function_Reference/register_post_type

y

https://codex.wordpress.org/Roles_and_Capabilities

¿Ha sido útil esta solución?