You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成带修改日期的WordPress嵌套页面列表时遇JSON响应错误求助

解决WordPress短代码保存时的JSON响应错误及实现嵌套页面列表

问题根源

  1. 修改日期获取错误:原代码中get_the_modified_time()依赖全局$post对象,未关联传入的$post_id,导致获取的修改日期可能不正确,甚至输出异常内容干扰AJAX响应。
  2. HTML实体转义错误:代码中使用<、>等实体转义字符,导致输出的是纯文本而非可解析的HTML标签,块编辑器处理时触发JSON格式错误。
  3. 未实现嵌套层级:原代码仅平铺所有页面,未处理页面的父子层级关系,不符合嵌套显示需求。

修正后的代码

将以下代码替换原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:24:57