Пользовательское уведомление администратора WooCommerce с динамическим сообщением

Я не могу отобразить сообщение администратора, отправив аргумент функции. Было предложено использовать функцию закрытия, но, похоже, это не работает. Вот код

function custom_woocommerce_admin_notice( $message ) {
    
add_action( 'admin_notices', function() use ( $message ) {
    wc_get_logger()->info('Order Message: '.$message ) ;
    if ( function_exists( 'get_current_screen' ) ) {
        $screen = get_current_screen();
        if ( isset( $screen->id ) && $screen->id === 'edit-shop_order' ) {
            // Check if the notice has already been dismissed
            if ( ! get_option( 'custom_woocommerce_admin_notice_dismissed' ) ) {
                ?>
                <div class = "notice notice-success is-dismissible woocommerce-notice">
                    <p><?php _e( 'Hello: '.$message , 'text-domain' ); ?></p>
                </div>
                <?php
            }
        }
    }
    });
}

add_action( 'admin_notices', 'custom_woocommerce_admin_notice' );


function custom_woocommerce_admin_notice_dismissed() {
    update_option( 'custom_woocommerce_admin_notice_dismissed', 1 );
}
add_action( 'wp_ajax_custom_woocommerce_admin_notice_dismissed', 'custom_woocommerce_admin_notice_dismissed' );

function enqueue_custom_woocommerce_admin_notice_script( $hook ) {
    // Check if we are on the WooCommerce orders page
    if ( function_exists( 'get_current_screen' ) ) {
        $screen = get_current_screen();
        if ( isset( $screen->id ) && $screen->id === 'edit-shop_order' ) {
            wp_enqueue_script( 'custom_woocommerce_admin_notice_script', get_template_directory_uri() . '/js/custom-woocommerce-admin-notice.js', array( 'jquery' ), null, true );
        }
    }
}
add_action( 'admin_enqueue_scripts', 'enqueue_custom_woocommerce_admin_notice_script' );

Функция вызывается с помощью

custom_woocommerce_admin_notice( $message );

Есть идеи, что не так? Без функции закрытия, без передачи переменной $message и использования строки это работает.

Для полноты вот js-скрипт

jQuery(document).ready(function($) {
    $('.notice.is-dismissible').on('click', '.notice-dismiss', function() {
        $.ajax({
            url: ajaxurl,
            type: 'POST',
            data: {
                action: 'custom_woocommerce_admin_notice_dismissed'
            }
        });
    });
});
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде множество ошибок.

Чтобы динамически отображать сообщение внутри этого настраиваемого уведомления, можно использовать следующий подход.

Обратите внимание, что код совместим с HPOS.

Для отклоненной опции вместо сохранения ее как глобальной опции (настроек) лучше сохранить ее как метаданные пользователя.

PHP-код:

class Custom_WC_Admin_Notice {
    /**
     * The variable to be displayed in the success notice.
     *
     * @var string
     */
    private string $message;

    /**
     * Initialize class.
     *
     * @param string $message Message to be displayed in a success notice.
     */
    public function __construct( string $message ) {
        $this->message = $message;

        add_action( 'admin_notices', array( $this, 'render' ) );
        add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts') );
        add_action( 'wp_ajax_custom_wc_admin_orders_notice_dismissed', array( $this, 'notice_dismissed') );
    }

    /**
     * Displays success notice on WooCommerce admin orders screen.
     *
     * @return void
     */
    public function render() {
        if ( ! function_exists('get_current_screen') ) {
            return;
        }
        $screen = get_current_screen();
        
        if ( isset( $screen->id ) && in_array($screen->id, ['edit-shop_order', 'woocommerce_page_wc-orders'], true) ) {
            $dismissed = get_user_meta( get_current_user_id(), 'custom_wc_admin_notice_dismissed', true );
            
            if ( $dismissed ) {
                return;
            }
            printf( '<div class = "notice notice-success custom-notice is-dismissible"><p>Hello: %s</p></div>', esc_html( $this->message ) );
        }   
    }

    /**
     * Enqueue Scripts
     *
     * @return void
     */
    public function admin_enqueue_scripts() {
        if ( ! function_exists('get_current_screen') ) {
            return;
        }
        $screen = get_current_screen();
        
        if ( isset( $screen->id ) && in_array($screen->id, ['edit-shop_order', 'woocommerce_page_wc-orders'], true) ) {
            $dismissed = get_user_meta( get_current_user_id(), 'custom_wc_admin_notice_dismissed', true );
            
            if ( $dismissed ) {
                return;
            }
            // With the main theme use: get_template_directory_uri() . /js/…
            // With a child theme use: get_stylesheet_directory_uri() . /js/…
            // With a plugin use: plugin_dir_url( __FILE__ ) . js/…
            wp_enqueue_script( 'custom-wc-admin-notice', get_template_directory_uri() . '/js/custom-wc-admin-notice.js', array( 'jquery' ), null, true );
        
            wp_localize_script('custom-wc-admin-notice', 'wc_custom_dan', array(
                'ajax_url' => admin_url('admin-ajax.php'), 
                'user_id'  => get_current_user_id(),
                'nonce'    => wp_create_nonce('wc_custom_dan'),
            ));
        }   
    }

    /**
     * Ajax update user metadata when the notice is dismissed.
     *
     * @return void
     */
    public function notice_dismissed() {
        if ( isset($_POST['nonce']) && wp_verify_nonce($_POST['nonce'], 'wc_custom_dan') 
        && isset($_POST['user_id']) && $_POST['user_id'] > 0 ) {
            echo update_user_meta( intval($_POST['user_id']), 'custom_wc_admin_notice_dismissed', true );
        }
        wp_die();
    }
}

Код находится в файле function.php вашей дочерней темы (или в плагине).

Код JavaScript в файле с именем «custom-wc-admin-notice.js» (расположенном в каталоге «js»):

jQuery(function($) {
    if ( typeof wc_custom_dan === 'undefined' ) {
        return false;
    }

    $('.notice.is-dismissible.custom-notice').on('click', '.notice-dismiss', function() {
        $.ajax({
            url: wc_custom_dan.ajax_url,
            type: 'POST',
            data: {
                'action':  'custom_wc_admin_orders_notice_dismissed',
                'user_id': wc_custom_dan.user_id,
                'nonce':   wc_custom_dan.nonce
            },
            success: function(response) {
                console.info(response);
            }
        });
    });
});

Теперь вы можете отобразить уведомление с собственным сообщением, используя:

$message = "My custom message";
new Custom_WC_Admin_Notice( $message );

Протестировано и работает для отображения специального динамического уведомления в списке заказов администратора WooCommerce (и совместимо с HPOS), которое каждый пользователь может закрыть один раз.

Спасибо. Однако сообщение $ генерируется внутри функции в файлеfunctions.php. Как передать сообщение из этой функции в новый экземпляр Custom_WC_Admin_Notice? Вызов класса в функции не работает.

mrslope 03.07.2024 18:12

Другие вопросы по теме