如何从Category Metabox中删除“+Add Category”按钮?

时间:2017-03-10 作者:Ashwin Baskaran

我想禁用Category metabox下的“+添加类别按钮”,这样任何创建帖子的人都只需从现有类别列表中进行选择。

我确实查看了另一篇帖子,上面有同样的问题,How To Remove The "+ Add New Category" Link From A Category Metabox但被接受的答案没有意义,因为他引用了第345-367行,而这些行并不相关(可能是因为WP更新,事情可能已经改变了)。所以我很困惑。

我安装了“用户角色编辑器”插件,并删除了“编辑器”的“管理类别”功能,该功能正常工作。但我想为所有用户删除它,包括管理员、超级管理员。所以我试着改变主题的功能。php组件:

add_action( \'add_meta_boxes\', \'isa_remove_categories_meta_box\' )
function isa_remove_categories_meta_box() {

remove_meta_box( \'categorydiv\', \'post\', \'side\' );// remove the Categories box

}
但是,这会使整个类别框消失。我可以用什么来代替“categorydiv”,使“+添加新类别”消失?

或者,有人能告诉我另一篇帖子中被接受的第345-367行是什么意思吗?我也可以试试。

3 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

我安装了“用户角色编辑器”插件,并删除了“编辑器”的“manage\\u categories”功能,该功能正常工作。但我想删除它的所有用户,包括管理员,超级管理员。

如果从编辑器角色中删除“manage\\u categories”功能提供了您想要的功能,那么您可以通过使用现有插件或编写一个新插件从所有用户角色中删除“manage\\u categories”功能,从而相当容易地从所有用户角色中删除该功能。下面是从每个角色中删除该功能所必需的代码(实际上,它显式地将该功能设置为false)。

register_activation_hook( __FILE__, \'wpse_259647_remove_manage_categories_cap\' );
function wpse_259647_remove_manage_categories_cap() {
  $roles = wp_roles();
  foreach( $roles->role_names as $slug => $name ) {
    $role = get_role( $slug );
    $role->add_cap( \'manage_categories\', false );
  }
}
这不会从“超级管理员”中删除该功能,因为“超级管理员”在技术上不是一个角色或功能。

如果要从所有用户显式吊销manage\\u categories功能,也可以这样做。

register_activation_hook( __FILE__, \'wpse_259647_remove_manage_categories_cap\' );
function wpse_259647_remove_manage_categories_cap() {
  $users = get_users();
  foreach( $users as $user ) {
    $user->add_cap( \'manage_categories\', false );
  }
}
尽管如此,这可能仍然不会删除“超级管理员”的功能,因为WordPress对待他们的方式与其他用户不同。

SO网友:CDToad

如果您正在构建自己的分类法,则可以在注册分类法时设置功能。例如

<?php
    register_taxonomy(
        \'members_tax\',
        \'post\',
        array(
            \'label\'             => __( \'Members\' ),
            \'hierarchical\'      => true,
            \'rewrite\'           => array( \'slug\' => \'members-tax\' ),
            \'capabilities\'      => array(
                \'assign_terms\' => \'manage_options\',
                \'edit_terms\'   => \'god\',
                \'manage_terms\' => \'god\',
            ),
            \'show_in_nav_menus\' => false,
        )
    );
如果您只希望管理员能够添加或编辑,请将god更改为administrator。它从“新帖子”页面的元框中删除“添加新成员类别”,并删除“帖子”下菜单栏上的链接。

这来自于这个要点https://gist.github.com/ChrisFlannagan/4cd3bfd0e853cda3d3f7898c59428ac2

SO网友:Msea

在向注册类别时设置类别的元框register_taxonomy 作用此函数的默认行为是将metabox回调(meta\\u box\\u cb)设置为一个名为post_categories_meta_box. 正是此函数呈现+添加类别;按钮遗憾的是,此元数据库不允许您有选择地隐藏此按钮。正如其他回答者指出的那样,它将根据分类法的edit\\u terms功能隐藏该按钮,因此您可以通过限制谁拥有该功能来有效地隐藏它。但是,如果像我一样,您想隐藏此按钮而不限制功能,则此操作不起作用。

为此,您需要提供自己的meta\\u box\\u cb。我只需复制post\\u categories\\u meta\\u框并删除该按钮即可完成此操作。

My custom function:

function custom_post_categories_meta_box_without_add_new( $post, $box ) {
    $defaults = array( \'taxonomy\' => \'category\' );
    if ( ! isset( $box[\'args\'] ) || ! is_array( $box[\'args\'] ) ) {
        $args = array();
    } else {
        $args = $box[\'args\'];
    }
    $parsed_args = wp_parse_args( $args, $defaults );
    $tax_name    = esc_attr( $parsed_args[\'taxonomy\'] );
    $taxonomy    = get_taxonomy( $parsed_args[\'taxonomy\'] );
    ?>
    <div id="taxonomy-<?php echo $tax_name; ?>" class="categorydiv">
        <ul id="<?php echo $tax_name; ?>-tabs" class="category-tabs">
            <li class="tabs"><a href="#<?php echo $tax_name; ?>-all"><?php echo $taxonomy->labels->all_items; ?></a></li>
            <li class="hide-if-no-js"><a href="#<?php echo $tax_name; ?>-pop"><?php echo esc_html( $taxonomy->labels->most_used ); ?></a></li>
        </ul>
 
        <div id="<?php echo $tax_name; ?>-pop" class="tabs-panel" style="display: none;">
            <ul id="<?php echo $tax_name; ?>checklist-pop" class="categorychecklist form-no-clear" >
                <?php $popular_ids = wp_popular_terms_checklist( $tax_name ); ?>
            </ul>
        </div>
 
        <div id="<?php echo $tax_name; ?>-all" class="tabs-panel">
            <?php
            $name = ( \'category\' === $tax_name ) ? \'post_category\' : \'tax_input[\' . $tax_name . \']\';
            // Allows for an empty term set to be sent. 0 is an invalid term ID and will be ignored by empty() checks.
            echo "<input type=\'hidden\' name=\'{$name}[]\' value=\'0\' />";
            ?>
            <ul id="<?php echo $tax_name; ?>checklist" data-wp-lists="list:<?php echo $tax_name; ?>" class="categorychecklist form-no-clear">
                <?php
                wp_terms_checklist(
                    $post->ID,
                    array(
                        \'taxonomy\'     => $tax_name,
                        \'popular_cats\' => $popular_ids,
                    )
                );
                ?>
            </ul>
        </div>
    </div>
    <?php
}
(我希望我可以在这里加入我的自定义功能,正如我所提到的,它大部分是从wordpress复制的。如果有法律原因我不能这样做,请让我知道。)

Applied to my custom taxonomy

register_taxonomy(
    "my_custom_taxonomy",
    "my_custom_type",
    array(
        ...
        \'hierarchical\'      => true,
        \'meta_box_cb\' => \'custom_post_categories_meta_box_without_add_new\'
    )
);
这样做的缺点是,与默认设置不同,如果wordpress更新其样式,您的meta\\u box\\u cb将不会更改。

请注意,这仅在手动注册分类法时有效。如果您使用的是插件,它可能不允许您配置meta\\u box\\u cb。