8768 sujets

Développement web côté serveur, CMS

Bonjour,
Quelqu'un saurait il expliquer la différence entre les deux paramètres suivants:
- capability_type (une valeur)
- capabilities (un tableau)
lors de la création de custom_post_type avec la fonction register_post_type()

capability_type est une chaine caractères, la plupart des cas on lui renseigne 'post' afin que les 7 capacités par défaut ( edit_post, edit_posts, delete_post, create_post etc ) soient utilisables par défaut, sinon, on lui renseigne une chaine propre 'mon_post' et les capacités spécifiques ( edit_mon_post, edit_mon_posts, delete_mon_post, create_mon_post etc ) devront êtres rajoutées aux utilisateurs concernés.

capabilities est un tableau du type:


 'capabilities' => array(
    'edit_post'              => 'edit_disco',
    'read_post'              => 'read_disco',
    'delete_post'            => 'delete_disco2',
    'create_posts'           => 'create_discos',
    'edit_posts'             => 'edit_disco2s',
    'edit_others_posts'      => 'edit_others_disco2s',
    'publish_posts'          => 'publish_disco2s',
    'read_private_posts'     => 'read',
    'read'                   => 'read',
    'delete_posts'           => 'delete_disco2s',
    'delete_private_posts'   => 'delete_private_disco2s',
    'delete_published_posts' => 'delete_published_disco2s',
    'delete_others_posts'    => 'delete_others_disco2s',
    'edit_private_posts'     => 'edit_private_disco2s',
    'edit_published_posts'   => 'edit_published_disco2s'
    ),

dans lequel on peut définir spécifiquement le nom de chaque capacité.

Je n'arrive pas à comprendre l'usage et la différence entre ces deux variables. À mon sens elles seraient exclusives, on utilise l'une ou l'autre et pourtant je vois plein d'exemples en ligne dans lesquels les deux valeurs sont utilisées.
Quel est l'intérêt de redéfinir spécifiquement des capacités si elles ont aussi été définies de manière génériques (avec capability_type).. ?
Modifié par lionel_css3 (22 Aug 2017 - 10:13)
Et bien si je comprends bien, le premier paramètre se basant sur les capacités des articles donnera accès aux alias des capacités des articles (edit_posts, etc.) et uniquement à ceux-là.

Alors que le tableau capabilities te permet de restreindre les capacités (par exemple, en ne spécifiant pas 'edit_others_posts', personne ne pourra modifier les contenus d'autres utilisateurs) ou encore pour les plus braves, de les étendre en créant des capacités spécifiques dont il sera possible de se servir dans l'administration pour affiner la gestion des fonctionnalités.

Je n'ai jamais joué dans le détail avec ces fonctions, mais c'est à mon avis la différence entre ces deux façons procéder.
c'est bien plus tordu que ça en fait;

si on utilise capability_type => 'post' il va associer toutes ces capacités
(ici je montre une partie du var_dump($GLOBALS['wp_post_types']['__mon_cpt__']); )

 public 'cap' => 
    object(stdClass)[3660]
      public 'edit_post' => string 'edit_post' (length=9)
      public 'read_post' => string 'read_post' (length=9)
      public 'delete_post' => string 'delete_post' (length=11)
      public 'edit_posts' => string 'edit_posts' (length=10)
      public 'edit_others_posts' => string 'edit_others_posts' (length=17)
      public 'publish_posts' => string 'publish_posts' (length=13)
      public 'read_private_posts' => string 'read_private_posts' (length=18)
      public 'read' => string 'read' (length=4)
      public 'delete_posts' => string 'delete_posts' (length=12)
      public 'delete_private_posts' => string 'delete_private_posts' (length=20)
      public 'delete_published_posts' => string 'delete_published_posts' (length=22)
      public 'delete_others_posts' => string 'delete_others_posts' (length=19)
      public 'edit_private_posts' => string 'edit_private_posts' (length=18)
      public 'edit_published_posts' => string 'edit_published_posts' (length=20)
      public 'create_posts' => string 'edit_posts' (length=10)



si par contre on utilise capability_type => 'disco' il va associer seulement les capacités suivantes: (capacités de base)


public 'cap' => 
    object(stdClass)[3660]
      public 'edit_post' => string 'edit_disco' (length=10)
      public 'read_post' => string 'read_disco' (length=10)
      public 'delete_post' => string 'delete_disco' (length=12)
      public 'edit_posts' => string 'edit_discos' (length=11)
      public 'edit_others_posts' => string 'edit_others_discos' (length=18)
      public 'publish_posts' => string 'publish_discos' (length=14)
      public 'read_private_posts' => string 'read_private_discos' (length=19)
      public 'create_posts' => string 'edit_discos' (length=11)


et il faudrait définir les autres capacités manquantes dans le tableau capabilities

imaginons maintenant que nous rajoutions ceci dans la création du CPT


 'capabilities' => array(
    'edit_post'              => 'edit_disco2',
    'read_post'              => 'read_disco2',
    ),


maintenant wordPress créé les capacités suivantes:

 public 'cap' => 
    object(stdClass)[3660]
      public 'edit_post' => string 'edit_disco2' (length=11)
      public 'read_post' => string 'read_disco2' (length=11)
      public 'delete_post' => string 'delete_disco' (length=12)
      public 'edit_posts' => string 'edit_discos' (length=11)
      public 'edit_others_posts' => string 'edit_others_discos' (length=18)
      public 'publish_posts' => string 'publish_discos' (length=14)
      public 'read_private_posts' => string 'read_private_discos' (length=19)
      public 'create_posts' => string 'edit_discos' (length=11)


c'est à dire que le tableau capabilities écrase les valeurs générées par le suffixe utilisé dans capability_type si on déclare à nouveau ces valeurs de capacités dans le tableau capabilities.

ça veut donc dite que ce genre de code (vu sur des fils de forum) est redondant...

<?php
add_action( 'init', 'create_my_post_types' );

function create_my_post_types() {
  register_post_type(
		'movie',
		array(
			'public' => true,
			'capability_type' => 'movie',
      //le tableau capabilities est redondant ici 
      // sauf si il devait définir des nouvelles capacités autres que celles de 
      // base, ce qui n'est pas le cas ici
			'capabilities' => array(
				'publish_posts' => 'publish_movies',
				'edit_posts' => 'edit_movies',
				'edit_others_posts' => 'edit_others_movies',
				'read_private_posts' => 'read_private_movies',
				'edit_post' => 'edit_movie',
				'delete_post' => 'delete_movie',
				'read_post' => 'read_movie',
			),
		)
	);
}


Tout ça est un peu confusant, je continue mes investigations car je prépare un tuto WordPress sur la gestion des roles et capabilities mais j'aimerais bien tout comprendre avant lol
Modifié par lionel_css3 (23 Aug 2017 - 10:50)
Merci pour ces explications, ça m'intéresse beaucoup aussi Smiley smile Je ne m'étais jamais posé la question !
on peut trouver plusieurs types de publication disponibles par défaut dans l'installation de WordPress pour le WordPress custom post type.

Post-blog
Page - page statique
Pièce jointe - support attaché
Révision - post révision
Menu de navigation - menu de navigation