web-dev-qa-db-ja.com

投稿を無効にし、既存のページの編集のみを許可し、新しいページの作成を許可しない(create_posts)

私はユーザーロールを既存のページだけを編集できるように制限しようとしていますが、新しいページを作成したり、投稿を含むもののような他のことをしないようにしています。

私はこれを読みました:

既存のページだけを編集できる既存の機能はありますか?そうでなければ、これを実装するための良い方法は? およびそこに記載されているチケット: https://core.trac.wordpress.org/ticket/16714

それで、私はそれらのパーミッションを持つ新しいユーザーロールを作成しました:

  • edit_pages
  • edit_others_pages
  • edit_published_pages
  • read

それから私はこれを追加しました:

function disable_page_creation(){    
  if( check_user_role('rolename'){ // This checks if the current user belongs to this role
     get_post_type_object('page')->cap->create_posts = 'do_not_allow';
  }
}

問題は、これが新しいページの作成を無効にするだけでなく、リストページのような他のことを禁止することです。

edit_postsを追加するとすぐに、すべてがpagesセクションで期待どおりに機能しますが、もちろん投稿は現在編集可能です。

これはWPがこの特定の組み合わせでは不可能なことなのか、それとも間違ったことなのか?それが動けなくなるどこかのヒントは?


編集:わかりました私は問題をトレースしていると思います。これが起こる理由は、投稿とページが同じ管理ファイルedit.phpを共有しているためだと私は思います。もう少し詳細:

投稿やページを編集しても、グローバルな$pagenow変数はedit.phpに設定されます。

user_can_access_admin_page() このチェックは実行されます

 if ( isset( $_wp_menu_nopriv[$pagenow] ) ){

無効にされた後編集がedit.php$_wp_menu_nopriv[$pagenow]を置くので、それはまたページのために救済します。

これはWPバグだと思います。誰もが解決策を確認することができますか?

4
kraftner

さてここに行きます。WordPress自体のバグです

私はすでに私の質問でこの問題をすぐに説明したので、それを見てみるか、詳細については上記のリンクをチェックしてください。

問題が正しく解決されるまで、私はこの汚い、汚いハックを提案します。それは、アクセス可能な別のサブメニューが追加されるとすぐに、すべてが再び正常に機能しているという考えに基づいています。そのため、一時的にダミーのサブメニュー項目を追加してチェックをトリックし、その後すぐに削除します。

function workaround_issue_22895(){    
        add_submenu_page( 'edit.php?post_type=page', 'Workaround_Issue_22895', 'Workaround_Issue_22895', 'edit_pages', 'workaround_issue_22895' );
        add_filter('add_menu_classes', 'workaround_issue_22895_unset');    
}

add_action( 'admin_menu' , 'workaround_issue_22895' );

function workaround_issue_22895_unset ($menu){
    remove_submenu_page( 'edit.php?post_type=page', 'workaround_issue_22895');
    return $menu;
}

ところで、私はこれがあなたが慎重に扱うべきである汚い、汚いハックであると述べましたか?

9
kraftner