Intereting Posts
Ссылка на Shop-Filter с .current-menu-item Автоматическое переименование изображений на основе заголовка загрузка файлов в папку uploads через ftp Редактировать сообщение из frontend. post_tags сохраняются, но не разделяются wp_list_category только показ для входа в систему Изменение CSS API-интерфейса Customizer Будет ли плагин способен знать is_user_logged_in? Фильтрация сообщений по специальной пользовательской категории и текущему тегу 'post' только для редактора и администратора Сортировка популярных сообщений по просмотрам за последнюю неделю Постоянное действие, которое перезаписывается после пользовательского типа сообщения с созданным slug Опубликовать выдержку в пользовательском мета-окне … помочь с правильным php-форматом Как однозначно идентифицировать запросы? Как получить get_category_parents () путь патронов без ссылки на последний элемент Могу ли я показать администратора виджета в администраторе страницы?

Обработка событий AJAX без взаимодействия с пользователем

Мне нужно иметь возможность получать значения JSON из API каждый раз, когда функция вызывается в моих шаблонах WP, чтобы отображать самые последние значения социальных долей для сообщений в блоге нашего сайта.

В шаблоне

<?php count_shares($post->ID); ?> 

count_shares.php

 function count_shares($post_id) { // Register ajax 'number used once' to hash and protect the url $ajax_nonce = wp_create_nonce( "count_shares_nonce" ); // Post data to be sent to the JS script for use in AJAX call $post_data = array( 'post_url' => get_permalink($post_id), 'post_id' => $post_id, 'previous_shares' => get_field('previous_shares', $post_id); ); // Register the JS script for use wp_register_script('social-share', '/js/countShares.js'); // Expose post_data variables to AJAX script wp_localize_script('social-share', 'share_count', $post_data); // Expose the WP Ajax admin url for use in AJAX script wp_localize_script('social-share', 'share_count_ajax', array('ajax_url' => admin_url('admin-ajax.php'))); } 

JS

 jQuery(document).ready(function($){ let facebookCount = sharedCountFacebook(); let twitterCount = sharedCountTwitter(); let linkedInCount = sharedCountLinkedIn(); let prevShares = parseInt(share_count.previous_shares); let sharesFromDatabase = isNaN(parseInt(share_count.total_share_count)) ? 0 : parseInt(share_count.total_share_count); let totalShares = facebookCount + twitterCount + linkedInCount + prevShares; if(isNaN(totalShares)) { totalShares = 0; } let ajaxSendValue = (sharesFromDatabase > totalShares) ? sharesFromDatabase : totalShares; // update the database with totalSharesFromAPI jQuery.ajax({ url : share_count_ajax.ajax_url, type : 'post', data : { action : 'count_shares', share_count : ajaxSendValue, postID : share_count.post_id, nonce : share_count.ajax_nonce } }); }); 

Скрипт для обработки WP AJAX ничем не примечателен, он просто обновляет метатег сообщения.

 class CountShares { public function __construct() { add_action( 'wp_ajax_count_shares', array( $this, 'count_shares' ) ); add_action( 'wp_ajax_nopriv_count_shares', array( $this, 'count_shares' ) ); } public function count_shares() { check_ajax_referer( 'count_shares_nonce', 'nonce' ); $share_count = (int) $_POST['share_count']; $post_id = $_POST['postID']; if(get_post_meta($post_id, 'totalShareCount')) { update_post_meta( $post_id, 'totalShareCount', $share_count); } else { add_post_meta( $post_id, 'totalShareCount', $share_count); } wp_die(); } } 

Мои вопросы:

  1. Если эта функция count_shares($post->ID) вызывается несколько раз на странице (например, в цикле blogroll), как мне получить сценарий JS для запуска один раз для каждого экземпляра? Сейчас он просто срабатывает на основе почтовых данных последнего вызванного экземпляра.
  2. Как загрузить обновленную сумму социальных акций на месте без «мгновенного» или мгновенного отображения предыдущего значения, прежде чем обновлять его с помощью jQuery?
  3. Было бы возможно (или стоит) перевести этот скрипт вместо задачи WP-cron, которая выполнялась один или два раза в день, чтобы обновить мета-значение, которое я тогда буду отображать вместо этого?