Почему при сохранении или обновлении поста не появляется сообщение об ошибке?

Как мне остановить создание или обновление поста, если произвольное поле пустое, чтобы не отображалось сообщение "Запись обновлена", и вместо этого вывести сообщение об ошибке? Я уже написал соответствующий код, но сообщение "Запись обновлена" продолжает появляться, и сообщение об ошибке не выводится при пустом поле. Можете подсказать, что может быть не так в моем коде? Буду благодарен за любую помощь! <br/><br/><pre><code class="php">class Event {

public function __construct() { 
    add_action( 'add_meta_boxes', [ __CLASS__, 'fields_event' ] );
    add_action( 'save_post', [ __CLASS__, 'save_update_event' ] );
    add_action( 'admin_notices', [ __CLASS__, 'show_error_message' ] );
}

static function fields_event() {
    add_meta_box( 
        'fields_event', 
        __( 'Event info', 'mantra-house' ), 
        [ __CLASS__, 'content_box' ], 
        'post', 
        'side' 
    );
}

static function content_box( $post ) { 
    wp_nonce_field( 'save_event_meta', 'event_meta_nonce' ); ?&gt;

    &lt;div class="info-event"&gt;
        &lt;label for="start-event"&gt;
            &lt;?= __( 'Start of the event', 'mantra-house' ); ?&gt;
        &lt;/label&gt;
        &lt;input 
            id="start-event" 
            type="datetime-local" 
            name="start-event" 
            value="&lt;?= esc_attr( get_post_meta( $post-&gt;ID, 'start-event', true ) ); ?&gt;"&gt;
    &lt;/div&gt;

    &lt;style&gt;
        .postbox-header h2 {
            padding: 0 16px !important;
        }
        .info-event {
            margin-bottom: 15px;
        }
        .info-event label {
            display: block;
            margin-bottom: 5px;
        }
    &lt;/style&gt;
  • 27 ноября 2024 г. 23:03
Ответы на вопрос 1
В вашем коде не хватает проверки на пустое произвольное поле (`start-event`) в методе `save_update_event`, который отвечает за сохранение поста. В результате ошибка не обрабатывается должным образом и сообщение об успешном обновлении поста продолжает отображаться, даже если поле пустое.

Я предлагаю обновить метод `save_update_event`, чтобы убедиться, что поле заполнено, прежде чем продолжать процесс сохранения. Если поле пустое, вы можете использовать функцию `wp_die` для остановки выполнения кода и вывода сообщения об ошибке.

Вот как может выглядеть обновленный метод:

```php
static function save_update_event( $post_id ) {
    // Проверяем, была ли отправлена форма
    if ( ! isset( $_POST['event_meta_nonce'] ) || ! wp_verify_nonce( $_POST['event_meta_nonce'], 'save_event_meta' ) ) {
        return;
    }

    // Проверяем, является ли пользователь авторизованным
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

    // Проверяем, было ли сохранение автосохранением
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Получаем значение из поля
    $start_event = isset( $_POST['start-event'] ) ? trim( $_POST['start-event'] ) : '';

    // Проверяем, пустое ли поле
    if ( empty( $start_event ) ) {
        add_filter( 'redirect_post_location', function( $location ) {
            return add_query_arg( 'event_error', 'empty_field', $location );
        });
        return;
    }

    // Сохраняем значение, если поле не пустое
    update_post_meta( $post_id, 'start-event', $start_event );
}

static function show_error_message() {
    // Проверяем, есть ли ошибка
    if ( isset( $_GET['event_error'] ) && $_GET['event_error'] === 'empty_field' ) {
        echo '<div class="notice notice-error"><p>' . __( 'Пожалуйста, заполните поле "Start of the event".', 'mantra-house' ) . '</p></div>';
    }
}
```

### Объяснение кода:
1. **Проверка поля на пустоту**: В методе `save_update_event` я добавил проверку на пустоту поля `start-event`. Если поле пустое, выполнение функции завершится без сохранения поста и произойдет редирект с добавленным параметром ошибки.

2. **Использование фильтра `redirect_post_location`**: Этот фильтр используется для добавления параметра к URL, чтобы можно было передать информацию о наличии ошибки.

3. **Вывод сообщения об ошибке**: В функции `show_error_message()` проверяем наличие параметра `event_error` в URL и выводим соответствующее сообщение, если ошибка существует.

Такой подход позволит вам предотвратить обновление записи, если поле пустое, и отобразить сообщение об ошибке.
Похожие вопросы