Ajax в WP подсчет просмотров страниц при кэшировании

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

Простой пример использования Ajax в WordPress на примере подсчета числа просмотров страниц (pages) и записей (posts).

Добавляем код в functions.php темы:

//На это не обращаем внимания, к вопросу ajax не относится, но требуется для подсчета страниц и постов,
// уже было реализованно в используемой мной теме
/*      Подсчет просмотров страниц и постов  */
function getPostViews($postID){
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0 ";
    }
    return $count;
}
function setPostViews($postID) {
    $count_key = 'post_views_count';
    $count = get_post_meta($postID, $count_key, true);
    if($count==){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
       $count++;
       update_post_meta($postID, $count_key, $count);
    }
}
//вот до сюда
/*      Подсчет просмотров страниц и постов с включенным плагином кэширования   */
//используется скрипт /js/post_view_set.min.js, зарегистрируем его
function register_post_view_set() {
    //Регистрация скрипта
    wp_register_script(
        'post-view-set', //имя скрипта
        get_template_directory_uri() . '/js/post_view_set.min.js', //url скрипта
        array('jquery'), //От каких скриптов зависит скрипт
        , //Версия скрипта
        true //В footer
    );
    //подключени скрипта
	wp_enqueue_script('post-view-set');
    //Передача переменной admin_url пути admin-ajax.php через объект 
    //rrv_postViewSet (имя придумываем уникальное)
    wp_localize_script('post-view-set', 'rrv_postViewSet', 
	    array(
        	'url' => admin_url('admin-ajax.php'),
            //придумываем уникальную "соль" например 'Тут может-Быть произвольный_текст'
            'nonce' => wp_create_nonce('Тут может-Быть произвольный_текст')
    	)
    );
}
add_action('wp_enqueue_scripts', 'register_post_view_set');

//добваляем ajax экшен 
add_action('wp_ajax_nopriv_rrv_post_view_set', 'rrv_action_post_view_set'); //для не зарегистрированных, ключевым является начало wp_ajax_nopriv_
//add_action('wp_ajax_rrv_post_view_set', 'rrv_action_post_view_set'); //для зарегистрированных (нам сейчас не надо), ключевым является начало wp_ajax_
//Функция обработки ajax запроса
function rrv_action_post_view_set()
{ 
    //получаем переменную для проверки пришел ли запрос от нашего скрипта
    $nonce = $_POST['rrv_ajax_nonce'];
    // проверяем nonce код, если проверка не пройдена прерываем обработку
    //используя придуманную выше уникальную "соль" в нашем случае 'Ftr6euurjdHdf'
	if ( !wp_verify_nonce( $nonce, 'Тут может-Быть произвольный_текст' ) )
		die ( 'Stop!');

    $post_id = absint( $_POST['pid'] ); //получаем id страницы

    //Увеличение числа просмотров при просмотре страницы
    setPostViews($post_id);
    //Отправка кол-ва просмотров страниц вызывающему скрипту (post_view_set.js).
    echo getPostViews($post_id);

    //exit; //чтобы в ответ не попало ничего лишнего
    wp_die(); //рекомендуют в место exit
}

и создаем файл js/post_view_set.js в каталоге темы:

//увиличиваем кол-во просмотров страницы (или поста)
jQuery(document).ready(function($){
 
/*проверяем переменную rrv_sendPidView и если она определена,
а мы определяем ее например только в single.php и page.php (надо добавить везде где требуется)
для этого прописываем в них такой код:
<script>var rrv_sendPidView = <?php the_ID(); ?>;</script>
Его нужно вставить в цикле вывода контента между while (have_posts()) и endwhile;
*/
   if ( typeof( rrv_sendPidView ) !== 'undefined' ) {
       jQuery.post(
           //переменная post_view_set.url должна быть установленна через php
   	    rrv_postViewSet.url,
   	{
           //вызов экшена rrv_post_view_set
   	    action : 'rrv_post_view_set',
           //Отправим id страницы (или поста)
           pid: rrv_sendPidView,
      	    // отправим код nonce вместе с остальными данными
   	    rrv_ajax_nonce : rrv_postViewSet.nonce
   	},
   	    //После ответа от сервера 
   	    function( data ) {
               //меняем элемент (число просмотров) полученными через ajax данными о номере страницы от сервера
               //для страниц (page)
               $("div.info_page").children( "a.views" ).html(data);
               //для заметок (posts)
               $("div.r_part").children( "a.views" ).html(data);
   	    	//alert( data );
   	    }
       );
   }
});


В этом примере не раскрыта тема передачи большого кол-ва параметров от обработчика в скрипт, наверно опишу позднее, вот пока ссылки которые могут помочь:

_https://myrusakov.ru/forum.html?act=thread&id=1453

_https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

_https://myrusakov.ru/javascript-json.html

_https://myrusakov.ru/javascript-associative-array.html