Basically I am saving a custom post on wordpress. I have decided to custom validation on the server side. Below is a simplified version of my code. The problem I am having here is – despite the check, it seems to relegate itself into pending mode despite the field being filled in. Any ideas where I am going wrong?
add_action ('save_post', 'save_campaigns', 10, 2);
add_action ('save_post', 'completion_validator', 20, 2);
function save_campaigns($pid, $post)
{
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_tatus == 'auto-draft' ) return $pid;
if ( $post->post_type != 'work' ) return $pid;
update_post_meta($pid, 'campaign_client', $_POST['campaign_client']);
}
function completion_validator($pid, $post)
{
// don't do on autosave or when new posts are first created
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
if ( $post->post_type != 'work' ) return $pid;
// init completion marker (add more as needed)
$meta_missing = false;
// retrieve meta to be validated
$clientmeta = get_post_meta( $pid, 'campaign_client', true );
// just checking it's not empty - you could do other tests...
if ( empty( $clientmeta) or empty( $shortcopymeta) or empty( $longcopymeta) or empty( $gallerymeta) or empty( $thumbnailmeta))
{
$meta_missing = true;
}
// on attempting to publish - check for completion and intervene if necessary
if ( ( isset( $_POST['publish'] ) || isset( $_POST['save'] ) ) && $_POST['post_status'] == 'publish' )
{
// don't allow publishing while any of these are incomplete
if ($meta_missing == true)
{
global $wpdb;
$wpdb->update( $wpdb->posts, array( 'post_status' => 'pending' ), array( 'ID' =>$pid ) );
// filter the query URL to change the published message
add_filter( 'redirect_post_location', create_function( '$location','return add_query_arg("message", "4", $location);' ) );
}
}
}
When the post is published, the action it calls is
publish_post
as per my knowledge.