生成带修改日期的WordPress嵌套页面列表时遇JSON响应错误求助
解决WordPress短代码保存时的JSON响应错误及实现嵌套页面列表
问题根源
- 修改日期获取错误:原代码中
get_the_modified_time()依赖全局$post对象,未关联传入的$post_id,导致获取的修改日期可能不正确,甚至输出异常内容干扰AJAX响应。 - HTML实体转义错误:代码中使用
<、>等实体转义字符,导致输出的是纯文本而非可解析的HTML标签,块编辑器处理时触发JSON格式错误。 - 未实现嵌套层级:原代码仅平铺所有页面,未处理页面的父子层级关系,不符合嵌套显示需求。
修正后的代码
将以下代码替换原functions.php中的对应内容:
// 获取页面最后修改日期 function wpb_last_modified_date( $post_id ) { // 使用get_post_modified_time直接指定页面ID,无需依赖全局$post return get_post_modified_time( 'F jS, Y', false, $post_id, false ); } // 递归生成嵌套页面列表 function wpb_list_pages_recursive( $parent_id = 0 ) { $pages = get_pages( array( 'parent' => $parent_id, 'sort_column' => 'menu_order', 'sort_order' => 'ASC' ) ); if ( empty( $pages ) ) { return ''; } $html = '<ul>'; foreach ( $pages as $page ) { $last_modified = wpb_last_modified_date( $page->ID ); // 对链接和标题进行安全转义,避免XSS风险 $html .= '<li><a href="' . esc_url( get_permalink( $page->ID ) ) . '">' . esc_html( $page->post_title ) . '</a> (Last modified: ' . esc_html( $last_modified ) . ')'; // 递归处理子页面 $html .= wpb_list_pages_recursive( $page->ID ); $html .= '</li>'; } $html .= '</ul>'; return $html; } // 短代码处理函数,使用输出缓冲确保返回完整字符串 function wpb_list_pages() { ob_start(); echo wpb_list_pages_recursive(); return ob_get_clean(); } add_shortcode( 'list_pages', 'wpb_list_pages' );
关键改进说明
- 正确获取修改日期:改用
get_post_modified_time()并传入页面ID,确保获取对应页面的准确修改时间。 - 移除无效转义:直接使用HTML标签而非实体转义字符,保证输出的是可被编辑器正确解析的HTML结构。
- 输出缓冲处理:通过
ob_start()和ob_get_clean()捕获输出内容,避免直接输出打断AJAX请求的JSON响应格式。 - 嵌套层级实现:新增递归函数处理页面父子关系,生成嵌套的列表结构。
- 安全转义:使用
esc_url()和esc_html()对输出内容进行转义,符合WordPress安全开发规范。
内容的提问来源于stack exchange,提问作者devco2023
相关产品推荐
相关产品推荐

