创建不可删除的分类术语

时间:2014-08-22 作者:karbuncle

有没有办法在不修改核心的情况下,以编程方式为不可删除的自定义分类法创建一个术语?

“Uncategorized”就是一个例子,但在我的例子中,如果一篇文章没有附加一个术语,它不一定是默认术语,但它将是该自定义分类法中始终存在的默认术语。

EDIT:

我所说的不可移动,主要是指前端。也就是说,删除链接和批量操作复选框不会显示,就像“未分类”一样。

4 个回复
最合适的回答,由SO网友:David 整理而成

Update

实际上,有一种方法可以将每个分类法定义一个术语作为默认术语,从而使其在管理GUI中不可删除。

WP_Terms_List_Table 查找选项get_option( \'default_\' . $this->screen->taxonomy ).

因此,如果您有一个名为genre, 您必须设置选项default_genre 使用要保护的术语的术语id,以防通过管理GUI删除:

$taxonomy = \'genre\';
$key = get_option( \'default_\' . $taxonomy );
$term = get_term_by( \'name\', \'Your default genre term\', $taxonomy );
if ( empty( $key ) && $term )
     update_option( $key, $term->term_id );
tl;dr在我的第一个回答中,我错过了这个功能。但能力处理的描述仍然有效。

first answer

在这一点上,这是不可能的。那是因为WP_Terms_List_Table 所有能力检查如下:

current_user_can( $tax->cap->delete_terms );
这意味着,所有视图检查都是,如果用户有权按此类别整体删除术语。如果函数调用如下所示,则有可能:

current_user_can( $tax->cap->delete_terms, $tag )
在哪里$tag 将是术语对象。

在这种情况下,您可以轻松过滤map_meta_cap (其中通过了能力检查和第二个参数)以撤销删除特定术语的权限。

顺便说一下,这是WP_Posts_List_Table, 因此,可以检查每个帖子的功能。

目前我看到的唯一方法是,注册一个没有默认管理UI元素的分类法,并构建一个自定义管理页面来根据需要管理术语。

SO网友:bonger

要以前端方式执行此操作,您可以使用筛选器删除删除操作,并且(因为似乎没有筛选器来执行此操作)禁用(&;使用jquery隐藏复选框:

define( \'PROTECTED_TERM_ID\', 2 );
define( \'CUSTOM_TAX\', \'genres\' );
function wpse158784_custom_tax_row_actions( $actions, $tag ) {
    if ( $tag->term_id == PROTECTED_TERM_ID ) unset( $actions[\'delete\'] );
    return $actions;
}
function wpse158784_admin_footer_edit_tags_php() {
    if ( ! isset( $_GET[\'taxonomy\'] ) || $_GET[\'taxonomy\'] != CUSTOM_TAX ) return;
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery(\'input#cb-select-<?php echo PROTECTED_TERM_ID; ?>\').prop(\'disabled\', true).hide();
    });
    </script>
    <?php
}
if ( is_admin() ) {
    add_filter( CUSTOM_TAX . \'_row_actions\', \'wpse158784_custom_tax_row_actions\', 10, 2 );
    add_action( \'admin_footer-edit-tags.php\', \'wpse158784_admin_footer_edit_tags_php\' );
}

SO网友:Jason

我不确定您是否可以阻止删除某个术语,但您可以确保它始终存在。在函数中加入这个。php(或插件):

if ( !term_exists(\'locked-term\', \'category\' ) )
  wp_insert_term(\'Locked Term\', \'category\', array(\'slug\' => \'locked-term\'));
因此,要明确的是,从技术上讲,他们可以删除术语,但下次网站重新加载时,术语将恢复。这有效地锁定了术语。

SO网友:froger.me

迟到-您可以过滤元cap映射并将cap设置为\'do_not_allow\':

add_filter( \'map_meta_cap\', \'my_map_meta_cap, 10, 4 );
function my_map_meta_cap( $caps, $cap, $user_id, $args ) {
    $some_condition = get_my_specific_condition($caps, $cap, $user_id, $args);

    if ( \'delete_term\' === $cap && $some_condition ) {
        $term_id = $args[0];

        $undeletable_ids = array(
            get_an_id($caps, $cap, $user_id, $args, $term_id),
        );

        if ( in_array( $term_id, $undeletable_ids, true ) ) {
            $caps = array( \'do_not_allow\' );
        }
    }

    return $caps;
}

结束