Как интегрировать SmoothState.js в тему WordPress
() translation by (you can also view the original English article)
В предыдущем уроке мы использовали History Web API в статическом сайте, чтобы обеспечить плавные переходы между страницами. В этом уроке мы перейдем к следующему уровню, применяя то, что мы изучили на веб-сайте WordPress. Будет одно существенное различие; Мы будем использовать SmoothState.js вместо создания собственного с нуля.
SmoothState.js будет:
- Запрашивать страницы асинхронно (AJAX) и заменять содержимое соответствующим образом.
- Обновлять URL-адреса и историю просмотров через History Web API.
Мы выберем SmoothState.js по нескольким причинам:
- Простота использования: это чрезвычайно простой в использовании плагин jQuery, не требующий практически никакой конфигурации для его запуска и работы.
- API: SmoothState.js упакован различными методами, свойствами и перехватами, которые позволяют нам использовать его во многих возможных ситуациях.
- Предварительная выборка и кэширование: эти две функции позволяют нашим переходам на странице быть намного более плавными и более быстрыми, чем то, что мы построили в предыдущем уроке.
- Не указывает на практики: SmoothState.js не диктует нам, как мы применяем анимацию - мы можем опираться на CSS, jQuery, ванильный JavaScript или библиотеку анимации, такую как Velocity.js.
- Испробована и оттестирована: учитывая, что во время разработки было закрыто более ста вопросов, мы можем предположить, что были исправлены многочисленные ошибки.
Изначальные требования
Есть несколько вещей, которые вы должны будете иметь, чтобы следовать этому руководству:
- WordPress: наличие работающего сайта WordPress, либо локально на вашем компьютере, либо работа на онлайн-сервере. Если вам нужна помощь для этого шага, посмотрите «Как начать работу с WordPress» Тома МакФарлина, чтобы начать работу с базовым сайтом WordPress.
- Тема: Во время этого урока мы будем использовать последнюю тему WordPress по умолчанию: TwentySixteen. Вы можете выбрать любую тему, но убедитесь, что тема соответствует стандартам WordPress.
1. Создайте дочернюю тему
Использование «дочерней темы» в WordPress (вместо непосредственной работы с исходными файлами темы) позволяет нам безопасно вводить новые или переопределять функциональность по умолчанию.
Это наилучшая практика, когда речь идет о настройке темы, так как любые изменения, которые вы сделаете, будут сохранены, если родительская тема будет обновлена.
В нашем случае родительская тема - TwentySixteen. Дочерняя находится в другой новой папке «twentysixteen-child», которая содержит файл «functions.php» и таблицу стилей «style.css», следующим образом.
1 |
.
|
2 |
├── twentysixteen |
3 |
└── twentysixteen-child |
Наиболее важной частью дочерней темы является обозначение Template
в заголовке таблицы стилей, в котором указывается отношение темы. Укажите Template
с именем каталога родительской темы, в нашем случае twentysixteen
1 |
/**
|
2 |
Theme Name: Twenty Sixteen Child
|
3 |
Theme URI: https://webdesign.tutsplus.com
|
4 |
Author: Thoriq Firdaus
|
5 |
Author URI: https://tutsplus.com/authors/tfirdaus
|
6 |
Description: A child theme that adds an extra layer of glam to TwentySixteen
|
7 |
Version: 1.0.0
|
8 |
License: GNU General Public License v2 or later
|
9 |
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
10 |
Text Domain: twentysixteen
|
11 |
|
12 |
Template: twentysixteen
|
13 |
*/
|
После этого активируйте дочернюю тему через admin:



2. Файлы JavaScript.
Нам нужно загрузить несколько файлов JavaScript в нашу тему WordPress. В принципе мы могли это сделать, добавив эти JavaScript непосредственно в тег head
в файле header.php темы. Однако, следуя стандарту WordPress, рекомендуется использовать функцию wp_enqueue_script()
, добавленную к functions.php
, чтобы предотвратить конфликты:
1 |
wp_enqueue_script( 'smoothstate-js', 'assets/js/smoothstate.js', array( 'jquery' ), '0.5.2' ); |
2 |
wp_enqueue_script( 'script-js', 'assets/js/script.js', array( 'jquery', 'smoothstate-js' ), '1.0.0' ); |
Эта функция также позволяет нам устанавливать зависимости скриптов. В нашем случае «smoothstate.js» зависит от jQuery, поэтому WordPress загрузит jQuery перед загрузкой «smoothstate.js».
Наш файл «script.js» зависит от обоих сценариев, поэтому последовательность загрузки всех наших скриптов выглядит следующим образом:
1 |
<script type='text/javascript' src='wp-includes/js/jquery/jquery.js'></script> |
2 |
<script type='text/javascript' src='assets/js/smoothstate.js'></script> |
3 |
<script type='text/javascript' src='assets/js/script.js'></script> |
Ознакомьтесь с приведенными ниже учебниками, чтобы узнать больше о том, как работает включение файлов в WordPress:
- ПлагиныВходы и выходы скрипта Enqueue для WordPress Темы и плагиныДжейсон Уитт
- ШпаргалкиПолное руководство по правильному использованию JavaScript в WordPressBarış Ünver
3. Развертывание SmoothState.js
Давайте добавим следующий код в наш «script.js», чтобы запустить и запустить SmoothState.js:
1 |
( function( $ ) { |
2 |
|
3 |
$( function() { // Ready |
4 |
|
5 |
var settings = { |
6 |
anchors: 'a' |
7 |
};
|
8 |
|
9 |
$( '#page' ).smoothState( settings ); |
10 |
} ); |
11 |
|
12 |
})( jQuery ); |
В приведенном выше коде мы выбираем #page
(элемент, который обертывает содержимое страницы сайта) и развертываем SmoothState.js с его самой базовой конфигурацией.
Наши страницы должны обслуживаться без полной перезагрузки окна браузера при навигации по нашему сайту WordPress. Наши страницы теперь доставляются асинхронно.



В принципе, все готово! Тем не менее, есть несколько деталей, которые все же заслуживают внимания:
- Есть несколько URL-адресов, которые не следует загружать асинхронно, например ссылку на
#page
которая указывает на WordPress Admin,wp-admin
илиwp-login.php
. - Ссылки с хешем, например
#respond
, не переходят к назначенным разделам на странице. - Наша загрузка страницы невероятно быстрая. Но еще не совсем плавная, поскольку мы не применили анимацию для передачи перехода.
4. Ссылки на WordPress Admin
На странице есть несколько ссылок, которые указывают на административную область WordPress, например ссылку «Редактировать» в каждом сообщении, «Вход в систему с правами администратора» и «Выход из системы» перед формой комментария.



Одна из проблем, когда SmoothState.js запрашивает Администратора, состоит в том, что мы не сможем вернуться на предыдущую страницу, когда нажмем кнопку Назад в браузере. Эта проблема возникает из-за того, что сценарий SmoothState.js отсутствует в области администратора для запроса и обслуживания предыдущей страницы.



Нам нужно будет запретить SmoothState.js запрашивать какой-либо URL-адрес, указывающий на wp-admin
или wp-login
. Для этого мы можем использовать параметр blacklist
, как показано ниже:
1 |
( function( $ ) { |
2 |
$( function() { // Ready |
3 |
var settings = { |
4 |
anchors: 'a' |
5 |
blacklist: '.wp-link' |
6 |
};
|
7 |
$( '#page' ).smoothState( settings ); |
8 |
} ); |
9 |
})( jQuery ); |
blacklist
указывает SmoothState.js игнорировать ссылки с указанным селектором класса; И с учетом приведенного выше фрагмента кода, он будет игнорировать ссылки с классом wp-link
. Это имя класса в настоящее время не существует, поэтому мы создадим новый класс и добавим его динамически в нужные ссылки:
1 |
function addBlacklistClass() { |
2 |
$( 'a' ).each( function() { |
3 |
if ( this.href.indexOf('/wp-admin/') !== -1 || |
4 |
this.href.indexOf('/wp-login.php') !== -1 ) { |
5 |
$( this ).addClass( 'wp-link' ); |
6 |
}
|
7 |
});
|
8 |
}
|
Эта функция оценивает каждый тег привязки на странице, а затем добавляет класс wp-link
, если URL-адрес включает /wp-admin/
или /wp-login.php
.
Мы выполняем эту функцию дважды, чтобы эффективно добавить класс к странице. Во-первых, при начальной загрузке страницы. Второй - после того, как SmoothState.js обслужил новую страницу через onAfter
; Метод, который будет запускаться каждый раз, когда новый контент и анимация будут полностью доставлены.
1 |
function addBlacklistClass() { |
2 |
$( 'a' ).each( function() { |
3 |
if ( this.href.indexOf('/wp-admin/') !== -1 || |
4 |
this.href.indexOf('/wp-login.php') !== -1 ) { |
5 |
$( this ).addClass( 'wp-link' ); |
6 |
}
|
7 |
});
|
8 |
}
|
9 |
|
10 |
$( function() { |
11 |
|
12 |
addBlacklistClass(); |
13 |
|
14 |
var settings = { |
15 |
anchors: 'a', |
16 |
blacklist: '.wp-link', |
17 |
onAfter: function() { |
18 |
addBlacklistClass(); |
19 |
}
|
20 |
};
|
21 |
|
22 |
$( '#page' ).smoothState( settings ); |
23 |
} ); |
5. Обработка ссылок с хешами
Затем нам нужно обработать ссылки с хэшем. В теме WordPress обычно мы находим ссылку, которая ссылается на раздел комментария Post или Page.



По сути, вы увидите, что ссылка не приведет нас к разделу комментариев, потому что страница фактически не перезагружается или не обновляется. Поэтому нам нужно скопировать ожидаемое нормальное поведение.
1 |
( function( $ ) { |
2 |
...
|
3 |
$( function() { |
4 |
...
|
5 |
onAfter: function() { |
6 |
...
|
7 |
var $hash = $( window.location.hash ); |
8 |
|
9 |
if ( $hash.length !== 0 ) { |
10 |
|
11 |
var offsetTop = $hash.offset().top; |
12 |
|
13 |
$( 'body, html' ).animate( { |
14 |
scrollTop: ( offsetTop - 60 ), |
15 |
}, { |
16 |
duration: 280 |
17 |
} ); |
18 |
}
|
19 |
}
|
20 |
};
|
21 |
} ); |
22 |
})( jQuery ); |
Как видно из приведенного фрагмента кода, мы добавили несколько строк кода в методе onAfter
. Код извлекает хеш URL-адреса, а затем прокручивает до указанного раздела (если раздел присутствует на странице) с помощью jQuery Animation.



6. Применение движения страницы
Нам нужно сделать изменение страницы более оживленным. Сначала мы добавим стили CSS, чтобы оживить страницу, в «styles.css» нашей дочерней темы следующим образом.
1 |
.site-content { |
2 |
-webkit-transition: -webkit-transform .28s, opacity .28s; |
3 |
-ms-transition: -o-transform .28s, opacity .28s; |
4 |
-o-transition: -o-transform .28s, opacity .28s; |
5 |
transition: transform .28s, opacity .28s; |
6 |
}
|
7 |
.slide-out .site-content { |
8 |
-webkit-transform: translate3d( 0, 100px, 0 ); |
9 |
-ms-transform: translate3d( 0, 100px, 0 ); |
10 |
-o-transform: translate3d( 0, 100px, 0 ); |
11 |
transform: translate3d( 0, 100px, 0 ); |
12 |
opacity: 0; |
13 |
}
|
.site-content
- это имя класса, которое обертывает основное сообщение или содержимое страницы, а .slide-out
- это дополнительный класс, который мы создали, чтобы вывести контент.
1 |
( function( $ ) { |
2 |
...
|
3 |
$( function() { |
4 |
...
|
5 |
var settings = { |
6 |
...
|
7 |
onStart: { |
8 |
duration: 280, // ms |
9 |
render: function ( $container ) { |
10 |
$container.addClass( 'slide-out' ); |
11 |
}
|
12 |
},
|
13 |
onAfter: function( $container ) { |
14 |
...
|
15 |
$container.removeClass( 'slide-out' ); |
16 |
}
|
17 |
};
|
18 |
|
19 |
$( '#page' ).smoothState( settings ); |
20 |
} ); |
21 |
|
22 |
})( jQuery ); |
Учитывая вышеприведенный код, мы используем метод onStart
, чтобы добавить класс, когда SmoothState.js начинает вытягивать новый контент. Затем через onAfter
мы удаляем класс после того, как будет доставлено новое содержимое.



И это все, что нужно сделать! Тем не менее, есть одна вещь, которую следует иметь в виду относительно совместимости с некоторыми плагинами WordPress.
Что дальше?
Доступно более 40,000 плагинов WordPress, даже не включая плагины, которые размещаются вне официального хранилища, например, на CodeCanyon. Там есть много плагинов, которые могут быть несовместимы (или могут даже сломать) нашу асинхронную загрузку, особенно те, которые в какой-то степени зависят от сценариев.
Следующий список - это приблизительная оценка некоторых из них, которые вам, возможно, потребуется изучить при их использовании в сочетании с SmoothState.js:
- WordPress.com Stat (модуль Jetpack)
- Карусель (модуль Jetpack)
- Бесконечная прокрутка (модуль Jetpack)
- Google Analytics для WordPress
- Disqus
- Lazy Load
Кроме того, JavaScript интенсивно используется в Customizer в WordPress Admin. Таким образом, вы можете подумать о выгрузке SmoothState.js в Настройщике, если что-нибудь когда-нибудь сломается.
Заключение
Мы узнали, как интегрировать SmoothState.js в WordPress, а также использовать дочернюю тему в качестве нашей стратегии разработки. И это только начало! Мы могли бы, например, расширить то, что мы сделали, в плагине с параметрами в тех метах, где обычные пользователи могут легко настраивать вывод.
Вдохновение
Если вы ищете вдохновения, ознакомьтесь с этими многоцелевыми темами WordPress на Envato Market, которые используют похожие методы загрузки страниц AJAX:








