web-dev-qa-db-ja.com

マルチサイト - カテゴリを削除から保護しますか?

更新:このスレッドをフォローしている人なら誰でもプラグインの解決策はうまくいくが、私のマルチサイトフォーマットでは問題があるようだ。私は今、3つの個別のインストールと3つのマルチサイトでテストしました。マルチサイトでは、赤い「削除できない」マーカーが配列のカテゴリの横に表示されますが、それらは削除される可能性があります。これは新しく作成されたサブサイトでは正しく動作するので、私の特定のインストールでは問題になるかもしれません。

元の投稿:マルチサイトで作業して&サイト所有者によって削除されないようにいくつかのデフォルトのカテゴリを保護する方法を望みます。

私はすでに管理者ロールを定義するために "members"プラグインを使用していますが、唯一の選択肢は "カテゴリの管理"です、そして私がその機能を無効にするとカテゴリを削除することはできません。

新しいカテゴリを許可するが、いくつかの特別なカテゴリを削除しない方法はありますか。

5
speedypancake

@ Romanの答えを拡張する。


次のものはMultisite環境で開発されテストされました - ローカルおよびライブWPインストール。


source of 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' );
}

そのため、( クイック編集 メニューを使用して)「削除不可」カテゴリを削除しようとすると、次のようになります。

can't delete category 

削除はAjaxを介して行われるため、実行を中断し、WPがそのエラーメッセージをダンプします(そのテキストを変更すると別の質問に値する)。

一括操作 」を使用すると、そのwp_die()が画面に表示されます。


しかしそれだけではありません。実際の削除の前(action hook delete_term_taxonomy)、ブロックしているものの子カテゴリは "親でない"、 #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>';
}

フル機能のプラグイン: https://Gist.github.com/4110831

5
brasofilo

たぶんあなたはアクション "delete_term"でwp_delete_term関数にフックすることができます( http://adambrown.info/p/wp_hooks/hook/delete_term?version = 3.4&file = wp-includes/taxonomy.php )そのような特定の用語が削除された場合は、もう一度挿入できます。

これはそれほどきれいな解決策ではなく、ユーザーが「リンクの削除」をクリックした後も用語がまだ残っていることに少し驚いたように見えますが、実際には解決策だと思います...

1
Roman