Перейти до вмісту
themeforge
UA
Почати безплатно
Меню

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, прикріпляться до цієї сторінки — додаткового налаштування не потрібно.

Де налаштовується: Settings → Reading → Сторінка записів
Шаблон: archive-post

Каталог WooCommerce

Каталог магазину використовує сторінку «Магазин» WooCommerce як лендінг. Поля поза циклом товарів на шаблоні archive-product прикріплюються до сторінки магазину й виводяться на URL каталогу.

Де налаштовується: WooCommerce → Settings → Products → Shop page
Шаблон: archive-product

Власні типи записів

В архіву власного типу записів у WordPress немає рідного лендінга, тому його додає ThemeForge: створіть сторінку, URL якої збігається зі слагом архіву (наприклад /portfolio/ для типу зі слагом архіву «portfolio»), потім виберіть її в рядку цього типу в панелі теми. URL архіву продовжує виводити шаблон стрічки, а вибрана сторінка несе його редаговані поля. Якщо архівний шаблон вашого Webflow-проєкту оголошує групу полів, ThemeForge створює (або всиновлює) лендінг автоматично — усіма мовами сайту, так само як WooCommerce створює свою сторінку «Магазин».

Де налаштовується: Appearance → Theme Panel → Custom Post Types → рядок вашого типу записів → «Archive landing page»
Шаблон: 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? Встановіть його — тема визначить його автоматично.

Default: Secure Custom Fields (SCF) — безкоштовно, з WordPress.org, авто-оновлення
Alternative: Advanced Custom Fields PRO — ваша ліцензія, визначається автоматично
Switch: Appearance → Theme Panel → Site Settings → Field backend

Мультимовні опції

Вбудована мультимовна підтримка для опцій теми та полів сторінок. Автоматично активується з Polylang або WPML.

Як це працює

Тема автоматично визначає Polylang або WPML і завантажує відповідну інтеграцію.

  • Автовизначення: Polylang (pll_current_language) або WPML (ICL_SITEPRESS_VERSION)
  • Зберігання за локалями: кожна мова отримує власний набір значень опцій
  • Фолбек: порожні поля локалі успадковують значення з «Усі (за замовчуванням)»
  • Власні прапорці: завантаження власних прапорців мов з Медіатеки

Керування опціями за мовами

Використовуйте перемикач мов на сторінці опцій для редагування значень кожної мови.

ActionDescription
«Усі (за замовчуванням)»Майстер-значення. Використовуються як фолбек, коли локаль не має власного значення.
Редагування за мовамиПеремкніться на мову, щоб редагувати її значення. Порожні поля успадковують від «Усі».
УспадкуванняЗалиште поле порожнім на сторінці локалі, щоб на фронтенді використовувалось значення «Усі (за замовчуванням)».

Автопереклад полів

Вбудований машинний переклад значень полів. Доступний у бічній панелі на сторінках редагування записів та опцій.

  • Кнопка «Перекласти» біля кожного текстового поля
  • «Перекласти все» у бічній панелі — перекладає всі поля одразу, включно з прихованими вкладками та повторювачами
  • Поля-посилання пропускаються автоматично (визначення за іменем поля та патерном URL)
  • API-ключ не потрібен — використовується безкоштовний Google Translate
  • Підтримка WYSIWYG (візуальний редактор) — HTML-структура зберігається

Protected Files

These files are preserved during theme updates.

  • user-functions.php — Custom PHP functions
  • css/user.css — Custom CSS styles
  • js/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!)

  1. Step 1: Upload images (import_images)
  2. Step 2: Import data (import_data)

Images must be uploaded before data import.

Import Actions

ActionDescription
/?action=import_imagesUpload all media files
/?action=import_dataImport all field data
/?action=import_page_media&slug=XUpload media for a specific page
/?action=import_page_data&slug=XImport data for a specific page
/?action=import_menu_dataImport all menus

Джерело назви сторінки

При створенні WordPress-сторінок під час імпорту назва береться з вихідного HTML у порядку пріоритету:

  1. <meta property="og:title"> — Open Graph
  2. <title> — HTML title tag
  3. Назва шаблону (напр. «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 TypeElementAttribute Example
textdiv, span, p, h1-h6fld-text="name"
textareadiv, pfld-area="name"
wysiwygdivfld-editor="name"
imageimg (src)fld-image="name"
link / urla (href)fld-link="name"
true_falsewrapper divfld-show="name"
color_pickerany (bg)fld-bg-color="name"
repeaterwrapper divfld-loop="name"
groupwrapper divfld-group="name"
gallerywrapper divfld-gallery="name"
tabcontainer divfld-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) — у них редактор завжди видимий

Menu System

WordPress menus found by name.

wp-menu

<nav wp-menu="Menu Name"> ... </nav>

Simple menu rendering with Webflow-compatible markup.

wp-menu-tree

<nav wp-menu-tree="Menu Name"> ... template ... </nav>

Recursive menu with custom template.

wp-menu-tpl

<a wp-menu-tpl="link">...</a>
<div wp-menu-tpl="drop">...</div>

Explicit template markers inside wp-menu-tree.

Сумісність даних 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()Загальний об'єм кошика в кубічних метрах