延伸@Roman的答案。
The following was developed and tested in a Multisite environment - local and live WP installs.查看source 属于wp_delete_term
, 调用函数时会触发一些钩子。
我不确定这是否是最好的方法,但它确实有效。
add_action( \'delete_term_taxonomy\', \'wpse_70758_del_tax\', 10, 1 );
function wpse_70758_del_tax( $tt_id )
{
$undeletable = array( \'undeletable\', \'uncategorized\', \'other-cat\' );
$term = get_term_by( \'id\', $tt_id, \'category\' );
if( in_array( $term->slug, $undeletable ) )
wp_die( \'cant delete\' );
}
因此,当尝试删除“不可删除”类别时(使用
Quick Edit 菜单),它产生:
由于删除是通过Ajax进行的,我们正在中断其执行,WP会转储该错误消息(修改该文本需要一个单独的问题)。
如果我们使用“Bulk actions“,即wp_die()
在屏幕上打印。
但这还不是全部。实际删除之前(动作挂钩delete_term_taxonomy
), 我们正在阻止的子类别是“unparented”,line #1772:
//更新子级以指向新的父级
还有另一个钩子会发生此操作,我们可以插入一个提前中断来防止“取消连接”:
add_action( \'edit_term_taxonomies\', \'wpse_70758_del_child_tax\', 10, 1 );
function wpse_70758_del_child_tax( $arr_ids )
{
$undeletable = array( \'undeletable\', \'uncategorized\', \'other-cat\' );
foreach( $arr_ids as $id )
{
$term = get_term_by( \'id\', $id, \'category\' );
$parent = get_term_by( \'id\', $term->parent, \'category\' );
if( in_array( $parent->slug, $undeletable ) )
wp_die( \'cant delete\' );
}
}
在
Must Use Plugin 它将在网络中自动激活。
上面的快照在类别列表中有一个自定义ID列。这是通过以下代码完成的(这里有一个额外的列,用一个大的红色项目符号标记“不可删除”类别):
add_filter( \'manage_edit-category_columns\', \'wpse_70758_cat_edit_columns\' );
add_filter( \'manage_category_custom_column\', \'wpse_70758_cat_custom_columns\', 10, 3 );
function wpse_70758_cat_edit_columns( $columns )
{
$columns[\'tt_id\'] = \'ID\';
$columns[\'undeletable\'] = \'Undeletable\';
return $columns;
}
function wpse_70758_cat_custom_columns( $value, $name, $tt_id )
{
if( \'tt_id\' == $name )
echo $tt_id;
$term = get_term_by( \'id\', $tt_id, \'category\' );
$undeletable = array( \'undeletable\', \'uncategorized\', \'other-cat\' );
if( \'undeletable\' == $name && in_array( $term->slug, $undeletable ) )
echo \'<span style="color:#f00;font-size:5em;line-height:.5em">•</span>\';
}
Full working plugin: https://gist.github.com/4110831