it-swarm.com.de

Multisite - Kategorien vor Löschen schützen?

UPDATE: Für jeden, der diesem Thread folgt, funktioniert die Plug-in-Lösung, scheint aber ein Problem mit meinem Multisite-Format zu haben. Ich habe jetzt auf 3 einzelnen Installationen und auf 3 Multisites getestet. Auf den Multisites wird neben den Kategorien im Array die rote Markierung "Undeletable" angezeigt, die jedoch gelöscht werden kann. Dies ist möglicherweise auf ein Problem bei meiner Installation zurückzuführen, da es bei neu erstellten Unterwebsites ordnungsgemäß funktioniert.

Ursprünglicher Beitrag: Arbeiten auf mehreren Websites und möchten, dass einige Standardkategorien nicht von Websitebesitzern gelöscht werden.

Ich benutze bereits das "Mitglieder" -Plugin, um Administratorrollen zu definieren, aber die einzige Option ist "Kategorien verwalten". Wenn ich diese Funktion deaktiviere, können sie keine Kategorien löschen, aber sie können auch keine neuen erstellen.

Gibt es eine Möglichkeit, neue Kategorien zuzulassen, aber einige spezielle nicht zu löschen?

5
speedypancake

Erweiterung der Antwort von @ Roman.


Folgendes wurde in einer Umgebung mit mehreren Standorten entwickelt und getestet - lokal und live WP installiert.


Betrachtet man source von wp_delete_term , so gibt es einige Hooks, die beim Aufruf der Funktion ausgelöst werden.

Ich bin nicht sicher, ob dies der beste Weg ist, aber es funktioniert.

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

Wenn Sie also versuchen, die Kategorie "Undeletable" (über das MenüQuick Edit) zu löschen, wird Folgendes ausgegeben:

 can't delete category 

Da das Löschen über Ajax erfolgt, wird die Ausführung abgebrochen und WP gibt diese Fehlermeldung aus (das Ändern dieses Texts verdient eine separate Frage).

Wenn wir "Massenaktionen" verwenden, wird diese wp_die() auf dem Bildschirm gedruckt.


Aber das ist nicht alles. Vor dem eigentlichen Löschen (Aktions-Hook delete_term_taxonomy) sind die untergeordneten Kategorien der von uns blockierten Kategorie "nicht übergeordnet", Zeile # 1772 :

// Aktualisiere Kinder so, dass sie auf neue Eltern zeigen

Es gibt noch einen weiteren Haken, an dem diese Aktion ausgeführt wird, und wir können eine frühe Pause einfügen, um das "Unparenting" zu verhindern:

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

Verwenden Sie dies in einem Must Use Plugin und es wird automatisch im Netzwerk aktiv.


Der obige Schnappschuss enthält eine benutzerdefinierte ID-Spalte in der Kategorieliste. Dies geschieht mit dem folgenden Code (hier mit einer zusätzlichen Spalte, in der die Kategorien "Nicht löschbar" mit einer großen roten Kugel markiert sind):

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>';
}

Voll funktionsfähiges Plugin: https://Gist.github.com/4110831

5
brasofilo

Vielleicht können Sie sich mit der Aktion "delete_term" in die Funktion wp_delete_term einbinden (siehe Info unter: http://adambrown.info/p/wp_hooks/hook/delete_term?version=3.4&file=wp-includes/taxonomy.php ). und wenn ein bestimmter Begriff gelöscht wird, können Sie ihn erneut einfügen ...

dies ist keine so saubere lösung und die benutzer würden sich ein wenig wundern, dass der begriff nach dem klicken auf "link löschen" noch übrig bleibt, aber er kann den job erledigen, eigentlich denke ich, es ist nur eine lösung ...

1
Roman