自定义后验证,然后在服务器端验证后发布


Custom post validation and then publishing after validation checked on serverside - wordpress

基本上我在wordpress上保存一个自定义的帖子。我决定在服务器端自定义验证。下面是我的代码的简化版本。我在这里遇到的问题是-尽管检查,它似乎将自己降级为未决模式,尽管字段被填充。你知道我哪里做错了吗?

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);' ) );
        }
    }
}

当帖子发布时,它调用的动作是publish_post