如何用wp_insert_post插入含&标题的WordPress文章?避免转义
解决WordPress wp_insert_post标题&符号重复转义问题
方案1:还原转义后再传入
WordPress的wp_insert_post会自动对标题做转义处理,如果你的标题已经是转义后的内容(比如包含&),直接传入会触发二次转义。可以先把转义后的标题还原成原始文本,再传入函数:
// 示例:已转义的标题 $escaped_title = "Tips & Tricks"; // 解码转义字符,还原为原始文本 $raw_title = htmlspecialchars_decode($escaped_title); // 组装文章数据 $post_args = array( 'post_title' => $raw_title, 'post_content' => '文章内容', 'post_status' => 'publish', 'post_type' => 'post' ); wp_insert_post($post_args);
如果你的标题本身就是未转义的原始文本(比如直接是Tips & Tricks),不要手动提前转义,让wp_insert_post自动处理即可,存储后会是正确的&,前端输出时会正常显示为&。
方案2:用钩子在插入前修正
通过wp_insert_post_data钩子,在数据写入数据库前直接修改标题,避免二次转义:
add_filter('wp_insert_post_data', 'correct_title_ampersand', 10, 2); function correct_title_ampersand($data, $postarr) { // 把重复转义的&替换为正确的& if (strpos($data['post_title'], '&') !== false) { $data['post_title'] = str_replace('&', '&', $data['post_title']); } // 或者通过解码+重新转义,确保只转义一次 $data['post_title'] = htmlspecialchars(htmlspecialchars_decode($data['post_title'])); return $data; }
这个钩子会在wp_insert_post处理完数据但还没写入数据库时触发,直接修正标题内容,无需后续手动调用$wpdb->update。
问题根源
当传入的标题已经包含HTML转义后的&,wp_insert_post内部的转义逻辑会再次把&转成&,导致原本的&变成&。核心解决思路是确保传入的标题是原始未转义状态,或者在插入前把重复转义的内容修正。
内容的提问来源于stack exchange,提问作者dominikgschossmann
相关产品推荐
相关产品推荐

