Customize API
Кастомайзер – це API для створення функціоналу попереднього перегляду будь-яких змін у WordPress у фронті у реальному часі без перезавантаження сторінки. Це універсальний інтерфейс для налаштування різних опцій теми: кольори, маркери, віджети, меню тощо.
Кастомайзер надає механізм керування можливостями, тобто одні налаштування можна відображати, наприклад, адміністраторам, інші редакторам, частина налаштувань для однієї сторінки, а частина для іншої.
Об’єкти кастомайзера
Існує чотири типи об’єктів кастомайзера:
- Панелі — панелі об’єднують секції. Секція може існувати поза панеллю, тобто створення панелі робиться за бажанням і вигідно, коли багато секцій і їх потрібно зібратися в панель.
- Секції (sections) — Секції поєднують елементи управління (текстове поле, радіокнопки, списки, що випадають, і так далі).
- Елементи керування (controls) — Елементи керування не можуть існувати поза секцією.
- Налаштування (settings) — Налаштування кастомайзера пов’язують елементи інтерфейсу користувача (controls) з налаштуваннями, що зберігаються в базі даних.
Наприклад, структура кастомайзера теми Twenty Seventeen така:
- Властивості сайту (секція), всередині 6 елементів управління
- Вибір логотипу (вибір зображення)
- Назва сайту (текстове поле)
- Короткий опис (текстове поле)
- Відображати назву та опис (прапорець)
- Іконка сайту (вибір зображення)
- Кольори (секція), всередині 2 елементи управління
- Колірна схема (радіокнопки та повзунок)
- Колір тексту заголовка (вибір кольору за допомогою піпетки)
- Медіафайл заголовка (секція)
- Відео заголовка (вибір відео та поле для посилання)
- Зображення заголовка (вибір зображення)
- Меню (панель), усередині секції у вигляді назв ваших меню, нехай їх три
- Верхнє меню (секція), всередині пункти меню є елементами керування
- Пункт меню 1
- Пункт меню 2
- Пункт меню 3
- Меню продавця (секція)
- Пункт меню 1
- Пункт меню 2
- Нижнє меню (секція)
- Пункт меню 1
- Пункт меню 2
- Пункт меню 3
- Пункт меню 4
- Створити меню (секція)
- Назва меню (текстове поле)
- Області для меню (прапорці)
- Акордеон (вибір типу) та списки з вибором пунктів меню
- Верхнє меню (секція), всередині пункти меню є елементами керування
- Віджети (панель), усередині секції у вигляді назв областей меню, нехай їх дві
- Бічна панель блогу (секція), всередині віджети (секції), всередині елементи управління віджетом
- Віджет 1
- Віджет 2
- Підвал (секція)
- Віджет 1
- Віджет 2
- Віджет 3
- Бічна панель блогу (секція), всередині віджети (секції), всередині елементи управління віджетом
- Налаштування головної сторінки (секція)
- На головній сторінці відображатиметься (радіокнопки)
- Додаткові стилі (секція)
- Додайте свій CSS (область тексту з підсвічуванням CSS)
Використовуючи методи об’єкта WP_Customize_Manager , можна додавати/вилучати/змінювати об’єкти кастомайзера (панелі, секції, елемент керування…).
Основна робота проводиться на хуку customize_register , в функцію якого передається об’єкт WP_Customize_Manager :
add_action( 'customize_register', 'my_theme_customize_register'); function my_theme_customize_register( WP_Customize_Manager $wp_customize ) { // Тут робимо щось із $wp_customize - об'єктом класу WP_Customize_Manager, наприклад // Дії з панелями $wp_customize->add_panel(); // додати панель $wp_customize->get_panel(); // отримати панель $wp_customize->remove_panel(); // Видалити панель // Дії із секціями $wp_customize->add_section(); // додати секцію $wp_customize->get_section(); // отримати секцію $wp_customize->remove_section(); // Видалити секцію // Дії з налаштуваннями $wp_customize->add_setting(); // додати налаштування $wp_customize->get_setting(); // отримати налаштування $wp_customize->remove_setting(); // видалити налаштування // Дії з елементами управління $wp_customize->add_control(); // додати елемент керування $wp_customize->get_control(); // отримати елемент управління $wp_customize->remove_control(); // Видалити елемент управління }
Налаштування
Налаштування забезпечують перегляд внесених змін, їх очищення та збереження. Налаштування “стежать” за елементами керування. Наприклад, внесли зміну (обрали колір тла сайту) – він змінився без перезавантаження сторінки. Якщо все влаштувало – публікуєте зміни, щоб усі користувачі сайту їх побачили. Перед збереженням дані очищаються.
При додаванні нової настройки доступні кілька параметрів:
$wp_customize->add_setting( 'setting_id', array( 'type' => 'theme_mod', // Або 'option' 'capability' => 'edit_theme_options', // Права доступ до зміни налаштувань кастомайзера. 'theme_supports' => '', // Потрібно рідко. 'default' => '', // Значення за промовчанням. 'transport' => 'refresh', // Або 'postMessage'. 'sanitize_callback' => '', // Очищення даних на стороні PHP. 'sanitize_js_callback' => '', // Очищення даних на стороні JavaScript. Здебільшого 'to_json'. )));
Докладніше дивіться метод WP_Customize_Manager::add_setting() .
Деякі ID налаштувань зайняті двигуном, це:
widget_*
sidebars_widgets[*]
nav_menu[*]
nav_menu_item[*]
Тому користуйтеся суфіксами під час створення імен, наприклад: homepage_widget
.
Можливо два види налаштувань, параметр type
: option
(опції) та theme_mod
(модифікації теми).
-
Опції (
option ) - Зберігаються в таблиці wp_options . Назва опції в БД буде точно такою, яку ви вказали в першому параметрі (‘setting_id’).
Отримувати такі опції прийнято функцією get_option() .
Такі опції можна використовувати незалежно від активної теми. До цього типу налаштувань підходять такі дані, як “Назва сайту”, яка не залежить від того, яка тема встановлена і на яку зміниться в майбутньому.
-
Модифікації теми (
theme_mod ) - Використовуються для теми та зберігаються для кожної теми окремо. Дані зберігаються у вигляді серіалізованого масиву в таблиці wp_options , опції з назвою
theme_mods_THEME_NAME
. Отримувати такі опції прийнято функцією get_theme_mods() .До цього типу налаштувань підійдуть наприклад колір заголовка статей або фон сайту. Нехай у вас була “Тема А”, ви її налаштували. Потім вирішили спробувати “Тему Б”, перейшли і також налаштували. Тепер при перемиканні тим, кожна матиме свої (різні) опції. Однак, якщо тут використовувати тип налаштувань
option
, то налаштування “Тема Б” переписало б налаштування “Теми А”.
Куди зберігаються проміжні установки?
Під час зміни опцій кастомайзера, але до їх публікації (застосування) WordPress зберігає поточні змінені опції в таблицю wp_posts у вигляді запису типу customize_changeset
зі статусом auto-draft
.
Ідентифікувати конкретну сесію зміни опцій кастомайзера можна на ім’я запису: у полі post_name
записується унікальний id: customize_changeset_uuid , який виглядає так: 653acb14-b389-4d19-ba98-8968c976befa .
Таким чином, отримати змінений опції (ще не опубліковані) можна отримати контент запису з ім’ям customize_changeset_uuid . У контенті, у вигляді рядка JSON зберігаються поточні змінені опції:
{ "my_show_per_page": { "value": "10", "type": "option", "user_id": 5, "date_modified_gmt": "2019-06-21 16:28:30" }, "my_main_swiper_effect": { "value": "flip", "type": "option", "user_id": 5, "date_modified_gmt": "2019-06-21 16:28:30" } }
Додавання налаштувань у Customizer
Отримувати значення потрібно функцією get_theme_mod() :
echo get_theme_mod( 'my_setting_name');
PHP
<?php add_action( 'customize_register', 'customizer_init'); add_action( 'customize_preview_init', 'customizer_js_file'); add_action( 'wp_head', 'customizer_style_tag'); function customizer_init( WP_Customize_Manager $wp_customize ){ // як оновлювати прев'ю сайту: // 'refresh' - перезавантаження кадру (можна повністю відмовитися від JavaScript) // 'postMessage' - відправкою AJAX запиту $transport = 'postMessage'; // Секція if( 'базова - colors') { // налаштування $setting = 'link_color'; $wp_customize->add_setting( $setting, [ 'default' => '#000000', 'transport' => $transport ]); $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, $setting, [ 'label' => 'Колір посилань', 'section' => 'colors', 'settings' => $setting ] ) ); } // Секція if( $section = 'display_options' ){ $wp_customize->add_section( $section, [ 'title' => 'Відображення', 'priority' => 200, // пріоритет розташування 'description' => 'Зовнішній вигляд сайту', // опис не обов'язковий ]); // налаштування $setting = 'display_header'; $wp_customize->add_setting( $setting, [ 'default' => 'true', 'transport' => $transport ]); $wp_customize->add_control( $setting, [ 'section' => $section, 'label' => 'Відобразити заголовок?', 'type' => 'checkbox', ]); // налаштування $setting = 'color_scheme'; $wp_customize->add_setting( $setting, [ 'default' => 'normal', 'transport' => $transport ]); $wp_customize->add_control( $setting, [ 'section' => $section, 'label' => 'Колірна схема', 'type' => 'radio', 'choices' => [ 'normal' => 'Світла', 'inverse' => 'Темна', ] ]); // налаштування $setting = 'font'; $wp_customize->add_setting( $setting, [ 'default' => 'arial', // цей шрифт буде задіяний за умовчанням 'type' => 'theme_mod', // використовувати get_theme_mod() для отримання налаштувань, якщо вказати 'option', то потрібно буде використовувати функцію get_option() 'transport' => $transport ]); $wp_customize->add_control( $setting, [ 'section' => 'display_options', // секція 'label' => 'Шрифт', 'type' => 'select', // список select select 'choices' => [ // Список значень і лейблів випадаючого списку у вигляді асоціативного масиву 'arial' => 'Arial', 'courier' => 'Courier New' ] ]); // налаштування $setting = 'footer_copyright_text'; $wp_customize->add_setting( $setting, [ 'default' => 'Всі права захищені', 'sanitize_callback' => 'sanitize_text_field', 'transport' => $transport ]); $wp_customize->add_control( $setting, [ 'section' => 'display_options', // id секції 'label' => 'Копірайт', 'type' => 'text' // текстове поле ]); } // секція if( $section = 'advanced_options' ){ // Додаємо ще одну секцію - Налаштування фону $wp_customize->add_section( $section, [ 'title' => 'Налаштування фону', 'priority' => 201, ]); // налаштування $setting = 'bg_image'; $wp_customize->add_setting( $setting, [ 'default' => '', // за замовчуванням - фонове зображення не встановлено 'transport' => $transport ] ); $wp_customize->add_control( new WP_Customize_Image_Control( $wp_customize, $setting, [ 'label' => 'Фон сайту', 'settings' => 'bg_image', 'section' => 'advanced_options' ] ) ); // Додамо кнопку дизайн сайту в кастомайзері для швидкого переходу до поточної настройки // при transport = postMessage тут можна вказати функцію, // яка замінюватиме частину дизайну (в такий спосіб можна не писати JS код) if ( isset( $wp_customize->selective_refresh ) ){ $wp_customize->selective_refresh->add_partial( $setting, [ 'selector' => '.site-footer .inner', 'container_inclusive' => false, 'render_callback' => 'footer_inner_dh5theme', 'fallback_refresh' => false, // Prevents refresh loop when document does no contain .cta-wrap selector. Це повинно бути встановлене в WP 4.7. ]); // Виправимо стиль, щоб кнопку було видно add_action( 'wp_head', function(){ echo '<style>.site-footer .inner .customize-partial-edit-shortcut{ margin: 10px 0 0 38px; }</style>'; } ); } } } function customizer_style_tag(){ $ style = []; $body_styles = []; switch( get_theme_mod( 'font' ) ){ case 'arial': $body_styles[] = 'font-family: Arial, Helvetica, sans-serif;'; break; case 'courier': $body_styles[] = 'font-family: "Courier New", Courier;'; break; default: $body_styles[] = 'font-family: Arial, Helvetica, sans-serif;'; break; } if( 'inverse' === get_theme_mod( 'color_scheme' ) ) $body_styles[] = 'background-color:#000; color:#fff;'; else $body_styles[] = 'background-color:#fff; color:#000;'; if( $bg_image = get_theme_mod( 'bg_image' ) ){ $body_styles[] = "background-image: url('$bg_image');"; } $style[] = 'body {'. implode('', $body_styles).' }'; $style[] = 'a { color: ' . get_theme_mod('link_color'). '; }'; if( ! get_theme_mod( 'display_header' ) ) $style[] = '#header { display: none; }'; echo "<style>n" . implode( "n", $ style ) . "n</style>n"; } function customizer_js_file(){ wp_enqueue_script( 'theme-customizer', get_stylesheet_directory_uri() . '/js/theme-customizer.js', [ 'jquery', 'customize-preview' ], null, true ); }
theme-customizer.js
jQuery(function( $ ) { // налаштування wp.customize( 'link_color', function( value ) { value.bind( function( newVal ) { $('a').css('color', newVal); } ); }); // налаштування wp.customize( 'display_header', function( value ) { value.bind( function( newVal ) { false === newVal ? $( '#header' ).hide() : $( '#header' ).show(); } ); }); // налаштування wp.customize( 'color_scheme', function( value ) { value.bind( function( newVal ) { if ( 'inverse' === newVal ) { $( 'body' ).css({ 'background-color': '#000', 'color' : '#fff' }); } else { $( 'body' ).css({ 'background-color': '#fff', 'color' : '#000' }); } }); }); // налаштування var sFont; wp.customize( 'font', function( value ) { value.bind( function( newVal ) { switch( newVal.toString().toLowerCase() ) { case 'arial': sFont = 'Arial, Helvetica, sans-serif'; break; case 'courier': sFont = 'Courier New, Courier'; break; default: sFont = 'Arial, Helvetica, sans-serif'; break; } $( 'body' ).css({ fontFamily: sFont }); }); }); // налаштування wp.customize( 'footer_copyright_text', function( value ) { value.bind( function( newVal ) { $('#copyright').text(newVal); }); }); // налаштування wp.customize( 'background_image', function( value ) { value.bind( function( newVal ) { 0 === $.trim(newVal).length? $( 'body' ).css( 'background-image', '' ) : $( 'body' ).css( 'background-image', 'url( ' + newVal + ')' ); }); }); });
Методи
Методи додавання налаштувань/секцій.
$wp_customize->add_panel( $id, $args )
Додає панель.
$wp_customize->add_section( $id, $args )
Додає секцію.
$wp_customize->add_setting( $id, $args )
Додає нове налаштування/опцію. В основі роботи методу лежить клас WP_Customize_Setting() .
-
$id
(рядок) (обов’язковий) - Назва опції.
-
$args
(масив) - Параметри налаштування. Можливі ключі масиву, всі властивості класу WP_Customize_Setting{} :
- $type (рядок)
Type of the setting.
За замовчуванням: ‘theme_mod’ - $capability (рядок)
Capability required for the setting.
За замовчуванням: ‘edit_theme_options’ - $theme_supports (рядок/масив)
Theme features required to support the panel.
За замовчуванням: none - $default (рядок)
Default value for the setting.
За замовчуванням: ” - $transport (рядок)
Параметри відображення попереднього перегляду змін у Налаштування тем. Можливо:
refresh
— застосовує зміни перезавантаження кадру (можна повністю відмовитися від JavaScript).
postMessage
– застосовує зміни через JavaScript.
За замовчуванням: ‘refresh’ - $validate_callback (callable)
Server-side validation callback for setting’s value.
Функція отримає параметри$validity, $value, $this
, дивіться хук customize_validate_(id)
За замовчуванням: ” - $sanitize_callback (callable)
Callback до filtrа Customize setting value in un-slashed form.
Функція отримає параметри$value, $this
, дивіться хук customize_sanitize_(id)
За замовчуванням: ” - $sanitize_js_callback (callable)
Callback для Customize PHP встановлює значення для значення, що це JSON serializable.
Функція отримає параметри$value, $this
, дивіться хук customize_sanitize_js_(id)
За замовчуванням: ” - $dirty (true/false)
Whether or not setting is initially dirty when created.
Типово: false
За замовчуванням: попереднє встановлення
- $type (рядок)
$wp_customize->add_control( $id, $args )
Додає елемент керування.
-
$id
(WP_Customize_Control/рядок) (обов’язковий) - Об’єкт Customize Control або ID.
Рядки, які можна використовувати:
text
,checkbox
,textarea
,radio
,select
,dropdown-pages
, іemail
,url
,number
,hidden
,date
.Об’єкти, які можна використовувати як параметр $id .
Різні:
- WP_Customize_Color_Control
- WP_Customize_Background_Position_Control
- WP_Customize_Code_Editor_Control
- WP_Customize_Date_Time_Control
- WP_Customize_Theme_Control
Image:
- WP_Customize_Image_Control
- WP_Customize_Background_Image_Control
- WP_Customize_Cropped_Image_Control
- WP_Customize_Header_Image_Control
- WP_Customize_Media_Control
- WP_Customize_Upload_Control
Nav_Menu:
- WP_Customize_Nav_Menu_Control
- WP_Customize_Nav_Menu_Item_Control
- WP_Customize_Nav_Menu_Location_Control
- WP_Customize_Nav_Menu_Locations_Control
- WP_Customize_Nav_Menu_Name_Control
- WP_Customize_New_Menu_Control
- WP_Customize_Nav_Menu_Auto_Add_Control
Widget:
-
$args
(масив) - Масив властивостей нового об’єкта управління.
Параметр потрібно вказувати, тільки коли $id вказується рядок, якщо $id вказується об’єкт, то параметри передаються в створюваний об’єкт.
- $settings (масив)
All settings tied to the control. If undefined. Ідентифікатори в доповіді відповідають ID ідентифікатора WP_Customize_Setting.
За замовчуванням $setting - $setting (рядок)
The primary setting for control (іf there is one).
За замовчуванням: ‘default’ - $capability (рядок)
Capability потрібна для використання цього контролю. Normally derived from $settings. - $priority (число)
Order priority to load the control.
Типово: 10 - $section (рядок)
The section this control belongs to.
За замовчуванням: ” - $label (рядок)
Label for the control.
За замовчуванням: ” - $description (рядок)
Description for the control.
За замовчуванням: ” - $choices (масив)
List of choices ‘radio’ або ‘select’ type controls, де значення є keys, і літери є значення.
За замовчуванням: array() - $input_attrs (масив)
List of custom input attributes for control output, де attribute names є keys and values are the values.
За замовчуванням: array() - $allow_addition (true/false)
Show UI для отримання нового вмісту, поточно тільки використовуваного для стрільби-контролю.
Типово: false - $type (рядок)
The type of the control.
За замовчуванням: ‘text’ - $active_callback (callback)
Active callback.
За замовчуванням: array()
- $settings (масив)
- $wp_customize->selective_refresh->add_partial( $id, $args )
- Adds a partial.
–
Оф. дока: Theme Customization API