ACF文本区域字段开启自动加段落时如何转义输出并保留自定义CSS类?
以下两种方案都可以实现安全转义输出的同时,保留你设置的p标签自定义类:
方案1:使用WordPress官方wp_kses白名单过滤(无需修改现有ACF字段设置)
该方案通过指定允许的HTML标签和属性白名单,过滤掉所有恶意内容,仅保留合法的带自定义类的p标签输出,适配你当前的ACF配置:
<?php $notice = '<p class="footer__paragraph">Some text.</p>'; $text = get_field( 'text', 'option' ); if ( $text ) { // 为p标签添加自定义类 $text_with_class = str_replace( '<p>', '<p class="footer__paragraph">', $text ); // 定义白名单:仅允许带class属性的p标签存在 $allowed_html = [ 'p' => [ 'class' => [], ], ]; // 过滤后输出,自动移除所有不在白名单内的标签和属性 echo wp_kses( $text_with_class, $allowed_html ); } else { echo $notice; } ?>
方案2:手动控制格式化逻辑(安全性更高)
你可以先修改ACF Text Area字段的「New Lines」选项为「No Formatting」(不自动格式化),在代码中手动完成转义、换行转段落的逻辑,完全掌握输出流程,避免str_replace可能出现的误匹配问题:
<?php $notice = '<p class="footer__paragraph">Some text.</p>'; // 获取未经过自动格式化的纯文本内容 $raw_text = get_field( 'text', 'option' ); if ( $raw_text ) { // 先对纯文本做转义处理,规避XSS风险 $escaped_text = esc_html( $raw_text ); // 按换行拆分内容,逐行生成带自定义类的p标签 $paragraph_lines = explode( "\n", $escaped_text ); foreach ( $paragraph_lines as $line ) { $trimmed_line = trim( $line ); if ( ! empty( $trimmed_line ) ) { echo '<p class="footer__paragraph">' . $trimmed_line . '</p>'; } } } else { echo $notice; } ?>
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

