使用wp_insert_post()插入含HTML内容不生效的问题
WordPress编程生成页面时HTML内容无法显示的解决方法
问题根源
你代码里对HTML内容的处理逻辑完全搞反了:
- 先通过
html_entity_decode把实体化的HTML(比如<div>)转成了真实的<div>标签,这步是对的; - 但紧接着又用
str_replace把<和>转回到<和>,等于把HTML标签又变成了纯文本字符,WordPress自然只会显示代码文本,不会渲染成页面元素。
另外还有个小错误:comment_status和ping_status的取值应该是'closed',不是'close',拼写错误会导致状态设置不生效。
修正后的代码
// 假设$content是你拿到的实体化HTML内容(比如示例里的<div...>) $content = str_replace('\r\n','',$content); $content = html_entity_decode($content); // 这一步把实体转成真实HTML标签,保留即可 // 创建页面 $postData = array( 'comment_status' => 'closed', // 修正拼写错误 'ping_status' => 'closed', // 修正拼写错误 'post_author' => 1, 'post_title' => ucwords('title_of_the_page'), 'post_name' => strtolower(str_replace(' ', '-', trim('title_of_the_page'))), 'post_status' => 'publish', 'post_content' => $content, 'post_type' => 'page' ); kses_remove_filters(); // 移除HTML过滤,确保自定义HTML能被完整保存 wp_insert_post($postData); kses_init_filters(); // 恢复过滤,避免影响其他操作
额外说明
- 如果你的原始
$content已经是真实的HTML代码(不是实体化的),那可以直接去掉html_entity_decode($content)这一步; kses_remove_filters()是为了绕过WordPress的HTML安全过滤,确保自定义的带类名、属性的HTML标签能被完整保存,操作完成后记得用kses_init_filters()恢复过滤,防止后续操作出现安全问题;- 测试时可以先输出
$content看看是否是正常的HTML结构,确认没问题再执行插入操作。
内容的提问来源于stack exchange,提问作者ILG
相关产品推荐
相关产品推荐

