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

WordPress自定义文章摘要长度超限错误提示问题

问题

我尝试在functions.php中编写函数,实现创建或编辑文章时,若摘要字段文本长度超过50字符,就向作者显示“maximum character allowed is 50 max”的错误提示。先后尝试两段代码均未生效:

  • 第一段代码执行后始终报错“Updating failed. Could not update post in the database.”
  • 第二段代码没有任何效果

尝试的第一段代码

function general_admin_notice(){
    global $pagenow;
    echo '<div class="notice notice-error is-dismissible">
             <p>maximum character allowed is 50 max</p>
         </div>';
}


function filter_post_data( $data , $postarr) {

    if (strlen($data["post_excerpt"]) > 50){
        
        return add_action('admin_notices', 'general_admin_notice');
    }
    return $data;
}

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

尝试的第二段代码

function filter_post_data( $data , $postarr) {

    if (strlen($data["post_excerpt"]) > 50){
        
        return '<div class="notice notice-error is-dismissible">
        <p>maximum character allowed is 50 max</p>
    </div>';
    }
    return $data;
}

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

代码错误分析

第一段代码问题

wp_insert_post_data过滤器要求返回处理后的文章数据数组,但你在判断条件里返回了add_action()的执行结果(布尔值),直接破坏了WordPress需要的文章数据结构,导致系统无法正常保存文章,所以出现数据库更新失败的错误。

第二段代码问题

同样,你在判断条件里返回了HTML字符串,而非正确的文章数据数组,WordPress无法识别这个返回值,要么忽略错误继续保存,要么因数据格式错误静默失败,自然看不到任何提示效果。

正确实现方案

要实现这个需求,得拆分两步走:

  1. 在wp_insert_post_data钩子中检测摘要长度,不符合要求时,把错误信息存到临时缓存,然后跳转回编辑页面阻止保存。
  2. 通过admin_notices钩子读取缓存里的错误信息并显示。

完整代码如下:

// 显示摘要长度错误提示
function excerpt_length_error_notice() {
    // 只在文章编辑/新建页面触发
    if ( !in_array(get_current_screen()->id, ['post', 'post-new']) ) {
        return;
    }
    
    // 读取临时存储的错误信息
    $error_msg = get_transient('excerpt_length_error');
    if ( $error_msg ) {
        echo '<div class="notice notice-error is-dismissible">
                <p>'. esc_html($error_msg) .'</p>
              </div>';
        // 显示完就删除缓存,避免重复提示
        delete_transient('excerpt_length_error');
    }
}
add_action('admin_notices', 'excerpt_length_error_notice');

// 验证摘要长度并阻止不符合要求的文章保存
function validate_excerpt_length($data, $postarr) {
    // 只针对文章类型(需要的话可以改成自定义文章类型)
    if ( $data['post_type'] !== 'post' ) {
        return $data;
    }
    
    // 去掉首尾空白后检查长度
    if ( strlen(trim($data['post_excerpt'])) > 50 ) {
        // 临时存储错误信息,有效期10秒
        set_transient('excerpt_length_error', 'maximum character allowed is 50 max', 10);
        
        // 跳转回文章编辑页面,终止脚本执行,阻止保存
        wp_safe_redirect(add_query_arg('post', $postarr['ID'], admin_url('post.php?action=edit')));
        exit;
    }
    
    return $data;
}
add_filter('wp_insert_post_data', 'validate_excerpt_length', 99, 2);

代码说明

  • 用set_transient临时存错误信息:因为wp_insert_post_data执行时,admin_notices还没触发,没法直接显示提示,缓存能跨请求传递信息。
  • wp_safe_redirect跳转加exit:直接终止保存流程,确保不符合要求的文章不会被存到数据库。
  • 加页面和文章类型判断:避免在设置页、自定义文章类型页面等无关场景触发提示。
  • esc_html转义输出:防止XSS安全问题,符合WordPress开发规范。

内容的提问来源于stack exchange,提问作者im-learning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:30:39