Capabilities für einzelne Terms in WP 4.7

Das Erstellen, Bearbeiten und Löschen einer einzelnen Kategorie war bisher nur über ein Recht möglich. So lassen sich Zugriffsrechte nur schwer auf atomarer Ebene verwalten. Seit WordPress 4.7 ist das dank ein paar mehr Capabilities einfacher, welche eine viel feinere Kontrolle ermöglichen. Read the more up to date and famous one afterwards!
Ordentliche und schnelle unit tests in WordPress
Open in new tab for later

Haben Sie auch das Problem, dass WordPress nur unzureichend Rollen und Rechte verteilt? In diesem Fall freue ich mich über ein Kommentar und versuche auf jeden Fall das Problem zu lösen.

Kleinteiligere Zugriffsrechte seit WordPress 4.7

Nur ein einzige Recht zu haben reicht lange nicht, um den vielfältigen Anforderungen gerecht zu werden. Angenommen ein Benutzer, z.B. ein Admin, soll sich um die Kategorien und Schlagworte kümmern mit bearbeiten und löschen. Ein anderer Benutzer, z.B. ein Autor, darf diese Kategorien nicht bearbeiten, sondern soll sie nur nutzen. Das war bis WordPress 4.7 nicht trennbar und benötigte gleich mehrere eigene Rechte.

Anfang 2016 trug John James Jacoby dieses Problem in dem Ticket „Cannot check capabilities on single taxonomy terms“ vor und schrieb darin (übersetzt):

Das bedeutet, dass es zur Zeit nicht möglich ist (nicht einmal mit Filtern) einzelne Terms anzusteuern und Benutzer vor dem Bearbeiten oder Löschen zu hindern.

John Blackbourn löste das Problem am 1. Oktober 2016, indem er weitere Rechte für genau diese Anforderungen schuf. Diese erlauben es einem Entwickler viel flexibler mit den Rechten einzelner Taxonomien umzugehen, sagte Boone Gorges und schlug mit den generischen Capabilities „list_{taxonomy}“ und „create_{taxonomy}“ ein noch dynamischeres Rechtesystem vor. Bisher wurden allerdings nur die folgenden Rechte neu eingeführt:

  • edit_term
  • delete_term
  • assign_term
  • manage_post_tags
  • edit_categories / edit_post_tags
  • delete_categories / delete_post_tags
  • assign_categories / assign_post_tags

All diese Rechte gehören weiterhin dem primitiven „manage_categories“ an. Dies nur, um das Ganze Rückwärtskompatibel zu halten und die bisherigen internen Abläufe von WordPress nicht zu stören.

Hier werden die neuen Rechte genutzt

Das alleinige Einführen dieser neuen Rechte reicht noch lange nicht. Sie müssen auch im Core verwendet werden. In WordPress 4.7 kann das „assign_term“ Recht an diesen Stellen gefunden werden:

  • \wp_xmlrpc_server::wp_getTerm() über das die Terms per RPC verwaltet werden können.

Das delete_term wird verwendet in …

  • wp_ajax_delete_tag() , um Tags per AJAX zu entfernen.
  • \WP_Terms_List_Table::get_bulk_actions()::column_cb() und  ::handle_row_actions() welche die Bulk-Actions in der Listenansicht einer Taxonomie managen.
  • wp-admin/edit-tags.php natürlich, welches auch das Löschen von Terms verwaltet.
  • \wp_xmlrpc_server::wp_deleteTerm() welches alle Art von Terms per RPC löscht.

Das Recht edit_term wird benutzt in…

  • wp_ajax_inline_save_tax() über das Terms per AJAX geändert werden.
  • \WP_Terms_List_Table::handle_row_actions() welches die Listenansicht über eine Taxonomie verwaltet.
  • wp-admin/edit-tags.php natürlich, weil hier die Tags bearbeitet werden.
  • wp-admin/term.php welches das Formulat zum Bearbeiten von Terms bereitstellt.
  • wp-includes/admin-bar.php welche einen Bearbeiten-Link auf der Detailseite einer Kategorie anbietet.
  • \wp_xmlrpc_server::wp_newTerm() und ::wp_editTerm() über die Kategorien per RPC erstellt und bearbeitet werden.
  • get_edit_term_link() und edit_term_link() welches die URL zu einem Term zusammenstellt.

Das neue manage_terms wird in wp_ajax_add_link_category() genutzt, welches eine Kategorie per AJAX erstellen kann. Diese vier neuen Rechte werden also demnächst für die Taxonomien „category“ und „post_tag“ verwendet.

Mit den neuen Term Capabilities arbeiten

Im Grunde kann nun die CRUD (Erstellen, Lesen, Bearbeiten und Löschen) je Benutzer an und abgeschaltet werden. Das ist eine sehr feinkörnige Verwaltung des Ganzen. Nehmen wir diese Gedanken und spielen ein bisschen damit herum.

Verbieten Kategorien mit Inhalten zu löschen

Wie bereits gesagt wird das „delete_term“-Recht an manchen Stellen genutzt. All diese Punkte prüfen, ob der aktuell angemeldete Benutzer das Recht hat die gezeigte Kategorie zu löschen. Meißt geschieht dies über ein current_user_can( 'delete_term', $tag_id ), welches als Grundlage für dieses Snippet dient:

add_filter(
  'user_has_cap',
  function ( $allcaps, $caps, $args ) {
    if ( ! isset( $args[0] ) || 'delete_term' != $args[0] ) {
      // not the deletion process => ignore
      return $allcaps;
    }

    $term = get_term( $args[2] );

    if ( $term->count <= 0 ) {
      // no post in this term => allow deletion
      return $allcaps;
    }

    // some other case => reject
    return [ ];
  },
  10,
  3
);

Kategorien denen noch Beiträge zugewiesen sind können fortan nicht mehr gelöscht werden. Mehr noch, der Link zum Löschen erscheint nicht mehr im Backend.

No delete button for non-empty categories.
Kein „Delete“ Link im Backend mehr zu sehen für die Kategorie „General“

Fazit

Das ist Großartig, denn es gibt etwas mehr Kontrolle über das was jeder einzelne Benutzer je Term darf. John Jacoby benötigte diese Rechte, um ein eigenes Plugin zu schreiben. Darüber sollen künftig einzelne Terms „gelockt“ werden können – coole Idee!

screen-161010-232313

Mir gefällt es immer, wenn die Rollen und das Rechtesystem von WordPress verbessert wird. Es gab so viele Momente in denen das Umsetzen der Kundenanforderungen einfach nur mühselig oder schlichtweg nicht möglich war, weil es die altbackenen Zugriffsrechte nicht hergaben. Zum Glück wird es nun etwas detaillierter und kann sich wieder ein Stück mehr mit den großen CMS messen.

Wenn Ihnen noch eine andere Idee kommt, was mit diesen Rechten gemacht werden kann dann gern kurz in einem Kommentar hinterlassen. Vor allem, wenn es an anderer Stelle ähnliche Probleme gibt. Mittlerweile habe ich oft und viel mit dem Rechtesystem gearbeitet. Mein Wissen dazu teile ich gern und kann bestimmt bei der Lösung behilflich sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *