WordPress lässt standardmäßig nur Administratoren ungefiltert HTML im Editor eingeben und speichern. Bei allen anderen User-Rollen wird weggefiltert, was nicht in einem festgelegten Set von Elementen und Attributen vorhanden ist, etwa svg
-Elemente oder das sizes
-Attribut für img
-Elemente. Das betrifft auch HTML, das von Blöcken und nicht direkt von Usern generiert wird, was zu interessanten Ergebnissen führen kann.
Wenn ein Block zum Beispiel abhängig von der Eingabe des Users SVG-Code erzeugt und speichert, etwa eine Sterne-Skala für einen Reviews-Block, kommt es zu folgendem Verhalten: Admins können den Block problemlos nutzen, bei Redakteuren und Redakteurinnen wirft er nach dem Neuladen des Editors allerdings einen Fehler, weil unerwartet HTML des Blocks (die SVG-Sterne) fehlt.
Mir ist das unter anderem bei einem Slider-Block passiert, der in den generierten img
-Elementen auch das sizes
-Attribut setzt. Das ist aber nicht im Set der erlaubten Elemente und Attribute, wird für alle Rollen unter Admin also rausgefiltert.
Das Problem lässt sich mit dem wp_kses_allowed_html
-Filter beheben, der ein Array mit den erlaubten Tags und zugehörigen Attributen übergeben bekommt, sowie den Kontext, etwa post
für den Bearbeitungskontext von Beiträgen und Seiten. Der folgende Code-Schnipsel sorgt dafür, dass das sizes
-Attribut nicht länger entfernt wird:
/**
* Allow the img sizes attribute for non-admin backend users in editor.
*/
add_filter( 'wp_kses_allowed_html', function( $allowed_tags, $context ) {
if ( $context !== 'post' ) {
return $allowed_tags;
}
// Add sizes attribute to img.
if ( isset( $allowed_tags['img'] ) ) {
$allowed_tags['img']['sizes'] = true;
}
return $allowed_tags;
}, 10, 2 );
Code-Sprache: PHP (php)
Jetzt können auch User ohne Admin-Rechte den Block mit dem sizes
-Attribut im gespeicherten Markup problemlos nutzen.