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无法识别这个返回值,要么忽略错误继续保存,要么因数据格式错误静默失败,自然看不到任何提示效果。
正确实现方案
要实现这个需求,得拆分两步走:
- 在
wp_insert_post_data钩子中检测摘要长度,不符合要求时,把错误信息存到临时缓存,然后跳转回编辑页面阻止保存。 - 通过
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
相关产品推荐
相关产品推荐

