Доброго времени суток.
После длительного тестинга заказчик изъявил желание "видеть" индикацию о новых сообщениях в старых чатах и о вновь созданных чатах без перегрузки страницы.
Так сказать своего рода мини-пуши 🙂
Логика тут понятна - надо переодически 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;
}
а вообще, было бы полезно оформить все это в дополнение и распространять через каталог дополнений, думаю, было бы востребовано.