caogenbj 原来输出 meta description 是这样写的:
<meta name="description" content="<?php echo $miaoxu; ?>" />
裸输出,没有转义。
如果某篇文章的描述里带双引号(比如“电信”星卡“29元套餐”),输出就变成:
<meta name="description" content="电信"星卡"29元套餐" />
浏览器解析到第二个引号,就认为 content 结束了。后面的内容全成垃圾。用户看到的描述断在第一个引号处。
| 函数 | 用在哪 | 例子 |
|---|---|---|
esc_html() |
标签之间的纯文本 | <p><?php echo esc_html($x); ?></p> |
esc_attr() |
标签属性值里 | content="<?php echo esc_attr($x); ?>" |
esc_url() |
href / src | <a href="<?php echo esc_url($url); ?>"> |
esc_js() |
内联 JS 字符串 | 很少用 |
按“位置”选,不要混用。
" → "' → '& → &< > → < >中文、数字、普通标点都不受影响。所以 99% 的内容转完看起来没变化。
两个原因:
哪怕现在的内容“都是自己写的、不会带引号”,也应该转——因为以后可能会变。
esc_attr 和 esc_html 在 WordPress 源码里实现几乎一样(都转那几个字符)。实际效果没区别。
区分它们主要是语义:让后来看代码的人知道你清楚自己在干什么。另外它们挂的过滤器名字不同,个别插件可能只处理其中一个。
所以还是按位置选,别图省事乱用。
输出的是你已经确认安全的 HTML时,不能转——转了就把标签也转成文本了。
比如 the_content() 输出的正文,里面本来就有 <p> <h2>,你不能再 esc_html,否则标签全变成可见的代码。
规则:输出“纯文本”要转义,输出“可信 HTML”不转义。
一句话记住:属性里用 esc_attr,标签之间用 esc_html,链接用 esc_url;纯文本必转,可信 HTML 不转。
下一篇是卷四最后一篇:一份主题体检清单。