多站点-保护类别不被删除?

时间:2012-10-28 作者:speedypancake

UPDATE: For anyone following this thread, the plugin solution does work, but seems to have a problem on my multisite format. I have now tested on 3 individual installs and on 3 multisites. On the multisites, the red "undeletable" marker appears next to the categories in the array, but they can get deleted. This may well be down to a problem with my particular install, as it works properly with newly created subsites.

原职:在多站点上工作;希望有一种方法来保护一些默认类别不被网站所有者删除。

我已经在使用“members”插件定义管理员角色,但唯一的选项是“管理类别”,如果我禁用该功能,他们将无法删除类别,但也无法创建新类别。

有没有办法允许新类别,但不删除一些特殊类别??

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

延伸@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 菜单),它产生:

can't delete category

由于删除是通过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">&#149;</span>\';
}

Full working plugin: https://gist.github.com/4110831

SO网友:Roman

Maybee您可以通过操作“delete\\u term”连接到wp\\u delete\\u term函数(请参阅以下信息:http://adambrown.info/p/wp_hooks/hook/delete_term?version=3.4&file=wp-includes/taxonomy.php) 如果删除了这样的特定术语,您可以再次插入它。。。

这不是一个干净的解决方案,用户在点击“删除链接”后,这个词仍然存在,这让他们看起来有点惊讶,但它可以完成这项工作,实际上我认为这是唯一的解决方案。。。

结束