В основном я сохраняю пользовательский пост на 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);' ) );
}
}
}