переключить переполнение стека jQuery

Я пытаюсь переключить кнопку с помощью jQuery.

jQuery(document).ready( function($) {
$("#wp-admin-bar-maintenance").click( function() {
var data = { action: 'maintenance' };

$.post(maintenance.ajaxurl, data, function(response) {
$(".maintenance-icon").toggleClass('flicker');
});

return false;
});
});

Это работает, у кнопки есть класс ‘мерцания’, и он переключается, но теперь сторона PHP испортила его.

function maintenance_adminbar() {
global $wp_admin_bar;

if( current_user_can( 'manage_options' ) ){
if(get_option( 'maintenance' ) == true) {
$wp_admin_bar->add_menu(array(
'id' => 'maintenance',
'title' => __('Maintenance') . get_option('maintenance'),
'href' => '#',
'meta' => array(
'class' => 'maintenance-icon flicker'
)
));
} else {
$wp_admin_bar->add_menu(array(
'id' => 'maintenance',
'title' => __('Maintenance') . get_option('maintenance'),
'href' => '#',
'meta' => array(
'class' => 'maintenance-icon'
)
));
}
}

}
add_action('admin_bar_menu', 'maintenance_adminbar', 9999);

Что он делает, так это добавляет класс под названием «мерцание» к кнопке, используя PHP, когда get_option('maintenance') является true,

Но теперь функция переключения больше не будет переключаться. Когда я нажимаю на него, вы видите, что он пытается переключить его, но класс мерцания из кода PHP переопределяет его или что-то в этом роде.

Есть ли способ исправить это?


Обновить.

Это функция ping, которая используется вышеупомянутой функцией AJAX;

function maintenance_process() {
update_option('maintenance', !get_option('maintenance'));
echo get_option('maintenance');
die();
}
add_action('wp_ajax_maintenance', 'maintenance_process');

0

Решение

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

AJAX Call: Мне нравится устанавливать мой ajax так, чтобы он возвращал фактическое значение, на которое я могу читать и реагировать в javascript, и я всегда (когда это возможно) отправляю его обратно в виде JSON, потому что он маленький и его легко анализировать.

<?php
function maintenance_process(){
$maintenance = 1;
if( 1 == get_option( 'maintenance' ) ){
$maintenance = 0;
}
// I don't like using true/false in options and specifically
// set the values to 1 or 0 for integer testing.
update_option( 'maintenance', $maintenance );
$result = array(
'maintenance' => $maintenance
);
// Print JSON back to javascript
exit( json_encode( $result ) );
}
add_action( 'wp_ajax_maintenance', 'maintenance_process' );

JavaScript: Теперь JSON из ajax можно читать и использовать для соответствующего переключения класса. В этом случае мы можем прочитать, включено или выключено обслуживание из вызова Ajax, а затем установить / удалить наш класс. Также обратите внимание, что я загрунтовал $.post функция для получения JSON с добавленным параметром в конце.

jQuery(document).ready( function($){
$( "#wp-admin-bar-maintenance" ).click( function( ev ){
ev.preventDefault();
var data = { action: 'maintenance' };
$.post( maintenance.ajaxurl, data, function( response ){
if( 1 === response.maintenance ){
$( ".maintenance-icon" ).addClass( 'flicker' );
} else {
$( ".maintenance-icon" ).removeClass( 'flicker' );
}
}, 'json' );
} );
} );

Панель администратора: Этот код в порядке, но используя мой метод, вы просто измените get_option проверить, чтобы:

if( 1 == get_option( 'maintenance' ) ){...}

Я не говорю, что мой способ установки / передачи переменных обязательно лучше, но он отлично работает для меня на тысячах сайтов (пользовательских тем и плагинов). Теперь ваш javascript и админ-штрих-код не может выйти из синхронизации, потому что они реагируют на конкретные значения, переданные обратно из ajax.

Дайте мне знать, если это работает, или мы можем устранить неполадки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector