PAGE TOP


カスタム投稿関連

2016年12月24日Wordpress

カスタム投稿関連のメモになります。documentというポストタイプを作成します。プラグインを利用することで実装可能なので、このような方法は不要ではあります。一般的に、カスタム投稿やカスタムタクソノミーの新規作成はCustom Post Type UIやそれらに細かな権限グループや権限を付け加える場合は、User Role Editorなどでも対応できます。ただ、細かなカスタマイズが必要な場合は、コードで書いたほうが早い場合もあります。

//カスタム投稿 documentタイプ作成
add_action( 'init', 'post_type_document' );
function post_type_document() {

   //カスタム投稿用の権限項目を作る。必要であれば
/*
   $capabilities = array(
               'edit_posts' => 'edit_documents',
               'edit_others_posts' => 'edit_others_documents',
               'publish_posts' => 'publish_documents',
               'read_private_posts' => 'read_private_documents',
               'delete_posts' => 'delete_documents',
               'delete_private_posts' => 'delete_private_documents',
               'delete_published_posts' => 'delete_published_documents',
               'delete_others_posts' => 'delete_others_documents',
               'edit_private_posts' => 'edit_private_documents',
               'edit_published_posts' => 'edit_published_documents',
    );


$role = get_role( 'author' );
    //カスタム投稿データ 上記で設定したものを投稿者権限のものに 追加 add_cap() 削除 remove_cap()

    $role->add_cap( 'edit_documents');
    $role->add_cap( 'edit_others_documents');
    $role->add_cap( 'publish_documents');
    $role->add_cap( 'read_private_documents');
    $role->add_cap( 'delete_documents');
    $role->add_cap( 'delete_private_documents');
    $role->add_cap( 'delete_published_documents');
    $role->add_cap( 'delete_others_documents');
    $role->add_cap( 'edit_private_documents');
    $role->add_cap( 'edit_published_documents');
*/

    //カスタム投稿 設定
    register_post_type( 'document',
        array('labels' =>
                array(
                'name' => 'EXAMPLE',
                'singular_name' => 'EXAMPLE'
                ),

            'capability_type' => 'document',
            //'capabilities'    => $capabilities,  //権限 詳細設定
            'map_meta_cap'    => true,
            'public' => true,
            'menu_position' => 10,
            'hierarchicla' => false,
            'has_archive' => true,
            'supports' => array('title','editor','thumbnail', 
            'custom-fields','excerpt','author','trackbacks',
            'comments','revisions','page-attributes')
        )
    );


    //documentタイプにタクソノミー追加
    register_taxonomy(
        'document-cat',
        'document',
        array('hierarchical' => false,
            'label' => 'カテゴリー追加',
            'singular_label' => 'カテゴリー追加',
            'public' => true,
            'hierarchical' => true,
        )
    );
  //documentタイプにタグ追加
   register_taxonomy(
        'document_tag',
        'document',
        array(
        'label' => 'タグを追加',
        'labels' => array(
        'popular_items' => 'よく使うタグ',
        'edit_item' =>'タグの編集',
        'add_new_item' => '新規タグを追加',
        'search_items' => 'タグの検索',
        ),
        'public' => true,
        'hierarchical' => false,
 
        )
        );
}

特に気をつけなければならないのが、下記の関数。

add_cap() 権限グループに指定の権限の追加
remove_cap() 権限グループにある指定の権限を削除する。
add_role() 権限グループを新規で追加する。
remove_role() 既にある権限グループを削除する。

この関数の場合、一度実行なんらかの設定をして実行してしまデーターベースに書き込まれてしまいます。
特に、add_cap()とremove_cap()は要注意です。追加又は、削除したあとに、元に戻そうとし、コメントアウトしても、データは残っているので、気づかないままでいると、場合によっては不具合を起すことがあります。今回、プラグインを実装の際に、見事にはまってしまった。原因を見つけるのに時間がかかりました。というもの、コード上では、コメントアウト、又は、既に削除しているので、コードからは発見することができず、バックアップコードを再現したり、ひとつひとつプラグインを停止させて確認したりしながら絞込みをかけて確認していきました。気づくまでに、かなりの時間がかかりました。おそらく、知らずに、使っていると、権限グループを知らないうちに追加したり削除したりしてしまっていることがあると思います。こういうのを簡単にリセットするプラグインがあってもいいはずなのですが、見当たらず、結局、全ての権限をもう一度自分で削除し、権限グループに応じての権限の追加を手動で行いました。こうならないためにも、みなさんは気をつけてください。

例えば、投稿者権限(author)だと下記のようにリセットできます。


$role = get_role( 'author' );

//管理者
    $role->remove_cap( 'activate_plugins');
    $role->remove_cap( 'edit_theme_options');
    $role->remove_cap( 'install_plugins');
    $role->remove_cap( 'install_themes');
    $role->remove_cap( 'list_users');
    $role->remove_cap( 'manage_options');
    $role->remove_cap( 'promote_users');
    $role->remove_cap( 'remove_users');
    $role->remove_cap( 'switch_themes');
    $role->remove_cap( 'update_core');
    $role->remove_cap( 'update_plugins');
    $role->remove_cap( 'update_themes');
    $role->remove_cap( 'edit_dashboard');

//編集者
    $role->remove_cap( 'moderate_comments');
    $role->remove_cap( 'manage_categories');
    $role->remove_cap( 'manage_links');
    $role->remove_cap( 'unfiltered_html');
    $role->remove_cap( 'edit_others_posts');
    $role->remove_cap( 'edit_posts');
    $role->remove_cap( 'edit_others_pages');
    $role->remove_cap( 'edit_published_pages');
    $role->remove_cap( 'publish_pages');
    $role->remove_cap( 'delete_pages');
    $role->remove_cap( 'delete_others_pages');
    $role->remove_cap( 'delete_published_pages');
    $role->remove_cap( 'delete_others_posts');
    $role->remove_cap( 'delete_private_posts');
    $role->remove_cap( 'edit_private_posts');
    $role->remove_cap( 'read_private_posts');
    $role->remove_cap( 'delete_private_pages');
    $role->remove_cap( 'edit_private_pages');
    $role->remove_cap( 'read_private_pages');


//投稿者
    $role->add_cap( 'edit_published_posts');
    $role->add_cap( 'upload_files');
    $role->add_cap( 'publish_posts');
    $role->add_cap( 'delete_published_posts');

//寄稿者
    $role->add_cap( 'edit_posts');
    $role->add_cap( 'delete_posts');

//購読者
    $role->add_cap( 'read');


このあたりは、ご自身の初期化したい権限にあわせて変更してください。また、リセットしたあとに、必要であれば自分が変更したい権限を再度追加してくだい。WordPress Codex 日本語版で、権限一覧を参照できます。こうしてみると、かなり多くの権限があります。間違えてわからなくなるとかな面倒なことになるのでお気を付けください。