Theme Reference
Theme Panel
Site settings page.
Sections
- Admin Panel — Gutenberg, admin bar, dashboard
- Security — XML-RPC, REST API, version hiding
- Extensions — Forms, SMTP, Telegram, reCAPTCHA
- WooCommerce — WooCommerce settings
- Theme Settings — Field backend, migration tools
- Search — Search configuration
Запити
Створюйте багаторазові вибірки WP_Query / get_terms(). Використовуйте їх двома способами: викликайте пресет запиту з PHP-шаблону або прив'язуйте «Custom Query» до елемента-циклу прямо через HTML-атрибути.
З PHP-шаблону (Query Presets)
Створіть пресет у під-вкладці Post/Term Query Presets, задайте Query Code і викликайте його в коді шаблону:
- Posts:
$q = new WP_Query(tf_get_query('your-code')); - Terms:
$terms = tf_get_term_query('your-code'); - Auto-apply: прив'яжіть пресет до архіву типу запису або таксономії на вкладці «Auto-apply», і він автоматично перевизначить основний запит (через pre_get_posts) — без редагування шаблону.
Через HTML-атрибути (Custom Queries)
Назвіть запит у під-вкладці Custom Queries / Term Queries, потім посилайтеся на нього на елементі-циклі — або впишіть аргументи прямо в атрибут. Шаблоном повторення є лише перший дочірній елемент.
- За іменем:
<div wp-select="catalog"> … </div>(псевдонім:wp-query-name) - Інлайн:
<div wp-query="'post_type'=>'product','posts_per_page'=>8"> - Список термінів:
<div wp-term-query="'taxonomy'=>'product_cat','parent'=>0">·wp-term-select="name" - WooCommerce:
<div wp-product-query="get_related_products(4)">
Усередині циклу — поля
На елементах усередині циклу виводьте значення через атрибути WordPress або атрибути полів ACF/SCF:
- WordPress:
wp="post-title",wp="post-image",wp="post-link",wp="term-title",wp="term-link" - ACF / SCF:
fld-text,fld-image,fld-link,fld-loop(альтернативний формат:f_text,f_image,f_loop)
Сумісність
Рантайм читає три джерела за пріоритетом: пресети TF, потім Query Master (старі імпортовані сайти), потім запити застарілого конфігуратора. Нові пресети завжди зберігаються у сховищі TF; наявні дані продовжують працювати.
Власні типи записів і таксономії
Реєструйте власні типи записів і таксономії прямо з панелі — кожен рядок повторювача відповідає виклику реєстрації WordPress, код не потрібен.
Власні типи записів
Кожен рядок відповідає register_post_type(). Поле «Name» — це ключ типу запису (малі латинські літери, без пробілів). Задайте множинну/однинну/меню-назву, іконку Dashicons, підтримувані можливості (заголовок, редактор, мініатюра, …), URL-слаг архіву, REST/Gutenberg, публічну доступність, перемикач «Публічний архів» (вимкніть стрічку /slug/ для службових типів) — і необов'язкову «Сторінку-лендінг архіву», яка робить архів редагованим (див. розділ «Лендінг-сторінки архівів» нижче).
Власні таксономії
Кожен рядок відповідає register_taxonomy(). Виберіть «Ієрархічна» (як категорії) або «Плоска» (як мітки), пов'яжіть з одним або кількома типами записів і задайте слаг та видимість у REST.
Як вони пов'язані
Нові типи записів і таксономії автоматично з'являються у випадних списках пресетів запитів. Постійні посилання оновлюються під час збереження. Шаблони відповідають угодам WordPress: single-{type}.php, archive-{type}.php, taxonomy-{taxonomy}.php.
Лендінг-сторінки архівів
URL архіву (блог, каталог магазину, архів власного типу записів) виводить СПИСОК записів — власної сторінки в нього немає, тож зазвичай на ньому нічого редагувати. ThemeForge дає кожному архіву лендінг-сторінку: справжню сторінку зі списку «Сторінки», поля якої стають редагованим вмістом архіву (hero-заголовок, вступний текст, зображення, SEO), а стрічка продовжує виводити список. Редактор змінює архів так само, як будь-яку іншу сторінку.
Як це працює
На архівній сторінці вашого Webflow-проєкту (archive-post, archive-product, archive-{type}) розмістіть атрибути полів ПОЗА циклом списку — тобто поза елементом із позначкою wp="posts" / wp="products". Такі поля автоматично прикріплюються до лендінг-сторінки в адмінці та виводяться з неї на URL архіву.
- Поза циклом працює будь-яке одиничне поле: fld-text, fld-image, fld-link, fld-bg-image, fld-editor та решта родини fld-*, а також wp="post-title" і wp="post-content" — вони друкують заголовок і вміст самої лендінг-сторінки.
- Поля ВСЕРЕДИНІ циклу зберігають звичний сенс: вони читають кожен виведений запис, як і раніше.
- На багатомовних сайтах лендінг-сторінка визначається для кожної мови автоматично (Polylang / WPML): кожна локаль редагує свій переклад лендінга.
- SEO: для архівів власних типів записів лендінг-сторінка також живить Yoast — архів отримує її SEO-заголовок і коректний canonical, включно зі сторінками пагінації.
Блог
Лендінг блогу — це рідна «Сторінка записів» WordPress. Створіть сторінку (наприклад /blog/), призначте її в Налаштування → Читання, і поля, розміщені поза циклом на шаблоні archive-post, прикріпляться до цієї сторінки — додаткового налаштування не потрібно.
archive-postКаталог WooCommerce
Каталог магазину використовує сторінку «Магазин» WooCommerce як лендінг. Поля поза циклом товарів на шаблоні archive-product прикріплюються до сторінки магазину й виводяться на URL каталогу.
archive-productВласні типи записів
В архіву власного типу записів у WordPress немає рідного лендінга, тому його додає ThemeForge: створіть сторінку, URL якої збігається зі слагом архіву (наприклад /portfolio/ для типу зі слагом архіву «portfolio»), потім виберіть її в рядку цього типу в панелі теми. URL архіву продовжує виводити шаблон стрічки, а вибрана сторінка несе його редаговані поля. Якщо архівний шаблон вашого Webflow-проєкту оголошує групу полів, ThemeForge створює (або всиновлює) лендінг автоматично — усіма мовами сайту, так само як WooCommerce створює свою сторінку «Магазин».
archive-{type}Прив'язана сторінка ВОЛОДІЄ URL архіву: перейменуйте сторінку — і архів переїде разом із нею (поле слага ховається, поки сторінка прив'язана). Без прив'язаної сторінки слаг береться з панелі теми. Сама сторінка напряму ніколи не показується — вона поверхня редагування позаду архіву.
Корисно знати
- Групові поля поза циклом (повторювач, група, flexible content, галерея) читаються з лендінга так само, як одиничні. Єдиний виняток — група з loop-mode="0": вкладка «Логи» проєкту позначає її як «archive-scope-unsupported».
- Поле, розміщене ВСЕРЕДИНІ циклу списку, належить виведеним записам — оголосіть його на відповідному шаблоні single-{type}, щоб воно з'явилося на екранах редагування цих записів.
- Якщо лендінг не налаштований, нічого не ламається: архів виводиться рівно як раніше. Додати лендінг можна будь-якої миті без перегенерації теми.
Forms Extension
Built-in form handling.
Features
- SMTP email sending
- reCAPTCHA v3 / v2
- Telegram notifications
- Захист від спаму без ключів — увімкнений на нових сайтах
- Auto-reply
- JustValidate client-side validation
- CPT
tf_form_entry— submission storage - CSV export
Захист від спаму
Працює без ключів і сторонніх сервісів. На новому сайті увімкнений одразу; на сайті, який уже приймає заявки, вмикається перемикачем «Базовий захист від спаму» у «Форми → Налаштування».
- Відсіює заявки, у яких заповнено приховане поле-пастку, надіслані без скрипта сторінки або швидше, ніж людина встигає набрати текст, з кількома посиланнями чи в обхід капчі з картинки. Частота надсилання з однієї адреси обмежена.
- Відсіяні заявки нікуди не надсилаються: 30 днів вони лежать у теці «Спам» розділу «Записи». Помилково відсіяну можна повернути дією «Не спам».
- Власні форми WordPress захищає окремий перемикач «Захист від спаму для форм WordPress», увімкнений за замовчуванням: коментарі та відгуки про товари, реєстрація та скидання пароля. Коментар, який бот надіслав, не відкриваючи сторінку, відхиляється й нікуди не зберігається; прикордонний потрапляє до «Коментарі → Спам»; підозріла реєстрація або запит на скидання відхиляється з проханням повторити. Форма входу та користувачі, що увійшли, не перевіряються.
- Капча з картинки говорить мовою сторінки: тексти задаються для кожної мови, а символи — ті, що відвідувач набере без перемикання розкладки (українські літери, російські, латиниця або цифри).
Від ботів, які цілеспрямовано імітують людину, захищає reCAPTCHA з ключами Google — її можна увімкнути в тих самих налаштуваннях.
wp-field — ключ поля, що переживає перейменування
Типово поле форми надсилається під підписом, набраним у Webflow. Перейменуєте підпис пізніше — шаблон листа й карта передавання, які на нього посилалися, перестануть збігатися, до того ж мовчки: заявка все одно надходить. Розмітьте поле (або його обгортку з підписом) — і ключ перестане залежати від підпису.
<input type="tel" wp-field="phone">
<div class="row" wp-field="phone">
<label for="tel">Телефон</label>
<input type="tel" id="tel">
</div>
Ключ проставляється в поле під час генерації теми, тож налаштовувати потім нічого не треба. Використовуйте латиницю, цифри, _ і -; імена, зайняті конвеєром форм, не приймаються й потрапляють до журналу проєкту. Поля, ім’я яких задано WordPress або WooCommerce — коментарі, відгуки, оформлення замовлення — розмічаються власними мітками.
Рушій довільних полів
Тема зберігає довільні поля через ACF-сумісний рушій. Два взаємозамінні рушії використовують ті самі поля та дані, тож перемикатися можна без втрати значень.
Два рушії, один формат даних
За замовчуванням — Secure Custom Fields: безкоштовний плагін із WordPress.org, який сам оновлюється й дає всі типи полів ACF PRO без ліцензії. Хочете свій ліцензований ACF PRO? Встановіть його — тема визначить його автоматично.
Мультимовні опції
Вбудована мультимовна підтримка для опцій теми та полів сторінок. Автоматично активується з Polylang або WPML.
Як це працює
Тема автоматично визначає Polylang або WPML і завантажує відповідну інтеграцію.
- Автовизначення: Polylang (pll_current_language) або WPML (ICL_SITEPRESS_VERSION)
- Зберігання за локалями: кожна мова отримує власний набір значень опцій
- Фолбек: порожні поля локалі успадковують значення з «Усі (за замовчуванням)»
- Власні прапорці: завантаження власних прапорців мов з Медіатеки
Керування опціями за мовами
Використовуйте перемикач мов на сторінці опцій для редагування значень кожної мови.
| Action | Description |
|---|---|
| «Усі (за замовчуванням)» | Майстер-значення. Використовуються як фолбек, коли локаль не має власного значення. |
| Редагування за мовами | Перемкніться на мову, щоб редагувати її значення. Порожні поля успадковують від «Усі». |
| Успадкування | Залиште поле порожнім на сторінці локалі, щоб на фронтенді використовувалось значення «Усі (за замовчуванням)». |
Автопереклад полів
Вбудований машинний переклад значень полів. Доступний у бічній панелі на сторінках редагування записів та опцій.
- Кнопка «Перекласти» біля кожного текстового поля
- «Перекласти все» у бічній панелі — перекладає всі поля одразу, включно з прихованими вкладками та повторювачами
- Поля-посилання пропускаються автоматично (визначення за іменем поля та патерном URL)
- API-ключ не потрібен — використовується безкоштовний Google Translate
- Підтримка WYSIWYG (візуальний редактор) — HTML-структура зберігається
Protected Files
These files are preserved during theme updates.
user-functions.php— Custom PHP functionscss/user.css— Custom CSS stylesjs/user.js— Custom JavaScript
Порядок завантаження CSS: main.css → themeforge.css → user.css.
Import System
Data and media import from pages.json and menus.json.
Import Order (Important!)
- Step 1: Upload images (import_images)
- Step 2: Import data (import_data)
Images must be uploaded before data import.
Import Actions
| Action | Description |
|---|---|
/?action=import_images | Upload all media files |
/?action=import_data | Import all field data |
/?action=import_page_media&slug=X | Upload media for a specific page |
/?action=import_page_data&slug=X | Import data for a specific page |
/?action=import_menu_data | Import all menus |
Джерело назви сторінки
При створенні WordPress-сторінок під час імпорту назва береться з вихідного HTML у порядку пріоритету:
<meta property="og:title">— Open Graph<title>— HTML title tag- Назва шаблону (напр. «About» з page-about)
Image Filename Resolution
The import system resolves image filenames using a fallback chain:
- URL-decode filename
- Strip Webflow hash prefix
- sanitize_file_name() + DB LIKE query
Імпорт з урахуванням локалі
Додайте &lang=xx для імпорту даних у конкретну мову. Метабокс імпорту на сторінці редагування автоматично визначає мову сторінки.
/?action=import_page_data&slug=theme-options&lang=en| Контекст | Description |
|---|---|
| Опції теми | Зберігає опції із суфіксом локалі (options_LOCALE_field). Використовуйте перемикач мови на сторінці «Опції». |
| Сторінки | Знаходить або створює переклад сторінки через Polylang, імпортує дані до нього. Оригінальна сторінка знаходиться незалежно від мовного фільтра. |
| Метабокс імпорту | На сторінці: визначає мову з поста (pll_get_post_language). На опціях: читає ?lang= з URL. |
Довідник розробника
Технічні деталі для розробників та AI-асистентів. HTML-атрибути, типи полів, система меню, JavaScript-хуки, допоміжні функції.
Field Types
Зіставлення типів полів ACF / SCF. Кожен тип атрибута відповідає певному HTML-елементу.
| ACF / SCF Type | Element | Attribute Example |
|---|---|---|
| text | div, span, p, h1-h6 | fld-text="name" |
| textarea | div, p | fld-area="name" |
| wysiwyg | div | fld-editor="name" |
| image | img (src) | fld-image="name" |
| link / url | a (href) | fld-link="name" |
| true_false | wrapper div | fld-show="name" |
| color_picker | any (bg) | fld-bg-color="name" |
| repeater | wrapper div | fld-loop="name" |
| group | wrapper div | fld-group="name" |
| gallery | wrapper div | fld-gallery="name" |
| tab | container div | fld-tab="name" |
Field Groups (wp-fields-group)
The wp-fields-group attribute creates field groups in WordPress admin.
Usage
<div wp-fields-group="Section Name"> ... fields ... </div>- Wraps fields into a named group
- Multiple wp-fields-group groups per page supported
- On theme-options: all groups merge into one container
- Without wp-fields-group: fields generate PHP only
wp-show-editor
Зберегти текстовий редактор WordPress на сторінках з кастомними полями.
Використання
<body wp-show-editor wp-fields-group="Section">- Ставиться на тег <body> — за замовчуванням редактор прихований на шаблонах сторінок з полями
- Використовуйте разом з wp-fields-group, коли сторінці потрібні і кастомні поля, і the_content()
- Не впливає на шаблони записів (single, single-product) — у них редактор завжди видимий
Сумісність даних ACF / SCF
Secure Custom Fields — це безкоштовний сумісний форк ACF PRO, який підтримується на WordPress.org. Він ідентичний за API і зберігає значення точно там само, тому SCF, ACF PRO та будь-які наявні дані ACF повністю взаємозамінні.
Ті самі поля та дані
Перемикання рушія ніколи не мігрує і не переписує контент — обидва рушії читають ті самі ключі полів із wp_postmeta / wp_options. Наявні дані ACF з іншої теми чи ручного налаштування підхоплюються за іменем поля, незалежно від того, який рушій їх створив.
Наявні та сторонні дані ACF
Якщо дані ACF (або SCF) уже є — від іншого генератора, попередньої теми чи вручну створеної групи полів — тема читає їх як є за іменем поля. Нічого імпортувати чи конвертувати не потрібно; значення з'являються в редакторі під будь-яким активним рушієм.
JavaScript-хуки
Користувацькі функції зворотного виклику, доступні в custom.js. Тема перевіряє наявність цих функцій і викликає їх у відповідний момент.
Загальні хуки
| Хук | Коли викликається |
|---|---|
tf_webflow_init() | Після завантаження AJAX-контенту (повторна ініціалізація взаємодій Webflow) |
tf_after_filter() | Після завантаження результатів AJAX-фільтра |
Хуки WooCommerce
| Хук | Коли викликається |
|---|---|
tf_cart_data_modify(data) | Перед додаванням до кошика (зміна даних кошика) |
tf_after_add_to_cart() | Після додавання товару до кошика |
tf_after_cart_data_modify() | Після зміни даних кошика |
tf_after_variation_change() | Після зміни варіації товару |
tf_after_recalc_checkout() | Після перерахунку підсумків замовлення |
Визначте ці функції в custom.js. Застарілі імена з префіксом wfp_ також підтримуються для зворотної сумісності.
Користувацькі запити
Створюйте WP_Query та запити термінів через інтерфейс Theme Panel — без коду.
Запит записів
Налаштовується в Theme Panel → Custom Queries. Кожен запит має: назву, тип запису, кількість записів на сторінку, пагінацію, фільтри таксономій.
$args = select_query_by_name('my_query');
$query = new WP_Query($args);Запит термінів
Налаштовується в Theme Panel → Custom Term Queries. Кожен запит має: назву, таксономію, hide_empty, orderby, order.
$args = select_term_query_by_name('my_terms');
$terms = get_terms($args);Допоміжні функції
PHP-функції, доступні в шаблонах та user-functions.php.
Загальні
| Функція | Повертає |
|---|---|
tf_default_thumbnail() | URL зображення-заповнювача за замовчуванням (налаштовується в Theme Settings) |
tf_declense($n, $f1, $f2, $f5) | Слов'янська форма множини: обирає правильну форму слова для числа |
tf_num_decline($n, $titles) | Множина з числовим префіксом. Приймає масив або рядок через кому. |
search_context($chars) | Вивести фрагмент тексту навколо збігу пошукового запиту |
device_is($type) | Визначення пристрою: phone, tablet, mobile, desktop, ios, android |
WooCommerce
| Функція | Повертає |
|---|---|
is_sale() | Чи поточний товар зі знижкою |
get_price($type, $format) | Ціна товару: "price", "price_sale", "price_regular". Формат: "default", "extreme", "range" |
get_cart_info($info) | Підсумки кошика: total_without_discount, total_with_discount, discount_amount, discount_percentage, coupon_discounts |
get_cart_volume() | Загальний об'єм кошика в кубічних метрах |