本文详解如何在wordpress商品保存时安全添加或更新自定义元字段(如main_reward、s
ub_reward),通过使用`save_post_product`钩子、校验autosave及改用`update_post_meta`,彻底解决元数据重复插入问题。
在WordPress开发中,使用save_post钩子处理商品元数据保存时,常遇到元字段被重复写入(如预期2条却生成4条)的问题。根本原因有三:
✅ 正确做法是:
以下是推荐的健壮实现:
add_action( 'save_post_product', 'so71077799_add_rewards', 99, 1 );
function so71077799_add_rewards( $product_id ) {
// 阻止自动保存、AJAX保存、批量操作等非手动提交场景
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
return;
}
// 确保当前用户有编辑权限(可选但强烈建议)
if ( ! current_user_can( 'edit_post', $product_id ) ) {
return;
}
// 安全获取并格式化价格数据(保留两位小数)
$reg_price = isset( $_POST['_regular_price'] )
? number_format( floatval( $_POST['_regular_price'] ), 2, '.', '' )
: '0.00';
$sal_price = isset( $_POST['_sale_price'] )
? number_format( floatval( $_POST['_sale_price'] ), 2, '.', '' )
: '0.00';
// 使用 update_post_meta 实现“存在即更新,不存在即添加”
update_post_meta( $product_id, 'main_reward', $reg_price );
update_post_meta( $product_id, 'sub_reward', $sal_price );
}? 关键注意事项:
通过以上优化,你的main_reward和sub_reward元字段将严格保持唯一性,每次保存仅生成/更新各1条记录,彻底消除重复数据隐患。