自定义文章类型元框自动导入空值至数据库的修复咨询
解决自定义文章类型仅在发布时保存元数据的问题
嘿,我来帮你搞定这个问题!你现在遇到的情况是因为save_post钩子的触发时机太宽泛——它在新建草稿、自动保存、发布文章甚至预览文章时都会跑一遍,所以当你刚点击“添加新文章”创建草稿时,你的代码就已经执行了元数据更新,把空值塞进post_meta表了。
咱们只需要给保存函数加几个关键判断,就能让它只在文章发布时才干活:
修改后的完整代码
function wpdocs_save_meta_box_mac($post_ID = 0) { // 跳过自动保存的情况 if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { return $post_ID; } // 检查当前用户有没有编辑这篇文章的权限,增强安全性 if ( !current_user_can('edit_post', $post_ID) ) { return $post_ID; } $post = get_post($post_ID); $post_type = get_post_type( $post_ID ); // 核心判断:只针对目标自定义文章类型,且文章状态为「发布」时才执行更新 if ( "mactahminleri" == $post_type && $post->post_status === 'publish' ) { // 安全处理用户输入,同时避免未定义索引的警告 $_mac_baslik = sanitize_text_field( $_POST['_mac_baslik'] ?? '' ); $_mac_tarih = sanitize_text_field( $_POST['_mac_tarih'] ?? '' ); $_mac_saat = sanitize_text_field( $_POST['_mac_saat'] ?? '' ); $_mac_kod = isset($_POST['_mac_kod']) ? $_POST['_mac_kod'] : ''; $_mac_tahmin = sanitize_text_field( $_POST['_mac_tahmin'] ?? '' ); $_mac_sonuc_iy = isset($_POST['_mac_sonuc_iy']) ? $_POST['_mac_sonuc_iy'] : ''; $_mac_sonuc_ms = isset($_POST['_mac_sonuc_ms']) ? $_POST['_mac_sonuc_ms'] : ''; $_mac_oran = isset($_POST['_mac_oran']) ? $_POST['_mac_oran'] : ''; $_mac_afflink = isset($_POST['_mac_afflink']) ? $_POST['_mac_afflink'] : ''; $_mac_durum = isset($_POST['_mac_durum']) ? $_POST['_mac_durum'] : ''; // 可选优化:如果字段是空值,就不更新到数据库(彻底避免空元数据) if (!empty($_mac_baslik)) { update_post_meta( $post_ID, '_mac_baslik', $_mac_baslik ); } if (!empty($_mac_tarih)) { update_post_meta( $post_ID, '_mac_tarih', $_mac_tarih ); } if (!empty($_mac_saat)) { update_post_meta( $post_ID, '_mac_saat', $_mac_saat ); } // 其他字段你可以根据需求决定是否保留空值判断,这里先按原逻辑保留 update_post_meta( $post_ID, '_mac_kod', $_mac_kod ); update_post_meta( $post_ID, '_mac_tahmin', $_mac_tahmin ); update_post_meta( $post_ID, '_mac_sonuc_iy', $_mac_sonuc_iy ); update_post_meta( $post_ID, '_mac_sonuc_ms', $_mac_sonuc_ms ); update_post_meta( $post_ID, '_mac_oran', $_mac_oran ); update_post_meta( $post_ID, '_mac_afflink', $_mac_afflink ); update_post_meta( $post_ID, '_mac_durum', $_mac_durum ); } return $post_ID; } add_action( 'save_post', 'wpdocs_save_meta_box_mac' );
关键修改点说明
- 添加发布状态判断:通过
$post->post_status === 'publish'确保代码只在文章被正式发布时执行,新建草稿、自动保存时都会直接跳过。 - 增强权限校验:加上
current_user_can('edit_post', $post_ID),防止非法用户的恶意操作,这是WordPress开发的最佳实践。 - 空值安全处理:用
??和isset()处理$_POST变量,避免PHP抛出“未定义索引”的警告。 - 可选空值过滤:如果某些字段你不想存空值,可以像
_mac_baslik那样加!empty()判断,彻底杜绝空元数据进入数据库。
这样修改后,只有当你点击“发布”按钮,文章状态变为publish时,元数据才会被更新到数据库里,新建文章的草稿状态下不会再产生空的元数据啦~
内容的提问来源于stack exchange,提问作者Ismail Altunören
相关产品推荐
相关产品推荐

