Статьи

Создание Ajax-таймера для плагинов WordPress

Создать плагин для WordPress не так сложно, особенно если вы знаете, что делаете. Иногда это может быть сложно, хотя при работе с несколькими сценариями, стилями и новыми функциями, которые иногда требуют некоторого воображения.

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

Предварительный просмотр конечного результата этого урока выглядит следующим образом:

Краткий пример скриншота того, как будет выглядеть администратор и мета-поле виджета в интерфейсе редактирования страницы / поста в конце урока:


Каждый плагин WordPress имеет совместимый, обновленный код в своих заголовках, так что он может функционировать и распознаваться WordPress. Это позволяет его устанавливать, активировать и удалять. Тип информации, которая доступна в информации заголовка, имеет решающее значение для плагина, но также содержит информацию о нем, такую ​​как заголовок, версия, описание, теги, информация об авторе, лицензия и т. Д.

Во-первых, плагин представляет собой файл, помещенный в каталог. Мы назовем наш плагин Timer Plugin и поместим его в нашу папку wp-content / plugins в каталоге timer_plugin . Тогда внутри этого файла timer_plugin.php будет наш основной файл плагина, в который мы вставляем исходный код заголовка.

1
2
3
4
5
6
7
<?php
/*
    Plugin Name: Timer Plugin
    Description: A timer plugin tutorial
    Author: Ciprian Turcu
    Version: 1.0
*/

Мы просто собираемся использовать основные переменные, необходимые для запуска и запуска плагина. Одной из переменных является Имя плагина, которое очень важно для идентификации плагина на странице установки плагина. Для целей этого урока мы просто назовем его Timer Plugin . Далее описание представляет собой короткую строку текста, описывающую плагин. Это также будет видно на странице установки плагина рядом с плагином, наряду со следующими переменными, Автор и Версия .

«Все переменные плагина заголовка — это строки текста, написанные после: перед именами переменных заголовка».


В WordPress действия — это привязки к конкретным функциям, которые вы можете использовать в своих функциях. В этом уроке мы будем использовать несколько хуков, чтобы получить желаемый результат.

Во-первых, действия будут добавляться с использованием функции add_action для каждого действия, и мы собираемся добавить их в конец файла PHP, как в следующем примере:

1
2
3
4
5
add_action(‘widgets_init’, ‘TP_widgets_init’);
add_action(‘admin_print_scripts’, ‘TP_admin_register_scripts’);
add_action(‘admin_print_styles’, ‘TP_admin_register_styles’);
add_action(‘wp_print_scripts’, ‘TP_register_scripts’);
add_action(‘wp_print_styles’, ‘TP_register_styles’);

Затем в приведенном выше примере wp_print_scripts и wp_print_styles добавляют действия к функциям, которые используются для регистрации, и включают стили и сценарии, необходимые в интерфейсе WordPress. Точнее в теме сайта, для функциональности таймера виджета боковой панели и шорткода контента. admin_print_scripts и admin_print_styles используются для регистрации сценария панели администратора WordPress и файлов стилей CSS, которые будут использованы в дальнейшем в руководстве.

1
2
add_action(‘admin_init’, ‘TP_admin_init’);
add_action(‘save_post’, ‘TP_save_postdata’);

Наконец, ловушка admin_init, указывающая на функцию, которая выполняется до того, как заголовки сгенерированы и запущены Хук, который мы рассмотрим в конце урока, это save_post . Этот хук необходим для работы с отправленной информацией поста или страницы в админке WordPress.

«Для более подробной информации о том, как использовать функцию add_action смотрите Add_Action в Кодексе WordPress ».


Для этого урока нам понадобится несколько файлов скриптов и стилей, которые необходимы для хорошей функциональности, и мы рассмотрим реализацию админа и темы для плагина Timer. Вот как мы собираемся сделать это:

Плагину Timer требуется несколько элементов в панели администратора, которые нам нужно будет немного стилизовать, так как внешний вид по умолчанию не совсем радует. Для этого на шаге 3 мы вызвали хуки тегов, которые нам в этом помогают, теперь мы рассмотрим функции, которые запускаются при вызове хуков, и как они работают точно.

Во-первых, функция TP_admin_register_styles для зарегистрированных и включенных стилей панели администратора.

1
2
3
function TP_admin_register_styles() {
     
}

Поскольку мы создаем плагин таймера обратного отсчета, нам требуется определенная дата и время для обратного отсчета с настоящего момента. Для этого, помимо других интеграций, мы используем функцию wp_register_style чтобы зарегистрировать последний пользовательский стиль пользовательского интерфейса jQuery, чтобы мы могли использовать его дизайн должным образом в его функциональности при создании ползунков и выбора даты в календаре позже. Файл CSS генерируется путем загрузки последней версии пользовательского интерфейса jQuery с http://jqueryui.com/download с выбором Core, Widget, Mouse, Slider, DatePicker из списка параметров, jQuery Ui 1.8.20 в разделе версий и UI Lightness. в раскрывающемся разделе темы.

Там будет файл CSS с именем jquery-ui-1.8.20.custom.css и папка с изображениями внутри папки css / jquery-ui в пользовательском сгенерированном и загруженном архиве, который вы получите из предыдущих инструкций. Мы заменим имя файла jquery-ui-1.8.20.custom.css на jquery-ui.css для более дружественного имени и скопируем его вместе с папкой images со всеми файлами в нашей папке плагинов.

После этого мы можем начать добавлять функции регистрации и включения в функцию TP_admin_register_styles упомянутую ранее.

1
2
3
// register
wp_register_style(‘jquery-ui-theme’, plugins_url(‘jquery-ui.css’, __FILE__));
wp_register_style(‘tp-admin-style’, plugins_url(‘admin-style.css’, __FILE__));

Предыдущий пример использует wp_register_style для регистрации файла jquery-ui.css по имени jquery-ui-theme, который позже используется в функции wp_register_style в следующем примере. Тот же подход используется для включения основного файла admin style.css, используя на этот раз имя tp-admin-style используемое в следующих примерах с функцией wp_enqueue_style чтобы правильно включить его в заголовки WordPress.

1
2
3
// enqueue
wp_enqueue_style(‘jquery-ui-theme’);
wp_enqueue_style(‘tp-admin-style’);

Стиль tp-admin используется для регистрации и включения файла style.css, который будет использоваться для стилизации дизайна виджета и мета-блока, который поставляется по умолчанию в реализации пользовательского интерфейса jQuery и в стиле WordPress по умолчанию.

Используя тот же подход, что и раньше, для регистрации и включения файлов стилей, мы собираемся включить в тему WordPress файлы стилей, необходимые для оформления таймера виджета и шорткода.

1
2
3
4
5
6
7
function TP_register_styles() {
    // register
    wp_register_style(‘tp-style’, plugins_url(‘style.css’, __FILE__));
 
    // enqueue
    wp_enqueue_style(‘tp-style’);
}

В этом случае мы включаем простой файл style.css из нашего каталога плагинов, который мы добавим позже.

Поскольку мы собираемся создать виджет и мета-блок с функциональностью календаря jQuery UI и средства выбора даты и времени, нам понадобятся jQuery, jQuery UI и все плагины, необходимые для включения и использования ползунка и средства выбора даты, которые мы будем реализовывать. потом. Чтобы сделать это, мы должны использовать ранее написанное действие для admin_print_scripts . Следующая функция будет реализовывать необходимую нам функциональность.

1
2
3
4
5
6
7
8
9
function TP_admin_register_scripts() {
    // register
    wp_register_script(‘tp-admin-script’, plugins_url(‘admin-script.js’, __FILE__));
    // enqueue
    wp_enqueue_script(‘jquery-ui-core’);
    wp_enqueue_script(‘jquery-ui-datepicker’);
    wp_enqueue_script(‘jquery-ui-slider’);
    wp_enqueue_script(‘tp-admin-script’);
}

Поскольку мы работаем внутри админ-панели WordPress, у нас уже есть jQuery и jQuery UI, которые уже зарегистрированы и включены в заголовок, а также необходимые нам зависимости и плагины: jquery-ui-mouse и jquery-ui-widget . Все, что мы сейчас включаем, это jquery-ui-core который не включен по умолчанию, и плагины datepicker и слайдера, которые нам нужны, и последний, файл admin-script.js, который содержит все пользовательские правила для нашего jquery- даты и времени. Пользовательский интерфейс.

Нам нужно иметь во внутреннем интерфейсе веб-сайта таймер, который уменьшается до 0 где-то на боковой панели в качестве виджета, а контент — в виде шорткода. В качестве очень простого способа сделать это я выбрал jQuery и простой JavaScript для работы таймера. В результате мы собираемся включить файл script.js в функцию, которая регистрирует сценарии для ранее объявленного внешнего обработчика.

1
2
3
4
5
6
7
function TP_register_scripts() {
    // register
    wp_register_script(‘tp-script’, plugins_url(‘script.js’, __FILE__), ‘jquery’);
 
    // enqueue
    wp_enqueue_script(‘tp-script’);
}

Мы также собираемся указать jQuery как зависимость, так как интерфейс не включает его по умолчанию.


Предполагается, что плагин использует виджет как один из двух методов для интеграции таймера в тему, в частности, боковую панель в этом случае. Чтобы иметь возможность добавить таймер на боковую панель, нам нужно реализовать функциональность виджетов для нашего плагина в WordPress.

Чтобы реализовать функциональность виджетов в плагине, мы должны включить класс виджетов с именем TP_Widget . Это имя, конечно, не обязательно, но для этого класса обязательно расширить класс WP_Widget , чтобы унаследовать его функциональность. Поэтому мы создаем класс, как в следующем примере:

1
2
3
class TP_Widget extends WP_Widget {
    // the following code will be here
}

Далее следует код, который мы добавляем в класс, чтобы мы работали с виджетом так, как он предназначен в WordPress, используя все необходимые функции, необходимые для создания функционального виджета, созданного в WordPress.

Сначала мы напишем функцию __construct для начальной интеграции необходимого кода. Функция __construct — это место, где фактически обрабатывается виджет. Мы собираемся дать виджету имя и описание внутри этой функции путем наследования и использования метода __construct родительского __construct как в следующем примере:

1
2
3
4
public function __construct() {
    // widget actual processes
    parent::__construct(‘TP_Widget’, ‘Timer Widget’, array(‘description’ => __(‘A Timer Plugin Widget’, ‘text_domain’)));
}

Первый параметр — это идентификатор виджета, второй — имя виджета, третий — массив с описанием. Следующая функция будет функцией form . Мы собираемся создать и использовать эту функцию для настройки и работы с формой контента виджета панели администратора. Следующий код будет выполняться внутри заполнителя виджета на странице виджетов панели администратора:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public function form() {
    if (!$_POST) {
        $tp_arr = unserialize(get_option(‘tp_ID_’ . $this->number));
    }
    else {
        if ($_POST[‘tp-hidd’] == ‘true’) {
            $tp_arr[‘tp-title’] = $_POST[‘tp-title’];
            $tp_arr[‘tp-date’] = $_POST[‘tp-date’];
            $tp_arr[‘tp-hour’] = $_POST[‘tp-hour-val’];
            $tp_arr[‘tp-minute’] = $_POST[‘tp-minute-val’];
            update_option(‘tp_ID_’ . $this->number, serialize($tp_arr));
        }
    }
    // outputs the options form on admin

В этой части у нас есть информация о виджетах, таких как название, дата, час и минута Эта информация извлекается из строки сериализованного массива, которая сохраняется в базе данных с именем tp_ID_X , где X — уникальный идентификатор виджета, используемый для идентификации данных, извлекаемых относительно используемого виджета.

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

Следующая часть — это элементы формы виджета администратора, которые используются во внешнем интерфейсе.

01
02
03
04
05
06
07
08
09
10
11
<label>Title:</label><br/>
<input type=»text» name=»tp-title» class=»tp-title» value=»<?php echo $tp_arr[‘tp-title’]; ?>» /><br/><br/>
<a class=»tp-time-edit» href=»javascript:void(0);»>[ Edit ]</a><br/><br/>
<label>Select a date:</label><br/>
<input type=»text» name=»tp-date» class=»tp-date» readonly=»true» value=»<?php echo $tp_arr[‘tp-date’]; ?>» />
<p><div class=»tp-time»><label>Hours</label>
<input name=»tp-hour-val» class=»tp-hour-val» value=»<?php echo $tp_arr[‘tp-hour’]; ?>» readonly=»true» /><div class=»tp-hour»></div>
</p>
<p><label>Minutes</label>
<input name=»tp-minute-val» class=»tp-minute-val» readonly=»true» value=»<?php echo $tp_arr[‘tp-minute’]; ?>»><div class=»tp-minute»></div></div></p>
<input type=»hidden» name=»tp-hidd» value=»true» />

В этом конкретном разделе нужно рассмотреть два аспекта:

Во-первых, классы тегов, такие как tp-date , tp-hour , tp-minute , с которыми позже работают в javascript, и, во- вторых, поля ввода . Во-первых, есть некоторый PHP-код, вставленный в поля ввода, которые существуют в приведенном выше коде, код, который используется для хранения данных либо для форм для отправки, либо для реализации JavaScript в jQuery и работы с ним.

В конце HTML-кода выше функция form закрывается.

Когда кнопка « Сохранить» виджета нажата на панели администратора, информация о форме передается и обрабатывается следующей функцией:

01
02
03
04
05
06
07
08
09
10
11
12
public function update() {
    // processes widget options to be saved
    if ($_POST[‘tp-hidd’] == ‘true’) {
        $tp_Arr[‘tp-title’] = $_POST[‘tp-title’];
        $tp_Arr[‘tp-date’] = $_POST[‘tp-date’];
        $tp_Arr[‘tp-hour’] = $_POST[‘tp-hour-val’];
        $tp_Arr[‘tp-minute’] = $_POST[‘tp-minute-val’];
 
        $tp_Arr[‘tp-date’] = $_POST[‘tp-date’];
        update_option(‘tp_ID_’ . $this->number, serialize($tp_Arr));
    }
}

Функция update — это функция, используемая для обновления информации в виджете в виджетах WordPress.

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

Вот пример только половины функции, а именно кода PHP, который используется для получения необходимой информации для вывода виджета.

01
02
03
04
05
06
07
08
09
10
public function widget($args, $instance) {
    $tp_arr = unserialize(get_option(‘tp_ID_’ . $this->number));
    $temp_date = explode(«/», $tp_arr[‘tp-date’]);
    $tp_arr[‘tp-date’] = $temp_date[2] .
    extract($args);
    $title = apply_filters(‘widget_title’, $tp_arr[‘tp-title’]);
 
    echo $before_widget;
    if (!empty($title))
        echo $before_title .

Итак, мы извлекаем данные виджета, ранее сохраненные в панели администратора. Следующая часть — это HTML и PHP-код, который представляет таймер и / или имеет значения, используемые позже jQuery для вычисления времени и функционирования в качестве таймера.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<div class=»timer-main»>
<input type=»hidden» class=»tp-widget-date» value=»<?php echo $tp_arr[‘tp-date’]; ?>» />
<input type=»hidden» class=»tp-widget-time» value=»<?php echo $tp_arr[‘tp-hour’] . «:» . $tp_arr[‘tp-minute’]; ?>:0″ />
<ul class=»tp-head»>
<ol>YY</ol>
<ol>DD</ol>
<ol>HH</ol>
<ol>MM</ol>
<ol>SS</ol>
</ul>
<ul>
<li>-</li>
<li>-</li>
<li>-</li>
<li>-</li>
<li>-</li>
</ul>
</div>

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

Также вы можете заметить элементы ввода с данными PHP в них. Эти элементы также используются jQuery для хранения значений сохраненной даты и времени.

Функция заканчивается после HTML-кода динамической переменной, которая закрывает виджет, используя значения, совместимые с WordPress.

1
2
3
4
<?php
    echo $after_widget;
    // outputs the content of the widget
}

И последнее, но не менее важное: если вы помните, одним из действий, написанных на шаге 1, было использование тега widgets_init и указание на функцию TP_widgets_init . Нам нужно написать его функциональность, чтобы правильно связать класс с WordPress.

1
2
3
function TP_widgets_init() {
    register_widget(«TP_Widget»);
}

«Для более полного взгляда на функциональность стандартного виджета WordPress, проверьте WordPress Widget API »


Мета-блок — это блок, расположенный на одной из боковых панелей, расположенных в редакторе администратора любой страницы или сообщения. Поскольку мы используем почти тот же код HTML, CSS и JavaScript, мы собираемся использовать почти тот же код PHP и HTML, что и виджет. Некоторые модификации некоторых классов родительских элементов необходимы для функциональности jQuery. Но сначала, мета-бокс должен быть создан и внедрен в WordPress из настроек плагина. Еще одно из действий, написанных на шаге 1, которые мы не завершили, — это тэг admin init hook. Этот хук запускается до появления заголовков и будет использоваться нами для реализации функциональности add_meta_box с add_meta_box функции add_meta_box как в примере ниже:

1
2
3
4
function TP_admin_init() {
    add_meta_box(‘TP_metaid’, __(‘Timer Plugin Post Settings’, ‘TP_textdomain’), ‘TP_inner_custom_box’, ‘post’, ‘side’);
    add_meta_box(‘TP_metaid’, __(‘Timer Plugin Page Settings’, ‘TP_textdomain’), ‘TP_inner_custom_box’, ‘page’, ‘side’);
}

Этот код создает настраиваемое поле на каждой странице поста и страницы редактирования в панели администратора с содержанием и функциональностью функции TP_inner_custom_box . Для более полного представления о том, как использовать add_meta_box , см. add_meta_box in WordPress Codex .

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

1
2
3
4
5
function TP_inner_custom_box() {
    global $post;
    // Use nonce for verification
    wp_nonce_field(plugin_basename(__FILE__), ‘cuschost_noncename’);
    $tp_arr = unserialize(get_option(‘tp_pp_ID_’ . $post->ID));

После этого пример кода HTML поразительно похож. Единственными отличиями являются дополнительная кнопка ввода, после которой функция заключена в точку с запятой и заканчивается.

01
02
03
04
05
06
07
08
09
10
<a class=»tp-time-edit» href=»javascript:void(0);»>[ Edit ]</a><br/><br/>
<label>Select a date:</label><br/>
<input type=»text» name=»tp-date» class=»tp-date» readonly=»true» value=»<?php echo $tp_arr[‘tp-date’]; ?>» />
<p><div class=»tp-time»><label>Hours</label>
<input name=»tp-hour-val» class=»tp-hour-val» value=»<?php echo $tp_arr[‘tp-hour’]; ?>» readonly=»true» /><div class=»tp-hour»></div>
</p>
<p><label>Minutes</label>
<input name=»tp-minute-val» class=»tp-minute-val» readonly=»true» value=»<?php echo $tp_arr[‘tp-minute’]; ?>»><div class=»tp-minute»></div></div></p>
<input type=»hidden» name=»tp-hidd» value=»true» />
<input type=»button» class=»tp-insert-shortcode button-primary» id=»publish» value=»Insert Short-Code» />

Предыдущая форма отправляет данные при обновлении сообщения или страницы, и нам нужно получить эти данные и сохранить их для последующего пользователя. Для этого мы используем другой хук, который мы уже реализовали, в основном save_post хука save_post который указывает на функцию обратного вызова TP_save_postdata . Функция обратного вызова получает данные из почтовых переменных и сохраняет их в базе данных под сформированным именем уникального идентификатора почтового идентификатора, и это выглядит так:

1
2
3
4
5
6
7
8
9
function TP_save_postdata() {
    global $post;
    if ( $_POST[‘tp-hidd’] == ‘true’ ) {
        $tp_arr[‘tp-date’] = $_POST[‘tp-date’];
        $tp_arr[‘tp-hour’] = $_POST[‘tp-hour-val’];
        $tp_arr[‘tp-minute’] = $_POST[‘tp-minute-val’];
        update_option( ‘tp_pp_ID_’ . $post->ID, serialize( $tp_arr ) );
    }
}

Для реализации шорткода нам нужно добавить новое действие в список функций add_action . Следующий пример расскажет об этом:

1
add_shortcode(‘tp-shortcode’, ‘tp_shortcode’);

Само собой разумеется, что мы должны создать функцию tp_shortcode которая обрабатывает новый шорткод.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function tp_shortcode($atts,$content=»») {
    global $post;
    $tp_arr = unserialize(get_option(‘tp_pp_ID_’ . $post->ID));
    $temp_date = explode(«/», $tp_arr[‘tp-date’]);
    $tp_arr[‘tp-date’] = $temp_date[2] .
    return ‘<div class=»timer-content»><input type=»hidden» class=»tp-widget-date» value=»‘.$tp_arr[«tp-date»].'» />
        <input type=»hidden» class=»tp-widget-time» value=»‘.$tp_arr[«tp-hour»].’:’.$tp_arr[«tp-minute»].’:0″ />
        <ul class=»tp-head»>
            <ol>YY</ol>
            <ol>DD</ol>
            <ol>HH</ol>
            <ol>MM</ol>
            <ol>SS</ol>
        </ul>
        <ul>
            <li>-</li>
            <li>-</li>
            <li>-</li>
            <li>-</li>
            <li>-</li>
        </ul>
    </div>’;
}

Знакомый код? Это TP_Widget интерфейс для кода виджета боковой панели, использованного ранее в функции widget внутри класса TP_Widget .

«Для более подробной информации о том, как использовать функцию add_shortcode смотрите add_shortcode в Кодексе WordPress ».


Это очень простой и быстрый шаг, поскольку он охватывает всего 2 небольших файла, которые обрабатывают дизайн виджета таймера, шорткода и раздела администратора.

В этом разделе файл стиля, добавленный на первом этапе, который мы собираемся редактировать, называется admin-style.css, и он должен выглядеть следующим образом:

1
2
3
4
5
.tp-hour, .tp-minute { padding: 0px !important;
.tp-hour-val, .tp-minute-val { font-weight:bold;
.tp-time { margin-top: 10px;
.widget .editable, .inside .editable { background-color:#FED22F;
.widget .ui-slider-horizontal, .inside .ui-slider-horizontal { background:#FED22F;

Этот файл таблицы стилей обрабатывает ширину, высоту, цвета и положение ползунков виджета администратора и всплывающего окна jQuery UI календаря при выборе часов и минут из внешнего интерфейса.

Файл style.css — это файл CSS, который охватывает дизайн UL, LI, OL таймера во внешнем интерфейсе. Смотрите следующий пример:

1
2
3
4
5
.timer-content { width:300px;
.timer-main ul, .timer-content ul { float:left;
.timer-main ul.tp-head, #content .timer-content ul.tp-head { margin:0px;
.timer-main ul ol, .timer-content ul ol { float:left;
.timer-main ul li, .timer-content ul li { float:left;

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


Администраторский виджет требует очень специфической функциональности jQuery, которая идеально сочетается с HTML-классами для тегов. Весь следующий код должен быть помещен в файл admin-script.js .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
jQuery(document).ready(function($){
    $(‘.tp-insert-shortcode’).click(function(){
        send_to_editor(‘[tp-shortcode]’);
    });
    $(‘.tp-time-edit’).live(‘click’,function(){
        $(‘.tp-date’).datepicker({
            format:’m/d/Y’,
            hourGrid: 4,
            minuteGrid: 10,
            position: ‘right’,
            onBeforeShow: function(){
                $(this).DatePickerSetDate($(this).val(), true);
            }
        });
        $(‘.tp-date’).addClass(‘editable’);
        $( «.tp-hour»).slider({
            value:0,
            min: 0,
            max: 23,
            step: 1,
            slide: function( event, ui ) {
                $(«.tp-hour-val» ).val(ui.value);
            }
        });
        $( «.tp-minute» ).slider({
            value:0,
            min: 0,
            max: 59,
            step: 1,
            slide: function( event, ui ) {
                $(«.tp-minute-val» ).val(ui.value);
            }
        });
    });
});

В этом примере после инициализации jQuery и события загрузки документа весь код, который работает с виджетом и шорткодом, загружается для использования.

Теперь, поскольку в виджете есть динамическое содержимое, загружаемое ajax, все его содержимое невидимо для jQuery, если не используется с активным действием. Для этого была создана ссылка с именем класса функции tp-time-edit и javascript опции тега void(0) при нажатии запускает живой хук и делает доступными все теги HTML в вызове функции события.

Внутри функции обратного вызова мы используем функциональность, необходимую для создания указателя даты для текстового поля даты с помощью CSS-класса tp-date .

И последнее, но не менее важное: фактически в начале кода находится функциональность javascript шорткода, в частности вставка jQuery значения CSS-класса tp-insert-shortcode найденного в поле ввода внутри функции шорткода, ранее написанной на шаге 6. Когда нажата кнопка с классом tp-insert-shortcode , она должна добавить строковое значение [tp-schortcode] в редактор WYSIWYG.

«Очень важно! JQuery UI требует, чтобы классы в свойствах тега использовались для ползунков и плагинов DatePicker. Он не работает с идентификаторами»


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

Эта часть относится исключительно к файлу script.js, в котором содержится исходный код javascript, относящийся к фактическому таймеру как в части виджета, так и в части шорткода во внешнем интерфейсе.

01
02
03
04
05
06
07
08
09
10
11
jQuery(document).ready(function($) {
    function start_by_parent(tp_parentClass){
        var tp_timer =»;
        tp_date=$(tp_parentClass+’ input.tp-widget-date’).val();
        tp_time=$(tp_parentClass+’ input.tp-widget-time’).val();
 
        tp_timer = setInterval(«tp_set(‘»+tp_parentClass+»‘,'»+tp_date+»‘,'»+tp_time+»‘);», 1000);
    }
    start_by_parent(‘.timer-main’);
    start_by_parent(‘.timer-content’);
});

Родительский класс, обрабатывающий виджет, является timer-main , так как для короткого кода CSS-класс с timer-content используется в качестве родительского тега, который используется для воздействия на элементы тега li содержащие значения таймера для DD (дней), HH (часов). ), MM (минуты) и SS (секунды). Вышеуказанная реализация представляет собой динамический подход к ним обоим в jQuery после того, как значения отправлены в функцию calc_data для обработки всей математики.

Функция tp_set фактически использует метод calc_data для вычисления значений перед тем, как вставить их в соответствующие элементы HTML-тега. Вот реализованный метод tp_set который должен tp_set внутри того же файла, script.js .

01
02
03
04
05
06
07
08
09
10
11
12
function tp_set(tp_parentClass,tp_date, tp_time){
    calc_data(tp_date, tp_time);
 
    jQuery(tp_parentClass+’ ul’).find(‘li:nth-child(1)’).html(tp_years);
    jQuery(tp_parentClass+’ ul’).find(‘li:nth-child(2)’).html(tp_days);
    jQuery(tp_parentClass+’ ul’).find(‘li:nth-child(3)’).html(tp_hours);
    jQuery(tp_parentClass+’ ul’).find(‘li:nth-child(4)’).html(tp_minutes);
    jQuery(tp_parentClass+’ ul’).find(‘li:nth-child(5)’).html(tp_seconds);
 
    var tp_timer = setInterval(‘tp_set(\»+tp_parentClass+’\’,\»+tp_date+’\’,\»+tp_time+’\’);’, 1000 );
    clearTimeout(tp_timer);
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function calc_data(tp_date,tp_time){
 
    tempdate = tp_date.split(«/»);
    temptime = tp_time.split(«:»);
 
    var seconds=1000;
    var minutes=seconds*60;
    var hours=minutes*60;
    var days=hours*24;
    var years=days*365;
 
    var db_time = new Date(tempdate[0], tempdate[1]-1, tempdate[2], temptime[0], temptime[1], 00);
    var now_time = new Date();
    db_time = db_time.getTime();
    now_time = now_time.getTime();
    var tp_result = db_time-now_time;
    if(tp_result < 0) {
        tp_years=tp_days=tp_hours=tp_minutes=tp_seconds=0;
    }
    else{
        tp_years = Math.floor(tp_result/years);
        tp_days = Math.floor(tp_result/days)-(tp_years*365);
        tp_hours = Math.floor(tp_result/hours)-(tp_days*24)-(tp_years*365*24);
        tp_minutes = Math.floor(tp_result/minutes)-(tp_hours*60)-(tp_days*24*60)-(tp_years*365*24*60);
        tp_seconds = Math.floor(tp_result/seconds)-(tp_minutes*60)-(tp_hours*60*60)-(tp_days*60*24*60)-(tp_years*365*24*60*60);
        singlebox=false;
        if(tp_years > 99){
            tp_years=99;
        }
        if(tp_days > 99){
            singlebox=true;
        }
        if(tp_years < 0)tp_years=0;
        if(tp_days < 0)tp_days=0;
        if(tp_hours < 0)tp_hours=0;
        if(tp_minutes > 60)tp_minutes=60;
        if(tp_minutes < 0)tp_minutes=0;
        if(tp_seconds < 0)tp_seconds=0;
    }
}

Очень важный аспект, который необходимо упомянуть, состоит в том, что эти функции используют глобальные переменные, которые еще не были упомянуты. Рекомендуется добавить следующий код с глобальными переменными вверху файла script.js перед любым другим кодом:

1
2
3
4
tp_days = 0;
tp_hours = 0;
tp_minutes = 0;
tp_seconds = 0;

Построение таймера обратного отсчета в jQuery не совсем быстрый и простой проект, так как есть много аспектов, которые необходимо учитывать при запуске. Такие вещи, как то, какие классы javascript, плагины и стили будут использоваться, какой дизайн он будет иметь в передней и задней части, как он хранит данные и как он их извлекает. Также совместимость всех этих с другими плагинами или скриптами и как точно все рассчитывается и что он выводит.

Дайте нам знать, что вы думаете, и если у вас есть какие-либо дополнительные рекомендации, в комментариях ниже!

Обновление: это сообщение было обновлено, чтобы исправить проблемы, упомянутые в комментариях.

Обновление № 2: Исходные файлы теперь доступны для скачивания в верхней части этого руководства.