禁用帖子,仅允许编辑现有页面,不允许创建新页面(CREATE_POSTS)

时间:2015-02-13 作者:kraftner

我试图将用户角色限制为只能编辑现有页面,但不能创建新页面或对帖子执行任何其他操作。

我读过:

Is there an existing capability to allow editing of only pre-existing pages? If not, a good way to implement this?还有上面提到的票: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 页面部分中的所有内容都按预期工作,但当然,帖子现在可以编辑了。

    这是WP在这种特殊组合中无法做到的,还是我做错了?有什么线索表明它在哪里卡住了吗?

    编辑:好的,我想我正在追查这个问题。我认为发生这种情况的原因是帖子和页面共享同一个管理文件edit.php. 更多详细信息:

    全球$pagenow 变量设置为edit.php 不管我们是编辑帖子还是页面。

    在里面user_can_access_admin_page() 执行此检查

     if ( isset( $_wp_menu_nopriv[$pagenow] ) ){
    
    如禁用的后期编辑所示edit.php在里面$_wp_menu_nopriv[$pagenow] 它还可以取出页面。

    我认为这是一个WP bug。有人能确认或有解决方案吗?

1 个回复
SO网友:kraftner

好了,开始吧。信息技术is a bug in WordPress itself.

我已经很快在我的问题中解释了这个问题,所以要么看看它,要么查看上面链接的罚单以了解更多详细信息。

在问题得到妥善解决之前,我建议进行这种肮脏的黑客攻击。它基于这样一个想法,即一旦添加了另一个可访问的子菜单,一切都会恢复正常。因此,我们临时添加一个虚拟子菜单项来欺骗检查,然后立即删除它。

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;
}
顺便说一句,我有没有提到这是一个肮脏的,肮脏的黑客,你应该小心处理?

结束

相关推荐

未定义的偏移量:1067行的>[...]/wp-includes/capabilities.php中的0

嘿,我在我的localhost设置中得到了这个错误消息,但只有在启用Genesis框架的情况下;WordPress二十一行。当我想创建一个新帖子时,就会发生这种情况。如果我刷新页面,错误会重复,但帖子本身会被创建,一切似乎都很好。有人知道这是什么原因吗?Notice: Undefined offset: 0 in /var/www/secret/htdocs/wp-includes/capabilities.php on line 1067 Notice: Undefined offset: 0