it-swarm.com.de

Wie kann eine benutzerdefinierte Benutzerrolle nur einen bestimmten benutzerdefinierten Beitragstyp erstellen, bearbeiten oder löschen?

Ich habe einen benutzerdefinierten Beitragstyp namens Traveler Post mit dem folgenden Code-Snippet erstellt:

/* 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,      
    )
  );
}

Und dann habe ich eine Rolle namens Basic Traveler mit dem folgenden Code erstellt.

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

Jetzt kann ein Benutzer die Standardposts und Travellerposts lesen und bearbeiten, wenn er sich in Basic Traveller Rolle befindet.

Aber ich möchte Basisreisenden Rollennutzern erlauben, Reisebeiträge nur zu erstellen und zu bearbeiten. Wie kann ich das machen?

1
Riffaz Starr

Ich möchte jedoch Benutzern mit einer einfachen Reiserolle erlauben, nur Reiserbeiträge zu erstellen und zu bearbeiten. Wie kann ich das machen?

Das Problem ist, dass Sie zwei verschiedene Beitragstypen (Beiträge und Reisende), viele Rollen (Standardrollen plus basic_traveller), aber nur einen Satz von Funktionen (Standardfunktionen) haben.

Sie müssen lediglich neue Funktionen definieren, die Ihrer neuen Rolle zugeordnet werden. Im Folgenden finden Sie ein grundlegendes Plug-in, mit dem Sie eine neue Rolle hinzufügen, neue Funktionen definieren, diese Funktionen der neuen Rolle zuordnen und Administratoren alle neuen Funktionen zuweisen können.

stackexchange-sample.php:

Dies ist die Haupt-Plugin-Datei für alle meine Plugins. Alles, was es tut, ist das Hinzufügen von Hooks zu Aktivierung, Deaktivierung und 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

In der Bootstrap-Datei haben wir Methoden zur Aktivierung und Deaktivierung. In der Aktivierungsmethode fügen wir eine neue Rolle hinzu, weisen ihr einige Funktionen zu und stellen dann sicher, dass Administratoren alles mit den neuen Funktionen machen können. Die Deaktivierungsmethode macht das Gegenteil.

Die einzige andere Methode ist register. Hier fügen wir einen Haken hinzu, um unseren benutzerdefinierten Beitragstyp zu registrieren.

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

skills.php

Die Capabilities-Klasse ermöglicht lediglich die einfache Definition aller Funktionen, die für die Interaktion mit einem neuen Beitragstyp erforderlich sind.

<?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

Schließlich registrieren wir unseren benutzerdefinierten Beitragstyp. Hinweis map_meta_cap ist wahr.

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

Benutzer mit der Rolle "basic_traveller" können Beiträge von Reisenden veröffentlichen und bearbeiten, können jedoch mit keinem anderen Beitragstyp etwas anfangen.

1
Nathan Johnson
0
Parth Kumar