Essentially I'm saving a custom publish using blogging platforms. I've made the decision to custom validation around the server side. Below is really a simplified version of my code. The issue I'm getting here's - regardless of the check, it appears to relegate itself into pending mode regardless of the area being completed. Any ideas where I'm 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);' ) );

        }
    }
}