When i needed a solution to the save “problem” i create an Ajax function to validate the fields and did some minor JQuery hacks:
first we add our JavaScript to capture the submit/publish event and use it to submit our own ajax function before the actual submit
add_action('wp_print_scripts','my_publish_admin_hook');
function my_publish_admin_hook(){
if (is_admin()){
?>
<script language="javascript" type="text/javascript">
jQuery(document).ready(function() {
jQuery('#post').submit(function() {
var form_data = jQuery('#post').serializeArray();
form_data = jQuery.param(form_data);
var data = {
action: 'my_pre_submit_validation',
security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
form_data: form_data
};
jQuery.post(ajaxurl, data, function(response) {
if (response.indexOf('True') > -1 || response.indexOf('true') > -1 || response = true || response) {
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
return true;
}else{
alert("please correct the following errors: " + response);
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
return false;
}
});
return false;
});
});
</script>
<?php
}
}
then we create the function to do the actual validation:
add_action('wp_ajax_my_pre_submit_validation', 'pre_submit_validation');
function pre_submit_validation(){
//simple Security check
check_ajax_referer( 'pre_publish_validation', 'security' );
//do your validation here
//all of the form fields are in $_POST['form_data'] array
//and return true to submit: echo 'true'; die();
//or your error message: echo 'bal bla bla'; die();
}
you can always change it up a bit to do the validation on the client side but i prefer on the server side.