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

Вопрос или проблема

На данный момент у меня есть это действие, добавленное к pre_post_update, 10, 3

public function check1($post_id, $data){
    if (1==1) {
        set_transient('1_is_1'. $post_id, true, 30);
    }
    return $data;
}

А затем я добавил это действие к admin_notices:

public function display_1_is_1_warning() {
    global $post;

    if (isset($post->ID) && get_transient('1_is_1' . $post->ID)) {
        echo '<div class="notice notice-success is-dismissible">
                <p>1 равно 1</p>
              </div>';

        delete_transient('1_is_1' . $post->ID);
    }
}

HTML уведомления добавляется, и я вижу, что он находится внутри div с классами wrap hide-if-js block-editor-no-js, и он скрыт. Нужно ли что-то сделать на стороне JS, чтобы он появился?

Ответ или решение

Для того чтобы правильно отображать уведомление в редакторе WordPress, когда пользователь сохраняет пост и определенные условия соблюдены, вам необходимо не только добавить PHP-код для установки временных данных и отображения уведомлений, но и убедиться, что уведомления корректно отображаются в интерфейсе редактора, особенно при использовании блокового редактора (Gutenberg).

Шаги для решения проблемы

  1. Убедитесь, что вы используете правильные хуки:
    Ваш код на текущий момент использует хук pre_post_update, чтобы установить временные данные. Это хорошо, но вам нужно убедиться, что уведомление будет отображено в правильном месте.

  2. Создайте уведомление в зависимости от того, используется ли блоковый редактор:
    Чтобы уведомление отображалось в блоковом редакторе, вам нужно убедиться, что вы добавляете его с помощью соответствующего JavaScript-кода, так как уведомления в Gutenberg обрабатываются через JavaScript.

Пример кода

Приведем пример, который включает все необходимые части:

add_action('pre_post_update', 'check1', 10, 2);
function check1($post_id, $data){
    if (1 == 1) { // Ваши условия
        set_transient('1_is_1' . $post_id, true, 30);
    }
    return $data;
}

add_action('admin_notices', 'display_1_is_1_warning');
function display_1_is_1_warning() {
    global $post;

    if (isset($post->ID) && get_transient('1_is_1' . $post->ID)) {
        ?>
        <div class="notice notice-success is-dismissible">
            <p>1 is 1</p>
        </div>
        <?php

        delete_transient('1_is_1' . $post->ID);
    }
}

// Добавляем поддержку уведомлений в Gutenberg
add_action('enqueue_block_editor_assets', 'enqueue_admin_js');
function enqueue_admin_js() {
    wp_enqueue_script('admin-notices', get_template_directory_uri() . '/js/admin-notices.js', array('wp-data'), '1.0', true);
}

// Создаем JavaScript файл js/admin-notices.js

В файле admin-notices.js добавьте такой код:

wp.data.subscribe(() => {
    const postId = wp.data.select('core/editor').getCurrentPostId();
    const transientKey = '1_is_1' + postId;

    // Проверяем, есть ли уведомление в session
    if (sessionStorage.getItem(transientKey)) {
        wp.data.dispatch('core/notices').createNotice(
            'success', 
            '1 is 1', 
            { isDismissible: true }
        );
        sessionStorage.removeItem(transientKey); // Удаляем уведомление после отображения
    }
});

// В PHP добавьте следующее в display_1_is_1_warning():
if (isset($post->ID) && get_transient('1_is_1' . $post->ID)) {
    ?>
    <script>
        sessionStorage.setItem('1_is_1<?php echo $post->ID; ?>', true);
    </script>
    <?php
}

Объяснение кода

  1. PHP часть:

    • Используя pre_post_update, вы сохраняете временные данные только в том случае, если ваши условия выполнены.
    • В функции display_1_is_1_warning добавляется скрипт, который сохраняет состояние уведомления в sessionStorage, чтобы потом JavaScript мог отследить это.
  2. JavaScript часть:

    • В admin-notices.js мы используем wp.data.subscribe для отслеживания состояния редактора.
    • Когда уведомление сохраняется в sessionStorage, мы используем механизм уведомлений WordPress, чтобы показать его пользователю.

Заключение

Следуя этим шагам, вы сможете успешно отображать уведомления как в классическом редакторе, так и в блоковом редакторе, когда пост сохраняется при соблюдении заданных условий. Убедитесь, что ваш JavaScript файл правильно подключен и загружается в админ-панели.

Оцените материал
Добавить комментарий

Капча загружается...