web-dev-qa-db-ja.com

カスタムユーザーロールに特定のカスタム投稿タイプのみの作成、編集、削除を許可する方法

次のコードスニペットを使用して、Traveler Postというカスタム投稿タイプを作成しました。

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

そして、次のコードを使用して、Basic Travelerというロールを作成しました。

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

default travelertravellers postsの両方がbasic travelerロールに属している場合は、これを読んで編集できます。

しかし、私はbasic travelerロールユーザにtravelersの投稿のみを作成および編集することを許可したいと思います。どうやってやるの?

1
Riffaz Starr

しかし、私は基本的なトラベラーロールユーザーがトラベラーズ投稿のみを作成および編集できるようにしたいと思います。どうやってやるの?

問題は、2つの異なる投稿タイプ(投稿と旅行者)、多数のロール(デフォルトロールとbasic_traveller)がありますが、1セットの機能(デフォルト機能)しかないことです。

あなたがする必要があるのはあなたの新しい役割にマップする機能の新しいセットを定義することです。これは、新しい役割を追加し、新しい機能を定義し、それらの機能を新しい役割にマップし、そしてすべての新しい機能を管理者に割り当てる基本的なプラグインです。

stackexchange-sample.php:

これは私のすべてのプラグインのメインプラグインファイルです。それは、activation、deactivation、および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

ブートストラップファイルには、有効化と無効化のためのメソッドがあります。アクティベーション方法では、新しいロールを追加し、それにいくつかの機能を割り当ててから、管理者が新しい機能ですべてを実行できるようにします。無効化方法はその逆です。

他の唯一の方法はregisterです。ここでカスタム投稿タイプを登録するためのフックを追加します。

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

capabilities.php

Capabilitiesクラスは、新しい投稿タイプとやり取りするために必要なすべての機能を簡単に定義するための使用を可能にします。

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

最後に、カスタム投稿タイプを登録します。 map_meta_capがtrueであることに注意してください。

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

Basic_travellerロールのユーザーは、旅行者の投稿を公開および編集することはできますが、他の種類の投稿では何もできなくなります。

1
Nathan Johnson

このリンクはあなたの問題を解決するのに役立つかもしれません: http://3.7designs.co/blog/2014/08/restricting-access-to-custom-post-types-using-roles-ワードプレス/

0
Parth Kumar