2017-02-12 3 views
1

Я использую плагин WPCasa Dashboard, чтобы позволить пользователю отправлять объект недвижимости. Я должен использовать внешнюю службу для проверки объекта. Я хочу заблокировать WP обновление базы данных, если ответ от службы имеет ошибку.Остановить отправку wordpress, если недействительно. (WPCasa)

Я использую собственный крючок wpcasa для моей функции.


Это часть functions.php в моей детской теме:

function newListingAdded($ID, $post) { 

    ... 

    if ($post->post_date === $post->post_modified) { 
    // new post 
    $response = wp_remote_post($targetUrl.'listings/new', $options); 
    } else { 
    $response = wp_remote_post($targetUrl.'listings/update', $options); 
    } 

    $output = json_decode($response['body']); 
    if (is_array($output)) { 
    $_SESSION['messages'] = []; 
    foreach ($output as $error) { 
     if (isset($error->msg)) { 
     array_push($_SESSION['messages'], ['danger', $error->msg]); 
     } 
    } 
    } 
} 
add_action('publish_listing', 'newListingAdded', 10, 2); 

до сих пор все работает как задумано. Я просто не могу понять, как остановить wordpress от фактического представления данных.

ответ

0

Вместо того, чтобы использовать действие WPCasa publish_listing (я не смог найти его в документации WPCasa), вместо этого вы можете использовать официальный фильтр wp_insert_post_data из WordPress.

Теперь WP официально не поддерживает способ предотвращения сохранения сообщения при использовании действия/hook, однако, если вы посмотрите на исходный код WP (ссылка: https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/post.php#L3281), вы увидите, что WP принимает значение $data (ассоциативный массив пар полей/значений для сохранения в базе данных), возвращаемый из wp_insert_post_data и передающий его в $ wpdb-> update().

Если вы используете wp_insert_post_data и возвращают логическое ложное значение вместо фактического $data параметра, принимаемого фильтра, то это предотвратит пост от обновления, а $ wpdb-> обновление() проверяет, является ли $ данных является действительный массив, а не ложь, в противном случае он ничего не делает в базе данных (ссылка: https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/wp-db.php#L2023)

Таким образом, вы можете попробовать использовать этот код:

function newListingAdded($data, $postarr) { 
    if (!$data['ID']) { // If no post ID is set then it's a new post 
    $response = wp_remote_post($targetUrl.'listings/new', $options); 
    } else { 
    $response = wp_remote_post($targetUrl.'listings/update', $options); 
    } 

    $output = json_decode($response['body']); 

    if (is_array($output)) { 
    $_SESSION['messages'] = []; 

    foreach ($output as $error) { 
     if (isset($error->msg)) { 
     $_SESSION['messages'][] = ['danger', $error->msg]; // You can use the [] shorthand operator instead of the more verbose array_push() 
     $data = false; // If an error is found make $data false 
     } 
    } 
    } 

    return $data; 
} 

add_filter('wp_insert_post_data', 'newListingAdded', 10, 2); 

Вот ссылка для этого фильтра: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/

Смежные вопросы