Доброго времени суток.
После длительного тестинга заказчик изъявил желание "видеть" индикацию о новых сообщениях в старых чатах и о вновь созданных чатах без перегрузки страницы.
Так сказать своего рода мини-пуши 🙂
Логика тут понятна - надо переодически AJAX-ом "дергать" сайт на предмет онных событий.
И как всегда проше наставления в какую сторону копать? Что дергать, не изобретая велосипед?
Благодярю, Андрей.
Решил не заморочиваться - пошел через функции темы.
Цель была достигнута - и слава богу. 🙂
В кратце решение:
добавляем URL AJAX обработчика для фронт-офиса:
/** * [updatemes_add_ajaxdata FRONT-OFFICE: Add in head AJAX-handler URL] * @return [string] [Print HTML code] */ function updatemes_add_ajaxdata() { if ( is_user_logged_in() ) { $variables = array ( 'url' => admin_url( 'admin-ajax.php' ), 'is_mobile' => wp_is_mobile() ); echo '<script type="text/javascript">var messajax = ' . json_encode( $variables ) . ';</script>'; } } add_action( 'wp_head', 'updatemes_add_ajaxdata' );
Добавляем в footer сам AJAX запрос и обрабатывающие скрипты:
/** * [my_action_javascript FRONT-OFFICE: Add in footer AJAX-script] * @return [string] [Print HTML code] */ function my_action_javascript() { if ( is_user_logged_in() ) { echo <<<EOT <!-- unit is in function --> <script type="text/javascript" > jQuery( document ).ready( function($) { var pause = 5000, timerId = setInterval( function() { var data = { action: 'mess_control' }; jQuery.post( messajax.url, data, function( response ) { // тут вставляем свои скрипты для изменения DOM модели }); }, pause); }); </script> EOT; } } add_action('wp_footer', 'my_action_javascript', 99);
Добавляем функцию-обработчик JSON ответа:
/** * [updatemes_message_control FRONT-OFFICE: ] * @param [number] $user_id [Current user ID] * @return [string] [AJAX response] */ function updatemes_message_control() { global $wpdb, $table_prefix; $user_ID = get_current_user_id(); // запрос к DB надо переписать под свои условия: ниже только образец - не стоит его бездумно копировать $query = $wpdb->get_results( "SELECT 'user_info' AS type, `user_id` AS user_id, `meta_key` AS meta_key, " . "CONVERT(`meta_value` USING utf8) AS description " . "FROM `" . $table_prefix . "usermeta` " . "WHERE (`meta_key` = 'first_name' OR `meta_key` = 'last_name' OR `meta_key` = 'rcl_avatar' OR `meta_key` = 'ulogin_photo') " . "AND (`user_id` " . "IN ( " . "SELECT `user_id` " . "FROM `" . $table_prefix . "rcl_chat_messages` " . "WHERE `private_key` = '" . $user_ID . "' " . "AND `message_status` = '0')) " . "UNION " . "SELECT 'messages' AS type, `user_id` AS user_id, `message_id` AS meta_key, " . "CONVERT(`message_content` USING utf8) AS description " . "FROM `" . $table_prefix . "rcl_chat_messages` " . "WHERE `private_key` = '" . $user_ID . "' " . "AND `message_status` = '0'" ); foreach ( $query as $key => $value ) { // здесь, при необходимости, переформатируем полученный массив данных // в приведенном образце запроса все данные приходят отдельными объектами и здесь // набор объектов копвертируется в корректный массив: $mess[$value->user_id][$value->type][$value->meta_key] = $value->description; } if( is_array( $mess ) ) { $res = array(); foreach ( $mess as $key => $value ) { // здесь формируем структуру возвращаемой JSON строки // в моем случае это готовый HTML код POP-Up блока } } $whatever = json_encode( $res ); echo $whatever; wp_die(); } add_action( 'wp_ajax_mess_control', 'updatemes_message_control' );
Результат реализации:
P.S. Это только пример реализации - "тупое копирование" не принесет никакого результат.
Необходимые данные для js скрипта можно получать из уже существующего объекта Rcl:
Rcl.ajaxurl
Rcl.mobile
Кроме того, вы можете дополнять объект своими данными, а затем их использовать:
add_filter('rcl_init_js_variables','rcl_init_js_my_variables',10); function rcl_init_js_my_variables($data){ $data['any_variable'] = 1; return $data; }
а вообще, было бы полезно оформить все это в дополнение и распространять через каталог дополнений, думаю, было бы востребовано.