在自定义投递类型上使用自定义元功能

时间:2013-10-29 作者:sethreidnz

我正在尝试创建产品帖子类型。我已经这样做了,并在产品审查小组的开发中成功地使用了它。我正试图赋予某个角色创建和管理这些产品的能力,以便供应商能够参与进来并投入他们自己的产品。我已经查看了其他成员插件,我完全理解它。我读了这篇帖子:

»;Meta Capabilities for Custom Post Types — JustinTadlock.com

并解释了如何添加这些功能。我的问题是,如果我声明\'capability_type\' => \'product\'register_post_type() 对于产品,不再创建post类型。好像我给了它某种不正确的输入。我已经阅读了Codex,该参数是一个字符串,默认为\'post\'. 如果你提供这个值,它就会起作用。

我试着复制和粘贴上面链接的上述帖子中的代码。我曾尝试在另一个WordPress安装中执行此操作。然而,我还没有尝试过进行全新的安装并禁用所有插件。这就是我现在要做的。我希望有人以前有过这个问题(上面文章的评论中有人有,我也有评论)。这是我目前的注册码

register_post_type( \'bounty_product\', array(
  \'labels\' => array(
     \'name\' => \'Products\',
     \'singular_name\' => \'Product\',
     \'add_new\' => \'Add New\',
     \'add_new_item\' => \'Add New Product\',
     \'edit\' => \'Edit\',
     \'edit_item\' => \'Edit Product\',
     \'new_item\' => \'New Product\',
     \'view\' => \'View\',
     \'view_item\' => \'View Product\',
     \'search_items\' => \'Search Products\',
     \'not_found\' => \'No Products found\',
     \'not_found_in_trash\' => \'No Products found in Trash\',
     \'parent\' => \'Parent Product\'),
  \'description\' => \'Used for the product review section\',
  \'public\' => true,
  \'show_in_menu\' => true,
  \'menu_position\' => 20,
  \'has_archive\' => true,
  \'supports\' => array( \'title\', \'editor\', \'comments\', \'thumbnail\', \'custom-fields\' ),
));
对此,我尝试添加以下内容:\'public\' => true:

\'capability_type\' => \'product\',
        \'capabilities\' => array(
            \'publish_posts\' => \'publish_product\',
            \'edit_posts\' => \'edit_product\',
            \'edit_others_posts\' => \'edit_others_product\',
            \'delete_posts\' => \'delete_product\',
            \'delete_others_posts\' => \'delete_others_product\',
            \'read_private_posts\' => \'read_private_product\',
            \'edit_post\' => \'edit_product\',
            \'delete_post\' => \'delete_product\',
            \'read_post\' => \'read_product\',
        ),
这只是打破了自定义帖子,似乎是\'capability_type\' => \'product\' 这就是问题所在。

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

看来你必须assign the capabilities manually to user roles, 否则,您的帖子类型根本不会显示,管理员角色也是如此。

再看看arguments section of the register_post_type() reference 我稍微更改了您的代码:

  • map_meta_cap<必要的,必要的map_meta_cap 需要设置为true,才能使其正常工作。

    • capability_type<当使用此参数作为构建功能的基础时,可以将单复数数组作为数组传递,以允许使用其他复数(…),第一个数组元素用于单数功能,第二个数组元素用于复数功能(…)。

      • capabilities<不需要,因为(数组)(可选)此post类型的功能数组默认:capability\\u type用于构造

        以上是关于代码更改的澄清。除此之外,我还添加了一个调试部分,打印$GLOBALS[\'wp_post_types\'][\'bounty_product\'], 因为就像《法典参考》中提到的那样:

        如果您分配一个“capability\\u type”,然后查看$GLOBALS[\'wp\\u post\\u types\'][\'your\\u cpt\\u name\']数组,那么您将看到(…)

        中的功能[cap] => stdClass Object ( ... ) 部分

        Code:

        add_action( \'init\', \'pt_bounty_product\');
        function pt_bounty_product() { 
        register_post_type( \'bounty_product\', array(
          \'labels\' => array(
             \'name\' => \'Products\',
             \'singular_name\' => \'Product\',
             \'add_new\' => \'Add New\',
             \'add_new_item\' => \'Add New Product\',
             \'edit\' => \'Edit\',
             \'edit_item\' => \'Edit Product\',
             \'new_item\' => \'New Product\',
             \'view\' => \'View\',
             \'view_item\' => \'View Product\',
             \'search_items\' => \'Search Products\',
             \'not_found\' => \'No Products found\',
             \'not_found_in_trash\' => \'No Products found in Trash\',
             \'parent\' => \'Parent Product\'),
          \'description\' => \'Used for the product review section\',
          \'public\' => true,
          \'capability_type\' => array(\'bounty_product\',\'bounty_products\'),
          \'map_meta_cap\' => true,
          \'show_in_menu\' => true,
          \'menu_position\' => 20,
          \'has_archive\' => true,
          \'supports\' => array( \'title\', \'editor\', \'comments\', \'thumbnail\', \'custom-fields\' ),
        
        ));
        
        // uncomment /** like this /**/
        /**
        echo \'<pre>\';
        print_r($GLOBALS[\'wp_post_types\'][\'www_product\']);
        echo \'</pre>\';
        /**/
        }
        
        法典:register_post_type()

        您必须取消注释才能看到这些功能与post类型相关联。如果可以看到它们,则意味着post类型初始化和自定义功能可以正常工作。But 正如我在一开始所说的,似乎必须手动将功能分配给相应的用户角色。

        下面显示了一种先解决问题的方法(至少对于管理员角色而言)

        Code:

            add_action( \'init\', \'add_bounty_product_caps_admin\');
            function add_bounty_product_caps_admin() {
                  $role = get_role( \'administrator\' );
        
                  $role->add_cap( \'edit_bounty_product\' ); 
                  $role->add_cap( \'edit_bounty_products\' ); 
                  $role->add_cap( \'edit_others_bounty_products\' ); 
                  $role->add_cap( \'publish_bounty_products\' ); 
                  $role->add_cap( \'read_bounty_product\' ); 
                  $role->add_cap( \'read_private_bounty_products\' ); 
                  $role->add_cap( \'delete_bounty_product\' ); 
                  $role->add_cap( \'edit_published_bounty_products\' );
                  $role->add_cap( \'delete_published_bounty_products\' );
            }
        
        资料来源:https://stackoverflow.com/a/18342740/2505105
        法典:get_role() | add_cap

        现在,您应该能够以管理员角色的用户身份查看、添加、编辑新的帖子类型。您可以复制、更改或添加这些功能,以将功能分配给其他角色。

        我决定展示第二种方法,即有点不同的方法,即如何将功能分配给用户角色

        Code:

            add_action( \'init\', \'add_bounty_product_caps\');
            function add_bounty_product_caps() {
                global $wp_roles;
        
                if ( isset($wp_roles) ) {
                    $wp_roles->add_cap( \'administrator\', \'edit_bounty_product\' );
                    $wp_roles->add_cap( \'administrator\', \'read_bounty_product\' );
                    $wp_roles->add_cap( \'administrator\', \'delete_bounty_product\' );
                    $wp_roles->add_cap( \'administrator\', \'publish_bounty_products\' );
                    $wp_roles->add_cap( \'administrator\', \'edit_bounty_products\' );
                    $wp_roles->add_cap( \'administrator\', \'edit_others_bounty_products\' );
                    $wp_roles->add_cap( \'administrator\', \'delete_bounty_products\' );
                    $wp_roles->add_cap( \'administrator\', \'delete_others_bounty_products\' );
                    $wp_roles->add_cap( \'administrator\', \'read_private_bounty_products\' );
        
                    $wp_roles->add_cap( \'editor\', \'read_bounty_product\' );
                    $wp_roles->add_cap( \'editor\', \'read_private_bounty_products\' );
        
                    $wp_roles->add_cap( \'author\', \'read_bounty_product\' );
                    $wp_roles->add_cap( \'author\', \'read_private_bounty_products\' );
        
                    $wp_roles->add_cap( \'contributor\', \'read_bounty_product\' );
                    $wp_roles->add_cap( \'contributor\', \'read_private_bounty_products\' );
                }
          }
        
        资料来源:http://isabelcastillo.com/assign-custom-post-type-capabilities-roles-wordpress
        法典:add_cap

        不要重复分配功能。以上方法都是示例性的,您必须决定如何以何种方式使用它们。

        最后一个补充是如何创建特定的用户角色

        Code:

        add_action(\'init\', \'bounty_product_author_user_role\');
        function bounty_product_author_user_role() {
            add_role(\'bounty_product_author\', \'Bounty Product Author\',
                array (
                        \'edit_bounty_product\' => true,
                        \'delete_bounty_product\' => true,
                        \'read_bounty_product\' => true,
                        \'publish_bounty_products\' => true,
                        \'edit_bounty_products\' => true,
                        \'edit_others_bounty_products\' => true,
                        \'delete_bounty_products\' => true,
                        \'delete_others_bounty_products\' => true,
                        \'read_private_bounty_products\' => true,
                        // more standard capabilities here
                        \'read\' => true,
                )
            );
        }
        
        资料来源:http://wp-snppts.com/create-a-custom-post-type-and-define-custom-role-capabilities法典:add_role()


        请记住,以上内容是典型的,因此您应该根据需要进行调整。要完全理解不同的部分,您可能需要阅读源代码和codex链接,并不是说它们涵盖了您所能了解的所有内容,而是应该让您开始阅读
        编辑:
        可在codex页面找到可用功能的概述:Roles and Capabilities.

结束

相关推荐

PHP致命错误:无法为wp-includes/capabilities.php中的非对象调用重载函数

我在apache日志中遇到了太多以下错误。PHP Fatal error: Cannot call overloaded function for non-object in wp-includes/capabilities.php on line 1187这是函数current\\u user\\u can($capability)的内部,第1187行如下所示:$current_user = wp_get_current_user(); 我不知道问题出在哪里?