我有一个建在古腾堡的街区--在里面我使用了“@wordpress/components”中的Icon元素
我使用一个箭头创建一个下拉列表,它以SVG的形式呈现。当然,当任何不是超级管理员或管理员的人保存这个块时,SVG就会被剥离,并且没有找到与save()函数匹配的块中断。
出于安全原因,我不想在网站上白名单所有的SVGs所以理想情况下,我只想白名单这个。我原以为WP也能传递可接受的值,但我错了。
function allow_arrow_svg( $tags ) {
$tags['svg'] = array(
'aria-hidden' => array( 'true', 'false' ),
'role' => array( 'img' ),
'xmlns' => array( 'http://www.w3.org/2000/svg' ),
'width' => array( '20' ),
'height' => array( '20' ),
'viewbox' => array( '0 0 20 20' ),
'style' => array( 'color', 'fill' ),
'class' => array(),
);
$tags['path'] = array(
'd' => array( 'M5 6l5 5 5-5 2 1-7 7-7-7z' ),
);
return $tags;
}
add_filter( 'wp_kses_allowed_html', 'allow_arrow_svg', 10, 2 );将是完美的-但不工作,因为我仍然可以传递各种属性的任何东西。
有什么建议吗?谢谢你抽出时间:)
发布于 2021-04-19 10:51:50
这个问题在某种程度上改变了被问到的问题--不过,如果其他一些mug在他们的保存函数中反应过度,那么这个问题可能是有用的。
因此,正如@Tom J Nowell所建议的那样,这一问题得到了解决,取而代之的是进行了一个PHP回调,以允许保存。我不推荐这个块,并将SVG从save函数中移除,这样反推荐中的save函数包含SVG,而新的则不包含SVG。
因此,旧块不会显示SVG两次,但是新块可能会被迁移--在块迁移中强制设置属性--在块反推荐函数下,记住在新版本的块注册中声明新的blockVersion属性--我将块注册的PHP和JS端的默认值设置为null。
migrate( attributes ) {
attributes.blockVersion = '2.0.0';
return { ...attributes }在render_callback函数下,只有当获得版本属性'2.0.0‘时,我才呈现SVG服务器端。如下所示:
/**
* Callback function to render the block on the front end
*
* @since 2.0.0
* @param Array $attributes Array of block attributes
* @param String $content Block content
*
* @return String HTML
*/
function render_block( $attributes, $content ) {
if ( ! empty( $attributes['blockVersion'] ) && version_compare( $attributes['blockVersion'], '2.0.0', '>=' ) ) {
$arrow_colour = esc_attr( $attributes['svgColor'] );
$position = esc_attr( $attributes['position'] );
$svg = "";
return "
$svg
$content
";
} else {
return $content;
}
}最后,在块的编辑函数中--我使用setAttribute()将属性设置为'2.0.0‘,这样新块在内容中始终具有块版本的非默认值。这允许PHP获取不同的版本。
https://wordpress.stackexchange.com/questions/386672
复制相似问题