web-dev-qa-db-fra.com

Comment autoriser un rôle d'utilisateur personnalisé à créer, modifier, supprimer un type de publication personnalisé spécifique uniquement?

J'ai créé un type de message personnalisé appeléTraveler Posten utilisant l'extrait de code suivant:

/* custom post - traveller posts */ 
add_action( 'init', 'traveller' );
function traveller() {
  register_post_type( 'traveller',
    array(
      'labels' => array(
        'name' => __( 'Traveller Posts' ),
        'singular_name' => __( 'Traveller Post' )
      ),
      'public' => true,
      'has_archive' => true,      
    )
  );
}

Et puis j'ai créé un rôle appeléBasic Traveleren utilisant le code suivant.

$result = add_role(
    'basic_traveller',
    __( 'Basic Traveller' ),
    array(
        'read'         => true,  // true allows this capability
        'edit_posts'   => true,
        'delete_posts' => false, // Use false to explicitly deny
    )
);

Maintenant, un utilisateur peut lire et éditer lesmessages par défautetvoyageurs messagess'il est dansvoyageur de baserôle.

Mais je veux autoriservoyageur de baseutilisateurs du rôle à créer et éditervoyageurs messagesuniquement. Comment puis je faire ça?

1
Riffaz Starr

Mais je souhaite autoriser les utilisateurs de rôle de voyageur de base à créer et à modifier uniquement les messages de voyageurs. Comment puis je faire ça?

Le problème est que vous avez deux types de publication différents (publications et voyageur), plusieurs rôles (rôles par défaut plus basic_traveller), mais un seul ensemble de fonctionnalités (fonctionnalités par défaut).

Ce que vous devez faire, c'est définir un nouvel ensemble de fonctionnalités qui correspondront à votre nouveau rôle. Voici un plug-in de base qui ajoutera un nouveau rôle, définira de nouvelles fonctionnalités, mappera ces fonctionnalités sur le nouveau rôle et attribuera toutes les nouvelles fonctionnalités aux administrateurs.

stackexchange-sample.php:

C'est le fichier de plugin principal pour tous mes plugins. Il ne fait qu'ajouter des points d'ancrage à l'activation, à la désactivation et à plugins_loaded.

<?php
/**
 * Plugin Name: Stackexchange Sample
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 * Domain Path: /languages
 * Text Domain: stackexchange-sample
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

//* Start bootstraping the plugin
require( dirname( __FILE__ ) . '/bootstrap.php' );
add_action( 'plugins_loaded',
  [ $bootstrap = new \Stackexchange\bootstrap(), 'register' ] );

//* Register activation and deactivation hooks
register_activation_hook( __FILE__ , [ $bootstrap, 'activation' ] );
register_deactivation_hook( __FILE__ , [ $bootstrap, 'deactivation' ] );

bootstrap.php

Dans le fichier de démarrage, nous avons des méthodes d'activation et de désactivation. Dans la méthode d'activation, nous ajoutons un nouveau rôle, nous lui attribuons certaines fonctionnalités, puis nous nous assurons que les administrateurs peuvent tout faire avec les nouvelles fonctionnalités. La méthode de désactivation fait l'inverse.

La seule autre méthode est enregistrer. Ici, nous ajoutons un crochet pour enregistrer notre type de message personnalisé.

<?php
namespace Stackexchange;

class bootstrap {

  public function register() {
    require( dirname( __FILE__ ) . '/custom-post-type.php' );
    add_action( 'init', [ new custom_post_type(), 'register' ] );
  }

  public function activation() {
    require( dirname( __FILE__ ) . '/capabilities.php' );

    $caps = new capabilities( 'traveller' );
    $caps->add( [
      'edit_',
      'read_',
      'delete_',
      'edit_s',
      'publish_s',
      'edit_published_s',
    ] );

    add_role( 'basic_traveller', __( 'Basic Traveller' ), $caps->caps() );

    $admin = get_role( 'administrator' );
    foreach( $caps->caps() as $cap => $val )
      $admin->add_cap( $cap );
  }

  public function deactivation() {
    remove_role( 'basic_traveller' );

    $admin = get_role( 'administrator' );
    $caps = new capabilities( 'traveller' );
    foreach( $caps->caps() as $cap => $val ) {
      $admin->remove_cap( $cap );
    }
  }
}

capacités.php

La classe de capacités permet simplement de définir facilement toutes les capacités nécessaires pour interagir avec un nouveau type de publication.

<?php
namespace Stackexchange;

class capabilities {

  protected $capabilities = [
    //* Meta capabilities
    'edit_'              => false,
    'read_'              => false,
    'delete_'            => false,

    //* Primitive capabilities used outside of map_meta_cap()
    'edit_s'             => false,
    'edit_others_s'      => false,
    'publish_s'          => false,
    'read_private_s'     => false,

    //* Primitive capabilities used within of map_meta_cap()
    'delete_s'           => false,
    'delete_private_s'   => false,
    'delete_published_s' => false,
    'delete_others_s'    => false,
    'edit_private_s'     => false,
    'edit_published_s'   => false,
  ];

  public function __construct( $name ) {
    $this->name = $name;
    foreach( $this->capabilities as $key => $val ) {
      $capabilities[ $this->strl_replace( "_", "_{$this->name}", $key ) ] = $val;
    }
    $this->capabilities = $capabilities;
  }

  public function add( $caps = [] ) {
    foreach( $caps as $key ) {
      $this->capabilities[ $this->strl_replace( "_", "_{$this->name}", $key ) ] = true;
    }
  }

  public function caps() {
    return $this->capabilities;
  }

  protected function strl_replace( $search, $replace, $subject ) {
    $pos = strrpos( $subject, $search );
    if( false !== $pos ) {
      $key = substr_replace( $subject, $replace, $pos, strlen( $search ) );
    }
    return $key;
  }
}

custom-post-type.php

Enfin, nous enregistrons notre type de message personnalisé. Notez que map_meta_cap est vrai.

<?php
namespace Stackexchange;

class custom_post_type {
  public function register() {
    $labels = [
      'name'          => __( 'Traveller Posts' ),
      'singular_name' => __( 'Traveller_Post' ),
    ];
    $args = [
      'labels'          => $labels,
      'public'          => true,
      'has_archive'     => true,
      'capability_type' => 'traveller',
      'map_meta_cap'    => true,
    ];
    register_post_type( 'travellers', $args );
  }
}

Les utilisateurs du rôle basic_traveller pourront publier et éditer des messages de voyageurs, mais ne pourront rien faire avec aucun autre type de message.

1
Nathan Johnson
0
Parth Kumar