Вопрос или проблема
На данный момент у меня есть это действие, добавленное к 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).
Шаги для решения проблемы
-
Убедитесь, что вы используете правильные хуки:
Ваш код на текущий момент использует хукpre_post_update
, чтобы установить временные данные. Это хорошо, но вам нужно убедиться, что уведомление будет отображено в правильном месте. -
Создайте уведомление в зависимости от того, используется ли блоковый редактор:
Чтобы уведомление отображалось в блоковом редакторе, вам нужно убедиться, что вы добавляете его с помощью соответствующего 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
}
Объяснение кода
-
PHP часть:
- Используя
pre_post_update
, вы сохраняете временные данные только в том случае, если ваши условия выполнены. - В функции
display_1_is_1_warning
добавляется скрипт, который сохраняет состояние уведомления вsessionStorage
, чтобы потом JavaScript мог отследить это.
- Используя
-
JavaScript часть:
- В
admin-notices.js
мы используемwp.data.subscribe
для отслеживания состояния редактора. - Когда уведомление сохраняется в
sessionStorage
, мы используем механизм уведомлений WordPress, чтобы показать его пользователю.
- В
Заключение
Следуя этим шагам, вы сможете успешно отображать уведомления как в классическом редакторе, так и в блоковом редакторе, когда пост сохраняется при соблюдении заданных условий. Убедитесь, что ваш JavaScript файл правильно подключен и загружается в админ-панели.