{"success":true,"data":{"version":"4","format":"fld- \/ opt- \/ tax-","description":"ThemeForge HTML attribute reference for turning static HTML into a WordPress theme. The prefix decides the scope, not the element: fld- belongs to the page, opt- is the same value site-wide, tax- belongs to a taxonomy term, wp- calls WordPress. The legacy underscore spellings are still accepted.","formats":{"current":{"post":"fld-*","options":"opt-*","taxonomy":"tax-*","system":"wp-*"},"legacy_accepted":{"f_*":"fld-*","o_*":"opt-*","t_*":"tax-*","wp_*":"wp-*"}},"guide":"https:\/\/themeforge.pro\/ai","categories":{"wp":{"description":"Attributes that output standard WordPress fields","values":{"post-title":{"description":"Outputs the title of the current post or page — whatever is entered into the WP «Title» field. Respects the active Polylang\/WPML locale."},"post-content":{"description":"Outputs the main post content via the_content() — with Gutenberg blocks, shortcodes, and oEmbed embeds. Must live inside The Loop."},"post-excerpt":{"description":"Post excerpt — a short summary from the Excerpt field or auto-generated from the content. Good for archive cards and blog snippets."},"post-date":{"description":"Publication date of the post in the theme's format. Format is set under WP «Settings → General» or via the get_the_date filter."},"post-image":{"description":"Featured image of the post, on an <img>: src comes from the post, srcset and sizes are removed. For a background use post-bg-image."},"post-link":{"description":"Permalink of the current post, written into href. Works on any element, usually an <a>."},"post-author":{"description":"Author display name. By default the author is the user who published the post."},"post-author-link":{"description":"Link to the post author's archive page — written into href. Opens the author's archive."},"post-tags":{"description":"Tags of the current post, comma-separated. Each tag is a link to its own archive."},"posts":{"description":"Standard WordPress Loop (The Loop) — on archive pages it iterates posts automatically. Anything inside is repeated for each post. Use it ONLY on archive templates (blog \/ category \/ CPT-archive \/ search); on a single-post page it would render an unwanted list of posts."},"pagination":{"description":"Page numbers for the blog, archives and search: WP-PageNavi when that plugin is active, otherwise WordPress paginate_links(). Put it on an empty element."},"home-url":{"description":"URL of the site's home page — written into href. On localized versions, points to the current locale's root."},"post-title-link":{"description":"Post title wrapped in a link to the post itself — both values at once (text + href). One attribute replaces post-title + post-link."},"next-post-link":{"description":"Link to the next post in the archive — written into href. Hidden on the last post."},"prev-post-link":{"description":"Link to the previous post in the archive — written into href. Hidden on the first post."},"post-bg-image":{"description":"Post thumbnail as a block background image — URL is written into the inline background-image style."},"post-lbox-image":{"description":"Post thumbnail as a lightbox link — <img> is wrapped in <a href> with lightbox attributes."},"site-name":{"description":"Alias for bloginfo-name — the site title from WP settings."},"site-desc":{"description":"Alias for bloginfo-description — the site tagline from WP settings."},"breadcrumbs":{"description":"Breadcrumbs via the Breadcrumb NavXT plugin — the trail from the home page to the current page. Requires the plugin active."},"no-results":{"description":"Container for the «no results» state in archives and search — the generator only shows it when there are no results (JS-driven)."},"wish-list":{"description":"Wishlist container (YITH Wishlist) — wrapper around the products table. Put wp=\"wish-items\" with the loop inside.","requires":"YITH WooCommerce Wishlist plugin"},"wish-items":{"description":"Loop over products in the wishlist — repeats for each saved product. Inside, use wp-wl=\"...\" for product fields.","requires":"YITH WooCommerce Wishlist plugin"},"wish-add":{"description":"Heart-button «Add to wishlist» — placed on a product or in a product card. Click toggles the product via AJAX."},"wish-copy":{"description":"Button «Copy to cart» — adds the wishlist product to the cart while keeping it in the wishlist."},"wish-move":{"description":"Button «Move to cart» — adds to cart and removes from wishlist in one action."},"wish-remove":{"description":"Remove-from-wishlist button — usually a cross in the row."},"wish-count":{"description":"Wishlist product count for the current user — updates on add\/remove."},"wish-remove-all":{"description":"Button that empties the whole wishlist","requires":"YITH WooCommerce Wishlist plugin"},"term-title":{"description":"Outputs the name of the current taxonomy term — category, tag, or custom taxonomy. Used on taxonomy archives and inside fld-term-query loops. Respects the active Polylang\/WPML locale."},"term-link":{"description":"Permalink to the term's archive page — written into the href of an <a>. Multilang-aware."},"term-count":{"description":"Number of posts in the current taxonomy term (products in a category, posts in a tag). Useful for a badge next to the category name."},"product-price":{"description":"WooCommerce price of a product that is not on sale; hidden while it is. Put product-price-sale and product-price-regular next to it for sales."},"product-price-regular":{"description":"The old, struck-through price, shown only while the product is on sale; empty and hidden otherwise. Pair it with product-price-sale."},"product-price-sale":{"description":"Sale (discounted) WooCommerce product price. Empty when the product has no active sale."},"product-prices":{"description":"Wrapper container for the product price block — typically holds product-price-regular and product-price-sale inside. Structures the price block for CSS."},"product-sku":{"description":"WooCommerce product SKU. Hidden when the SKU field is not set on the product."},"product-gallery":{"description":"WooCommerce product gallery container — supports swipe and zoom on the product page."},"product-cat-image":{"description":"WooCommerce product category image — the thumbnail set under Products → Categories. URL is injected into the img src."},"product-cat-bg-image":{"description":"Product category image as a background-image"},"product-qty":{"description":"WooCommerce product quantity input — usually <input type=\"number\">. Pairs with product-qty-plus and product-qty-minus."},"product-qty-minus":{"description":"Decrement-quantity button for cart or product page. JS reduces the linked product-qty input by 1."},"product-qty-plus":{"description":"Increment-quantity button for cart or product page. JS increases the linked product-qty input by 1."},"add-to-cart":{"description":"Goes on a <form> with a submit button: adds the product without a page reload and updates the cart counter and mini cart. Quantity inside: wp=\"product-qty\". Variable products use the var-* values."},"cart-total":{"description":"Cart total as WooCommerce shows it in the cart. Updated without a page reload when the cart changes."},"cart-count":{"description":"WooCommerce cart item count — updated via AJAX. Used in the header for a badge on the cart icon."},"cart-empty":{"description":"«Cart is empty» container — the generator shows it only when the cart has no items. Usually contains a «back to shopping» link."},"product-group-child":{"description":"One child-product row of a grouped product — place it on the repeating row of the children loop (wp-product-query=\"get_grouped_children()\"). Supplies the product id and unit price the running total is built from."},"product-group-qty":{"description":"Quantity field of a child product — becomes a number input starting at 0 («not ordered»), capped to the remaining stock when stock is tracked. Use it instead of wp=\"product-qty\" here: that one belongs to the product’s own form and would move every row at once."},"product-group-qty-minus":{"description":"Decrease button for a child product — changes the quantity of its own row only."},"product-group-qty-plus":{"description":"Increase button for a child product — changes the quantity of its own row only."},"product-group-totals":{"description":"Wrapper of the running total for a grouped product — holds the item count, the sum and the add-to-cart button."},"product-group-count":{"description":"Total quantity currently selected across the child products — recalculated in the browser as the shopper types."},"product-group-price":{"description":"Total price of the current selection — recalculated in the browser as the shopper types."},"product-group-add":{"description":"Adds the whole selection to the cart in one request: every child product whose quantity is above zero."},"add-to-wl":{"description":"«Add to wishlist» button (YITH Wishlist v2 API) — modern variant. Differs from wp=\"wish-add\" by using the newer integration."},"search":{"description":"Site search form wrapper — the generator wraps it in an HTML5 <form action=\"\/?s=\"> with input[name=s]."},"autoload":{"description":"Marker for AJAX trigger on a filter element (checkbox \/ radio \/ select inside wp-filter-form). When set, JS auto-submits the filter form on value change, no «Apply» click needed. NOT infinite-scroll (see wp-load for that)."},"product-image":{"description":"Additional product image — URL is injected into the img src. Distinct from product-gallery (the whole gallery)."},"product-bg-image":{"description":"Product thumbnail as a background image — URL written into the inline background-image style."},"product-lbox-image":{"description":"Product thumbnail as a lightbox link — <img> is wrapped in <a href> with lightbox attributes."},"product-image-gallery":{"description":"Product gallery without automatic lightbox — use when the modal viewer is wired via a custom JS component."},"product-title":{"description":"Product title outside the loop context. Inside single-product \/ loop product use wp=\"post-title\" instead."},"product-height":{"description":"Product height from the shipping settings in WC admin."},"product-width":{"description":"Product width from the shipping settings in WC admin."},"product-length":{"description":"Product length from the shipping settings in WC admin."},"product-weight":{"description":"Product weight from the shipping settings in WC admin."},"product-sale-percent":{"description":"Discount percentage on the product — computed from regular\/sale price. Useful for a -20% badge."},"product-attrs":{"description":"Loop container over the product's attributes (inside: attr-name, attr-options)"},"attr-name":{"description":"Product attribute name (inside a product-attrs or var-attrs loop)"},"auto-attr-terms":{"description":"Terms of the CURRENT attribute inside var-attrs — the same as wp-attr-terms=\"*\", under its own name, so a converter that does not know the mark leaves the markup static"},"attr-options":{"description":"Product attribute values (inside a product-attrs loop)"},"var-attrs":{"description":"Wrapper that repeats its first child once per VARIATION attribute the product actually has — so adding an attribute in WordPress (a new size, a new ingredient) appears on the site with no design change and no theme rebuild. Inside the repeated group use wp=\"attr-name\" for the attribute label and wp-attr-terms=\"*\" for the list of its terms. Attributes you placed by hand on the same template (wp-attr-terms=\"pa_x\" or wp-if-attr=\"pa_x\") are SKIPPED — hand-built blocks are often custom, and would otherwise be rendered twice. Non-taxonomy («free text») attributes are skipped too: they have no terms to choose from. Note: wp=\"product-attrs\" is a different thing — it LISTS attributes as specs; this one builds the CHOOSER."},"product":{"description":"Product card container — wrapper for a single product on a catalog page."},"products":{"description":"Catalog loop of the shop and category pages: shows the page’s own products, and the first card is the pattern. For products on another page use wp-product-query."},"stock":{"description":"Numeric stock count for the product — shown only when stock management is enabled."},"stocked":{"description":"«In stock» block — the generator shows it when the product is available for purchase."},"not-stocked":{"description":"«Out of stock» block — the generator shows it when the product has no stock."},"backorder":{"description":"«Available on backorder» block — shown when the product is out of stock but orderable."},"var-price":{"description":"Current price of the selected variation. Updated via JS when the variation changes."},"var-price-regular":{"description":"Regular (struck-through) price of the selected variation."},"var-price-sale":{"description":"Sale price of the selected variation. Empty if no sale."},"var-image":{"description":"Image of the selected variation — URL injected into src."},"var-lbox-image":{"description":"Variation image in lightbox."},"var-bg-image":{"description":"Variation image as background-image on the current element."},"var-desc":{"description":"Description of the selected variation."},"var-sku":{"description":"SKU of the selected variation."},"var-stock":{"description":"Numeric stock count for the selected variation."},"var-stocked":{"description":"«In stock» block for variation — shown when the selected variation is available."},"var-not-stocked":{"description":"«Out of stock» block for variation."},"var-backorder":{"description":"«Backorder» block for variation."},"var-id":{"description":"Numeric ID of the selected variation."},"var-height":{"description":"Variation height (shipping)."},"var-width":{"description":"Variation width (shipping)."},"var-length":{"description":"Variation length (shipping)."},"var-weight":{"description":"Variation weight (shipping)."},"cart-full":{"description":"«Cart not empty» container — the generator shows it only when the cart has items. Paired with cart-empty."},"cart-weight-total":{"description":"Total weight of all items in the cart."},"checkout":{"description":"Checkout page container — the main wrapper for checkout.php."},"checkout-form":{"description":"Full checkout form — contains billing-* fields and payment\/shipping inside."},"checkout-full":{"description":"Filled checkout form — shown when the cart has items."},"checkout-total":{"description":"Final payable amount on the checkout page."},"order-total":{"description":"Order total amount in the account details view."},"order-number":{"description":"Order number (text identifier)."},"order-comments":{"description":"Order comments field — textarea for additional notes from the customer."},"discount-total":{"description":"Total discount applied to the order — sum of coupon discounts."},"shipping":{"description":"Shipping options container — typically holds shipping-radio inside."},"shipping-radio":{"description":"Radio button for one shipping option."},"shipping-cost":{"description":"Cost of the selected shipping option."},"shipping-countries":{"description":"List of countries where shipping is available."},"shiping-total":{"description":"Final shipping cost. The name keeps a typo from the alternative format («shiping»); kept for compatibility."},"payment":{"description":"Payment methods container — typically holds payment-radio inside."},"payment-desc":{"description":"Description of the selected payment method — caption under the radio button."},"payment-radio":{"description":"Radio button for one payment method."},"add-coupon":{"description":"Coupon code input + apply button."},"show-coupon":{"description":"«Use coupon» trigger button — usually expands the code input form."},"discount-amount":{"description":"Total discount amount in the cart"},"discount-percent":{"description":"Total discount percentage in the cart"},"coupon-discount":{"description":"Discount amount from applied coupons only"},"used-coupons":{"description":"Loop container over applied coupons (inside: coupon-code, coupon-amount, coupon-descr)"},"coupon-code":{"description":"Code of the applied coupon (inside a used-coupons loop)"},"coupon-amount":{"description":"Discount amount of the coupon (inside a used-coupons loop)"},"coupon-descr":{"description":"Coupon description (inside a used-coupons loop)"},"billing-address":{"description":"Customer address (combined field — joins address_1 + address_2)."},"billing-address-1":{"description":"Customer address — line 1 (street, building)."},"billing-address-2":{"description":"Customer address — line 2 (apartment, suite)."},"billing-city":{"description":"Customer city."},"billing-state":{"description":"Customer state \/ region."},"billing-postcode":{"description":"Postal code."},"billing-country":{"description":"Customer country (select with the WC countries list)."},"billing-company":{"description":"Customer company name (for B2B orders)."},"billing-first-name":{"description":"Customer first name."},"billing-last-name":{"description":"Customer last name."},"billing-email":{"description":"Customer email — for order confirmation."},"billing-phone":{"description":"Customer phone."},"current-user":{"description":"Display name of the currently authenticated WP user. Empty for guests."},"login-form":{"description":"Standard WordPress login form (wp_login_form)."},"login-wc":{"description":"WooCommerce login form — extended version for my-account."},"register-wc":{"description":"WooCommerce new-user registration form."},"recover-wc":{"description":"WooCommerce password recovery form."},"update-user":{"description":"User-data edit form in the account dashboard."},"update-billing":{"description":"Billing-address edit form in the account dashboard."},"update-password":{"description":"Password-change form in the account dashboard."},"logout-link":{"description":"Logout link — href points to wp-login.php?action=logout with the correct nonce."},"orders":{"description":"Order list for the current user — repeating block (loop)."},"customer-files":{"description":"List of downloadable files for the customer (digital products)."},"customer-file-link":{"description":"Download link for a specific customer file."},"term-title-link":{"description":"Taxonomy term title with a link to its archive — text + href in one."},"term-desc":{"description":"Taxonomy term description — the «Description» field from the taxonomy admin."},"term-children":{"description":"Recursion-point marker inside wp-term-tree: container into which the generator inserts the nested-terms block (same structure as the parent). Any nesting depth."},"archive-title":{"description":"Archive page title — category name, tag, author, date (depending on archive type)."},"archive-title-link":{"description":"Archive title with a link to the archive itself — text + href."},"sort":{"description":"Sort selector container — usually a select with orderby options."},"orderby":{"description":"Sort-order option inside sort. Values: date, price, popularity, etc."},"perpage":{"description":"«Items per page» selector container for archives."},"filter":{"description":"Product \/ post filter container — wrapper for filter forms."},"reset-filter":{"description":"Button to reset all applied filters."},"is-mobile":{"description":"Block renders only on mobile devices (phones + tablets)."},"is-phone":{"description":"Block renders only on phones (not tablets)."},"is-tablet":{"description":"Block renders only on tablets."},"is-desktop":{"description":"Block renders only on desktops."},"is-not-phone":{"description":"Block renders on all devices except phones (tablets + desktop)."},"is-ios":{"description":"Block renders only on iOS devices (iPhone, iPad)."},"is-android":{"description":"Block renders only on Android devices."},"is-featured":{"description":"Block renders only for «featured» WC products (is_featured flag)."},"is-novelty":{"description":"Block renders only for «new arrivals» — recently published products."},"post-views":{"description":"Post view counter. Requires a compatible plugin (Post Views Counter, etc.)."},"modified-date":{"description":"Date the post was last modified"},"has-excerpt":{"description":"The block is shown only if the post has an excerpt"},"post-comments":{"description":"Post comments container — wrapper block (differs from wp=\"comments\" which calls comments_template())."},"comment-list":{"description":"Renders the comment list from YOUR markup instead of the WordPress default. The first child that carries comment marks becomes the template of a single comment; WordPress keeps threading, paging and moderation. The card root gets id=\"comment-<ID>\" and a tf-comment-depth-N class — style that class to indent replies, because a reply carries no wrapper of its own."},"comment-author":{"description":"The comment author name. Place inside the single-comment template."},"comment-avatar":{"description":"The author avatar. On an <img> the src is replaced (static srcset\/sizes are stripped, otherwise the browser would prefer them); on any other element it becomes a background image."},"comment-date":{"description":"The comment date. Place inside the single-comment template."},"comment-text":{"description":"The comment body. Place inside the single-comment template."},"comment-reply":{"description":"The \"Reply\" link. Keeps your element and classes, and receives the real reply address plus the data attributes the built-in reply script needs to move the form under the comment being answered."},"comment-form":{"description":"Builds the comment form from YOUR field markup. WordPress still prints the form element itself — that is where its hidden fields, plugin hooks and the reply behaviour live — while your marked blocks become the fields, the textarea and the button. An unmarked field simply keeps the WordPress default."},"comment-input-author":{"description":"The \"Name\" field of the comment form. Mark the field or, better, its wrapper (label + input + hint) — the whole marked element becomes the field block."},"comment-input-email":{"description":"The \"Email\" field of the comment form."},"comment-input-url":{"description":"The \"Website\" field of the comment form."},"comment-input-text":{"description":"The comment textarea."},"comment-submit":{"description":"The submit button of the comment form. Your markup and classes are kept."},"review-list":{"description":"Renders WooCommerce product reviews from YOUR markup. A review is a comment plus a rating, so the comment marks work inside the review card unchanged. Everything inside this block is a SOURCE: the first child with review\/comment marks becomes the single-review template, and a wp=\"review-form\" block inside becomes the form fields. WooCommerce still owns the block itself — the count and title, pagination, the \"purchase required\" notice, validation and saving."},"review-rating":{"description":"The rating of the review. The element receives data-rating and the CSS variable --tf-rating, so a star bar can be drawn in pure CSS (width: calc(var(--tf-rating) \/ 5 * 100%)). An EMPTY element gets the number printed into it; markup inside (your own stars) is left untouched."},"review-verified":{"description":"Shown only on a review left by a confirmed buyer (\"verified owner\" in WooCommerce). Your markup, your classes."},"review-form":{"description":"The review form built from YOUR field markup. Place it inside wp=\"review-list\" — WooCommerce renders the form there. Fields use the comment marks (comment-input-author \/ -email \/ -text, comment-submit) plus review-input-rating."},"review-input-rating":{"description":"The rating control of the review form (a <select>). If it has no options, 1-5 are added. It never travels in the form \"fields\" array — WordPress prints that only for logged-out visitors, which would hide the rating from every signed-in customer."},"post-categories":{"description":"Post categories as a link list. Alternative output format (vs. wp=\"post-category\" which outputs a comma-separated list)."},"post-bg-link":{"description":"Wrap-link on the post card — turns the whole block into a clickable area pointing to post-link."},"parent-title-link":{"description":"Parent page title with link — for hierarchical pages."},"home-link":{"description":"Alias of wp=\"home-url\" — link to the site's home page."},"search-text":{"description":"Search query highlight in the results header («You searched for: ...»). Alternative to wp=\"search-query\"."},"wl-count":{"description":"Wishlist item count (v2 API) — modern variant of wp=\"wish-count\"."},"wl-full":{"description":"«Wishlist not empty» container (v2 API) — paired with wp=\"wish-list\"."},"clear":{"description":"Utility marker: removes the element from DOM at build time while keeping its bound ACF\/SCF fields in admin. For DOM cleanup without losing editability."},"delete-element":{"description":"Synonym of wp=\"clear\": removes the element from DOM at build time while keeping its bound ACF\/SCF fields in admin (e.g. an empty tab-divider div)."}}},"wp-query":{"description":"Turns the element into a posts loop (WP_Query) anywhere in the theme: inside the element is the card of one post, repeated for every result. Parameters are written as PHP array pairs, e.g. wp-query=\"'post_type'=>'news', 'posts_per_page'=>6\". Inside the loop wp=\"post-title\", wp=\"post-image\", links and the post's fld-* fields all work.","format":"wp-query=\"'post_type' => 'name', 'posts_per_page' => 10\""},"wp-if":{"description":"Conditional block output by a WordPress condition: the value is a function call (or expression) returning true\/false. When false the block is omitted from the page output entirely. You can also pass just a field name: wp-if=\"phone\" shows the block only when the phone field is filled (equivalent to get_field('phone')). Typical values are in the example cards below; arbitrary PHP expressions are allowed too.","format":"wp-if=\"condition()\"","examples":{"has_post_thumbnail()":"Checks whether the post has a featured image (thumbnail).","is_user_logged_in()":"Checks whether the user is authenticated.","is_front_page()":"Current page is the site front page.","is_single()":"Current page is a single post.","is_page()":"Current page is a static page.","is_category()":"Current page is a category archive.","is_archive()":"Current page is any archive (category, tag, date, author).","is_search()":"Current page is a search results page.","is_404()":"Current page is 404 (not found)."}},"wp-wl":{"description":"Product fields inside a wishlist loop (wp=\"wish-items\"). The canonical form is fully hyphenated — wp=\"wl-product-title\", wp=\"wl-product-price-regular\" and so on; the alternative wp_wl=\"product_title\" is accepted. The copy\/move\/remove buttons are canonically wp=\"wish-copy|wish-move|wish-remove\" (both alternative spellings are accepted).","requires":"YITH WooCommerce Wishlist plugin, context: $item, $_product, $product_id","values":{"product_title":{"description":"Product name in a wishlist row — output via get_name()."},"product_link":{"description":"Product permalink — written into the href of an <a>."},"product_image":{"description":"Product thumbnail — URL injected into the src of an img."},"product_bg_image":{"description":"Product thumbnail as a background image — URL written into the inline background-image style."},"product_price":{"description":"Current product price — if there's a discount, the sale price is shown; otherwise the regular price."},"product_price_regular":{"description":"Regular (struck-through) wishlist product price. Name in the alternative format; alias of product_regular_price."},"product_price_sale":{"description":"Sale wishlist product price. Name in the alternative format; alias of product_sale_price."},"copy":{"description":"«Copy to cart» button from wishlist — adds the product to cart while keeping it in wishlist."},"move":{"description":"«Move to cart» button from wishlist — adds to cart and removes from wishlist in one action."},"remove":{"description":"Remove-from-wishlist button."}}},"wp-cart":{"description":"Product fields in the WooCommerce cart loop","requires":"WooCommerce active, context: WC()->cart->get_cart()","values":{"items":{"description":"Cart items loop container — the generator expands a foreach over WC()->cart->get_cart() inside. Use product_title, product_qty, product_price, etc. within."},"mini":{"description":"Mini cart (sidecart) — compact cart variant for the header or a dropdown block."},"not_empty":{"description":"«Cart not empty» wrapper — the generator shows the block only when the cart has items. Paired with cart-empty."},"empty":{"description":"«Cart is empty» wrapper — shown only when the cart has no items, the same block as wp=\"cart-empty\". Paired with not_empty."},"product_title":{"description":"Product title in the cart row — same as the catalog product title."},"product_link":{"description":"Product permalink in the cart row — written into the href of an <a>."},"product_image":{"description":"Product image (src) in the cart row — thumbnail or a specifically assigned image."},"product_bg_image":{"description":"Product image as background-image on the cart row element."},"product_price":{"description":"Unit price of a product in the cart that is not on sale; add product_price_sale and product_price_regular for discounted items."},"product_price_regular":{"description":"Regular (struck-through) unit price of the product in cart."},"product_price_sale":{"description":"Sale unit price of the product in cart."},"product_qty":{"description":"Quantity input field for the cart item."},"product_qty_minus":{"description":"Decrement-quantity (-) button for the cart item."},"product_qty_plus":{"description":"Increment-quantity (+) button for the cart item."},"product_remove":{"description":"Remove-from-cart button (usually a cross in the row)."},"product_total":{"description":"Subtotal for the cart row (unit price × quantity)."},"product_excerpt":{"description":"Short product description in the cart row"},"product_sale_percent":{"description":"Product discount percentage in the cart row"},"product_qty_text":{"description":"Product quantity as text (no input field)"},"product_weight":{"description":"Product weight in the cart row"},"product_height":{"description":"Product height in the cart row"},"product_width":{"description":"Product width in the cart row"},"product_length":{"description":"Product length in the cart row"},"subtotal":{"description":"Cart subtotal (before discounts)"},"total":{"description":"Cart total (after discounts)"},"volume":{"description":"Total volume of the products in the cart (m³)"},"mobile":{"description":"Mobile version of the cart (the same AJAX-updated mini cart)"},"cart_order":{"description":"Container of the full cart order block (data-wc=\"full_cart\")"},"remove_all":{"description":"Button that empties the whole cart"},"remove_btn":{"description":"Button that removes the selected products"},"remove_item":{"description":"Checkbox that selects one product for removal"},"remove_items":{"description":"«Select all» checkbox for bulk removal"},"if_low_stock":{"description":"Conditional block: shown if the product is low in stock"},"low_stock":{"description":"The low-stock threshold of the product; works inside wp-cart=\"if_low_stock\"."}}},"wp-order":{"description":"Order fields on the order details page (My Account)","requires":"WooCommerce active, context: $order = wc_get_order($order_id)","values":{"items":{"description":"Order items loop container — the generator expands a foreach over the order's line items (account dashboard)."},"item_title":{"description":"Product title in the order row."},"item_link":{"description":"Product permalink in the order row."},"item_image":{"description":"Product image (src) in the order row."},"item_bg_image":{"description":"Product image as background-image in the order row."},"item_price":{"description":"Unit price of the product at the time the order was placed."},"item_qty":{"description":"Item quantity in the order."},"item_total":{"description":"Subtotal for the order row (unit price × quantity)."},"item_number":{"description":"Position of the item in the order: 1, 2, 3 … Place it inside the wp_order=\"items\" row — every row shows its own number."},"number":{"description":"Order number — short text identifier."},"date":{"description":"Order date in the theme's format."},"status":{"description":"Order status (pending, processing, completed, etc.) — label translated via WC."},"total":{"description":"Order total (items + shipping - discounts)."},"delivery":{"description":"Shipping method selected when the order was placed."},"payment":{"description":"Payment method selected when the order was placed."}}},"wp-wish-attr":{"description":"WooCommerce product attribute in the wishlist loop — e.g. size or color. Attribute name is pa_<slug> from product settings.","format":"wp-wish-attr=\"pa_size\" or wp-wish-attr=\"pa_color\"","requires":"Context: $item (YITH_WCWL_Wishlist_Item)"},"wp-wish-if-attr":{"description":"Conditional block: render only when the product has the named attribute. If the attribute is missing — the block is hidden.","format":"wp-wish-if-attr=\"pa_size\"","requires":"Context: $item (YITH_WCWL_Wishlist_Item)"},"wp-wish-term":{"description":"Taxonomy term of the product in the wishlist loop — category or tag (product_cat, product_tag).","format":"wp-wish-term=\"product_cat\" or wp-wish-term=\"product_tag\"","requires":"Context: $item (YITH_WCWL_Wishlist_Item)"},"wp-wish-if-term":{"description":"Conditional block: shown only if the product has a term of the taxonomy","format":"wp-wish-if-term=\"product_cat\"","requires":"Context: $item (YITH_WCWL_Wishlist_Item)"},"wp-set":{"description":"Universal HTML attribute setter. Format: `wp-set=\"name:value\"`. The wp-set attribute itself is removed, and the «name:value» pair is added as a regular HTML attribute on the same element. Multiple pairs can be specified with `;`: `wp-set=\"n1:v1; n2:v2\"`. Examples: `wp-set=\"type:date\"` → `type=\"date\"`; Schema.org microdata `wp-set=\"itemscope: ; itemtype: https:\/\/schema.org\/BreadcrumbList\"` → `itemscope=\"\" itemtype=\"https:\/\/schema.org\/BreadcrumbList\"`. If the value needs to be computed via PHP, use wp-set-php instead.","note":"Removes wp-set itself and adds the given names\/values as ordinary HTML attributes on the same element. Several pairs are separated with `;`. Example: `wp-set=\"type:date\"` → `type=\"date\"`. Schema.org markup: `wp-set=\"itemscope: ; itemtype: https:\/\/schema.org\/BreadcrumbList\"` → `itemscope=\"\" itemtype=\"https:\/\/schema.org\/BreadcrumbList\"`. If the value must be computed in PHP, use wp-set-php.","format":"wp-set=\"attribute:value\"  \/  wp-set=\"a1:v1; a2:v2\"  (several pairs separated by ;)"},"wp-set-php":{"description":"Sets an HTML attribute from a PHP expression — the value «name:php_code» becomes name=\"<result>\" with the code evaluated and escaped at render.","note":"Same as wp-set, but the value comes from running PHP code. Useful for dynamic id\/data-* attributes. Example: `wp-set-php=\"id: echo $term->term_id\"` → `id=\"<?php echo $term->term_id ?>\"`. For static values use wp-set.","format":"wp-set-php=\"attribute: php code\""},"wp-php":{"description":"Runs arbitrary PHP code in place of the element — the generator wraps the value in <?php ... ?>. Maximum freedom: variables, loops, function calls. For simply printing a value php-echo is more convenient (echo is implied), for conditional display use php-if \/ wp-if.","note":"Generates <?php echo expression ?> or just the expression. Use sparingly","format":"wp-php=\"echo get_field(...)\""},"wp-menu":{"description":"Outputs a WordPress menu by its name from the admin (Appearance → Menus). Items take the classes of the first link; items with sub-items become a two-level dropdown. For a dropdown of your own design use wp-menu-tree.","format":"wp-menu=\"Menu name\""},"wp-field":{"description":"Stable submission key for a form field. Without it the field is submitted under its Webflow label — so renaming that label in the Designer silently breaks the mail template and any delivery mapping that referenced it, while submissions keep arriving. Place it on the field itself or on its wrapper (label + field).","note":"The key is stamped at generation time into name and data-name, the same way checkout fields work, so nothing in the theme has to change. The id is deliberately left alone, which keeps your <label for> working. The key is normalised like a POST name (spaces and dots become underscores; Latin letters, digits, _ and - only); service names — anything starting with an underscore, plus action, file, form_id, form_time, email_confirm — are rejected and reported in the project log rather than applied silently. Fields whose name is dictated by the receiver (comments, reviews, checkout) keep their own marks and are never overridden.","format":"wp-field=\"phone\" — on the field itself or on its wrapper (label + field)"},"wp-term-query":{"description":"Loop over taxonomy terms (WP_Term_Query \/ get_terms). Parameters either in short form («product_cat») or full string («'taxonomy' => 'product_cat', 'parent' => 0»). Inside, use term-title, term-link, term-count.","note":"Inside, use term-title, term-link, term-count, term-children","format":"wp-term-query=\"product_cat\" or wp-term-query=\"'taxonomy' => 'product_cat', 'parent' => 0\""},"wp-post-term":{"description":"The first term of the current post in a taxonomy (category, post_tag, product_cat, pa_color…): name and link on an <a>, the name elsewhere. All terms as badges: wp-post-term-query; all in one line: wp-post-terms.","note":"Prints the first term of the current post; nothing when the post has none","format":"wp-post-term=\"product_cat\" \/ \"category\" \/ \"pa_color\""},"wp-attr-terms":{"description":"Loop over all terms of a WooCommerce product attribute. For example, iterates all sizes (pa_size) or all colors (pa_color). Used on the product page or in filters.","note":"Iterates over every value of an attribute (for example every size). Inside, use term-title, term-link. The value \"*\" means the terms of the CURRENT attribute — it works only inside a wp=\"var-attrs\" container (outside it there is nothing to iterate, and this is reported in the Logs)","format":"wp-attr-terms=\"pa_size\" \/ \"pa_color\" \/ \"*\""},"wp-auto-attr-terms":{"description":"Loop over the terms of the CURRENT attribute inside var-attrs (attribute form; the canonical one is wp=\"auto-attr-terms\")","note":"The same as wp-attr-terms=\"*\", under its own name. Useful when one source is built by two generators: one that does not know the mark leaves the markup static instead of producing code without a loop.","format":"wp=\"auto-attr-terms\" (canonical) or wp-auto-attr-terms"},"wp-cart-attr":{"description":"Outputs the value of a WooCommerce product attribute in the cart loop. For example, the size or color of the product in the cart row. Value is the attribute slug (pa_size).","note":"Inside wp_cart=\"items\" — prints the value of a product attribute (for example the size) in the cart row","format":"wp-cart-attr=\"pa_size\" \/ \"pa_color\""},"wp-if-attr":{"description":"Conditional block: render only when the current product has the named attribute. If the attribute is missing — the whole block is hidden.","note":"If the current product has no value for the attribute, the block is hidden","format":"wp-if-attr=\"pa_size\""},"wp-cart-if-attr":{"description":"Conditional block in the cart context: render only when a cart item has the named attribute. The cart-row analogue of wp-if-attr.","note":"Same as wp-if-attr, but in the wp_cart=\"items\" context","format":"wp-cart-if-attr=\"pa_size\""},"wp-post-id":{"description":"Outputs the current post ID, optionally with a text prefix — handy for building unique anchors, form field names, or data attributes that need to reference the post.","note":"Place it on the element that should carry an identifier like «prefix-ID» (for unique anchors, JS selectors, data-attribute values). The value is any prefix; it is joined to the post ID with a hyphen. Without a prefix, leave the value empty and the plain ID is printed.","format":"wp-post-id=\"prefix\""},"wp-has-term":{"description":"Conditional block — renders its contents only if the current post HAS at least one term in the given taxonomy (e.g. show a badge only for products in a sale category).","note":"Place it on a wrapper block. Without a colon it checks whether the post has at least one term of the given taxonomy; with a colon it checks one specific term by slug. If the condition holds, the block is shown; otherwise it is hidden.","format":"wp-has-term=\"taxonomy\"  \/  wp-has-term=\"taxonomy:term-slug\""},"wp-has-not-term":{"description":"Conditional block — renders its contents only if the current post does NOT have a term in the given taxonomy. The inverse of wp-has-term.","note":"The opposite of wp-has-term. Place it on a wrapper block. Without a colon the block is shown if the post has no term of that taxonomy; with a colon, if the post lacks one specific term.","format":"wp-has-not-term=\"taxonomy\"  \/  wp-has-not-term=\"taxonomy:term-slug\""},"wp-in-stock":{"description":"Conditional block by the product's stock status: with 1 it renders only for a product in stock, with 0 only for a product that is out of stock. Typical use — a buy form wrapped in 1 and an «Out of stock» notice wrapped in 0, so each product shows exactly one of them.","note":"Place it on a wrapper block. Values: 1 (in stock) or 0 (out of stock); the WooCommerce status names instock, outofstock and onbackorder are accepted as well. A product on backorder matches neither 1 nor 0, so it shows neither block — mark a separate block with onbackorder if you need one. Both spellings work: wp_in_stock and wp-in-stock. Any other value is not guessed: the block is left unconditional and the attribute is reported in the project's «Logs» tab.","format":"wp-in-stock=\"1\"  \/  wp-in-stock=\"0\""},"wp-count":{"description":"Outputs a pluralised label with the result count — e.g. «12 products» \/ «1 product» — choosing the correct grammatical form for the number.","note":"Prints the number of posts in the current term or query together with the right plural form of the noun. List three forms separated by commas (as in WordPress _n()). Used inside wp-term-query or a similar block where the current term has a post count. Example: `article, articles, articles` → «5 articles», «1 article».","format":"wp-count=\"singular, plural, plural (many)\""},"wp-paginate":{"description":"Renders pagination links for archives and search results via paginate_links(). Parameters (mid_size, end_size, prev\/next text…) are passed in the value.","note":"Place it on the container the navigation goes into. The value holds optional parameters joined with `&`: `mid_size` (default 1) — how many page numbers to show before and after the current one; `end_size` (default 1) — how many at the start and the end; `prev_next` (1\/0) — whether to show the Previous\/Next buttons; `prev_text` \/ `next_text` — the text of those buttons (default «<» and «>»); `show_all` (1\/0) — whether to list every page. For a custom query use wp-paginate-query.","format":"wp-paginate=\"parameters\"  \/  wp-paginate (no value)"},"php-echo":{"description":"Outputs the result of a PHP expression as the element content. Do not write the word echo — it is implied: php-echo=\"get_the_title()\" prints the current post title. For short safe constructs; for code blocks with logic use wp-php.","format":"php-echo=\"expression\""},"wp-post-time":{"description":"Outputs the publish time of the current post via get_the_time(). Respects the site's date\/time format settings. Must run inside The Loop.","note":"Prints the publish date in the given format (PHP date() syntax). An empty value uses the default format from the WordPress settings. Example: `wp-post-time=\"d.m.Y\"` → 21.05.2026; `wp-post-time=\"d F\"` → 21 May.","format":"wp-post-time=\"format\""},"wp-post-terms":{"description":"Lists the names of all terms a post belongs to in a given taxonomy, joined by commas — e.g. all product categories or tags of the current item.","note":"Prints the names of ALL terms of the given taxonomy assigned to the current post, separated by `\", \"`. Handy for a «Tags:» \/ «Categories:» line. If the post has no terms in that taxonomy, nothing is printed.","format":"wp-post-terms=\"taxonomy\""},"wp-post-term-link":{"description":"Sets the href to the archive link of the post's first term in the given taxonomy — turns the element into a clickable link to that category\/tag.","note":"Place it on an `<a>` or any element with an `href`. The `href` is replaced with the URL of the post's first term in the given taxonomy. The wp-post-term-link attribute itself is removed.","format":"wp-post-term-link=\"taxonomy\""},"wp-post-term-query":{"description":"Loops over the taxonomy terms the current post belongs to, rendering the inner markup once per term. Use it to print a list of category badges, each linked and styled.","note":"A loop container. Inside it `$term` — the current term — is available, so wp-term-title, wp-term-link and wp-count work. The terms come from `wp_get_post_terms()`.","format":"wp-post-term-query=\"taxonomy\""},"wp-post-term-path":{"description":"Renders breadcrumbs from the term hierarchy of the post — the chain of ancestor terms down to the current one, each as a link. Ideal for category breadcrumb trails.","note":"Place it on an `<a>` — the template of one breadcrumb. It is repeated for every ancestor of the post's term, each crumb linking to `get_term_link()`. A separator (usually `<span class=\"br-sep\">\/<\/span>`) is added before each crumb. For taxonomy archives use wp-term-path.","format":"wp-post-term-path=\"taxonomy\""},"wp-term-path":{"description":"Renders breadcrumbs for a taxonomy archive page — the ancestor chain of the currently queried term. Place it on the category\/tag archive template.","note":"Same as wp-post-term-path, but for the archive page of the taxonomy itself (not a single post). Takes the page's current term from `get_queried_object_id()`. Each crumb links to an ancestor term.","format":"wp-term-path=\"taxonomy\""},"wp-var-attrs-skip":{"description":"A manual list of variation attributes that the wp=\"var-attrs\" auto-block must not render","note":"Place it on the wp=\"var-attrs\" container itself. Usually not needed: attributes placed by hand (wp-attr-terms=\"pa_x\" \/ wp-if-attr=\"pa_x\") in the SAME render context — inside the same product loop, or on the page itself for a block outside loops — are excluded automatically. It is needed when the hand-made markup lives in another file (a template part) the page cannot see. The names are added to the ones found automatically. The mark is a build instruction and does not reach the finished template.","format":"wp-var-attrs-skip=\"pa_color, pa_size\""},"wp-template-cpt":{"description":"Binds the template file to a specific custom post type (CPT). Placed on the `<body>` tag. WordPress shows this template in the «Template» dropdown when editing posts of the named CPT.\r\n\r\nExample:\r\n```html\r\n<body wp-template-cpt=\"product\">\r\n  ...template content...\r\n<\/body>\r\n```\r\nThis template becomes selectable for posts of type `product` (WooCommerce product).","note":"Place it on `<body>`. The generator adds a `\/* Template Post Type: <post_type> *\/` header to the template file, so WordPress offers this template in the «Template» dropdown when editing posts of that type. The attribute itself is removed from body.","format":"wp-template-cpt=\"post_type\""},"wp-comment-form":{"description":"Renders the WordPress comment form for the current post via comment_form() — respects discussion settings and moderation rules.","note":"Used without a value. Replaces the element's content with the standard comment form, `comment_form()`. The form's fields, button and texts come from the WordPress settings and the theme's styles.","format":"wp-comment-form"},"wp-comment-list":{"description":"Renders the list of comments for the current post — threaded replies, author avatars, and dates per theme settings.","note":"Used without a value. Replaces the element's content with the comment list, `wp_list_comments()`. Often used together with wp-comment-form.","format":"wp-comment-list"},"wp-paginate-query":{"description":"Pagination for a named or custom query rather than the main loop — point it at the same query used by wp-query-name \/ a custom WP_Query.","note":"Same as wp-paginate, but tied to a named WP_Query (registered with wp-query-name) instead of the global `$wp_query`. The pagination parameters are the same.","format":"wp-paginate-query=\"query_name\""},"wp-sidebar":{"description":"A widget area (dynamic sidebar): the element content is replaced with the widgets the admin put into that area (Appearance → Widgets). The value is the area name; the theme registers it automatically at generation. Plugin widgets go here too — e.g. the Premmerce catalog filter.","note":"Place it on a container. The element's content is replaced with `dynamic_sidebar()` for the given name. Sidebars are registered in the theme's functions.php.","format":"wp-sidebar=\"sidebar_name\""},"wp-filter-form":{"description":"Turns a Webflow form into a WooCommerce\/WordPress filter form — submitting it filters the product\/post archive by the contained fields (terms, ranges, search).","note":"Place it on a `<form>`. The generator removes wp-filter-form and adds to the form: `action=\"<?php echo get_home_url() ?>\/index.php#results\"`, `data-action=\"search_filter_ajax\"` and a hidden `<input type=\"hidden\" name=\"post_type\" value=\"<post_type>\">`. Works together with wp-filter-query (the results container): both are on the page, the form sends GET parameters and the container builds a WP_Query from them.","format":"wp-filter-form=\"post_type\""},"wp-range-slider":{"description":"A range-slider UI control for a numeric filter (e.g. price). Pairs with wp-range-min \/ wp-range-max inputs inside the same filter form.","note":"Place it on the slider container. Its pair marks are wp-range-min and wp-range-max on the inputs inside. Used inside wp-filter-form to filter products by a numeric attribute (price, rating and so on). The field name is usually `_price` (the WooCommerce price filter).","format":"wp-range-slider=\"field_name\""},"wp-range-min":{"description":"The minimum-value input of a range filter — its value seeds the lower bound of the filter (and reflects the current $_GET value on reload).","note":"Place it on an `<input>`. The generator renames the element's `id` and `name` to `min_pm_<suffix>` and fills the value from `$_GET` (or the default). Its pair is wp-range-max. Used inside wp-filter-form with wp-range-slider.","format":"wp-range-min=\"suffix\""},"wp-range-max":{"description":"The maximum-value input of a range filter — the upper bound, mirroring wp-range-min behaviour.","note":"Same as wp-range-min. The generator renames `id` and `name` to `max_pm_<suffix>` and fills the value from `$_GET`.","format":"wp-range-max=\"suffix\""},"wp-term-tree":{"description":"Renders a hierarchical tree of taxonomy terms with recursive nesting — parent terms with their children, to any depth. The first child element becomes the row template.","note":"A loop container that prints terms with their nesting (parents → children). `$term` is available inside. Used for catalogues and product menus.","format":"wp-term-tree=\"taxonomy\""},"wp-checkbox-terms":{"description":"Renders a checkbox list of taxonomy terms for a filter — each checkbox toggles one term in the archive query. The first checkbox row is the template.","note":"Place it on the checkbox template (for example `<label class=\"w-checkbox\">`). The generator repeats the template for every term of the taxonomy, renames the `<input>` to `name=\"<taxonomy>[]\"` (an array), adds `value=\"<term slug>\"` and checks the box when the term is already in `$_GET[\"<taxonomy>\"]`. Used inside wp-filter-form.","format":"wp-checkbox-terms=\"taxonomy\""},"wp-load":{"description":"Turns the element into a «Load more» button that AJAX-loads the next page of the current query and appends results — infinite-scroll-style pagination.","note":"Place it on an `<a>` or `<button>`. The generator removes wp-load and adds `data-load=\"<name>\"` + `style=\"display:none;\"` (the button appears only when there is a next page). Its pair is wp-load-part, which names the block to load.","format":"wp-load=\"post_type\""},"wp-include":{"description":"Inserts another PHP file of the theme at this spot (a plain include; name without extension — .php is added automatically). Key difference from wp-part: the generator does NOT create or overwrite the wp-include file on theme updates — it is your own partial, written and maintained by hand, and it survives updates. Trick: place wp-part first so the generator extracts the element markup into a file once, then switch the attribute to wp-include — the file stops being overwritten and can be refined by hand.","note":"The element's content is replaced with `<?php include(\"<name>.php\"); ?>`. Give the file name without the extension — the generator adds `.php`. The file must exist in the theme root.","format":"wp-include=\"file_name\"  (no extension)"},"wp-part":{"description":"Extracts the element into a separate reusable file (a WordPress template part) and includes it via get_template_part(). Key difference from wp-include: the file is generated from the Webflow markup and is OVERWRITTEN on every theme update — editing it by hand is pointless, edit the source element in Webflow. Handy as an AJAX-refresh target. Combo: wp-part extracts the file once, then you switch the attribute to wp-include — and edit the file by hand without overwrites.","note":"Like wp-include, but uses the WordPress API `get_template_part()`, so child themes and plugins can override the template. The slug is the file name without the extension, relative to the theme root.","format":"wp-part=\"slug\""},"wp-shortcode":{"description":"Executes a WordPress shortcode in place via do_shortcode() — embed plugin output (forms, sliders, WC blocks) anywhere in the layout.","note":"The element's content is replaced with the result of the shortcode run through `do_shortcode()`. The value is the full shortcode string, brackets and parameters included. Handy for Contact Form 7 forms, WooCommerce shortcodes and the like.","format":"wp-shortcode=\"[shortcode atr=val]\""},"wp-product-query":{"description":"A WooCommerce loop over the results of a custom product query — related, upsell, cross-sell, or recently-viewed products. Carries WC product context inside.","note":"A loop container. Inside it `$product = wc_get_product(get_the_ID())` is available. Handy for «Frequently bought together» or «Related products» blocks. Any WP_Query arguments can also be passed as a string.","format":"wp-product-query=\"get_related_products(4)\" \/ \"get_upsell_products(4)\" \/ any PHP expression returning WP_Query args"},"wp-select":{"description":"Builds a <select> from the results of a named query or an ACF repeater — useful for dynamically populated dropdowns.","note":"Place it on a container (usually with `<option>` templates inside). The query name is either the name of an ACF repeater (`have_rows`) or of a named WP_Query registered with wp-query-name. Every iteration adds one `<option>` (or whatever template is inside).","format":"wp-select=\"query_name\""},"wp-rotation":{"description":"A grouping counter that splits loop results into groups of N (e.g. columns) — increments per item so you can wrap every N items in a row.","note":"Place it on a loop container (`<div wp=\"posts\">`, `<div wp-query=\"...\">`). Inside the loop `$rotation` cycles through 1..N. Used to group items: with N=4 every 4 items form a new row. Row wrappers open on `if ($rotation === 1)` and close on `if ($rotation === N)`.","format":"wp-rotation=\"N\""},"php-before":{"description":"Inserts raw PHP code immediately BEFORE the element — for setup logic, opening control structures, or variable assignments that wrap the element.","note":"The generator inserts `<?php <code> ?>` right before the element's opening tag. Often paired with php-after for output buffering (capturing the element's HTML and post-processing it). Example: `php-before=\"ob_start();\"` + `php-after=\"echo strtoupper(ob_get_clean());\"` → the whole content of the element is upper-cased.","format":"php-before=\"php code\""},"php-after":{"description":"Inserts raw PHP code immediately AFTER the element — pairs with php-before to close control structures or run teardown logic.","note":"The generator inserts `<?php <code> ?>` right after the element's closing tag. Its pair is php-before. It can also be used alone (for example `<?php wp_reset_postdata(); ?>` after a loop).","format":"php-after=\"php code\""},"pm--sku":{"description":"A naming convention for a search input — an <input name=\"pm__sku\"> inside a filter form enables searching products by SKU. Set the name to pm__sku rather than adding a separate attribute.","note":"Numeric range inputs follow the same convention: min_pm__<attr> \/ max_pm__<attr> (covered by the wp-range-min \/ wp-range-max attributes).","format":"<input name=\"pm__sku\" id=\"pm__sku\" type=\"text\">  (no mark — this is a naming convention)","kind":"input-name","display_name":"pm__sku"},"wp-post-term-desc":{"description":"Outputs the description text of the post's first term in the given taxonomy. Useful for showing a short blurb under a category label.","note":"Inside a wp-post-terms block (or on its own) prints the `description` of the current term. On a taxonomy archive page, outside a post, it falls back to `get_queried_object()->description`.","format":"wp-post-term-desc=\"taxonomy\""},"wp-query-name":{"description":"Runs a post loop from a named query preset defined in the theme panel — admins build the query once (post type, taxonomy, ordering) and reference it by name.","note":"Works like wp-query, but the query arguments come from a named preset on the Queries screen of the theme panel. The loop is the same as wp-query; when WooCommerce is active, `$product` is available inside it.","format":"wp-query-name=\"query-preset-name\""},"wp-var-select":{"description":"A variation <select> for a WooCommerce variable-product attribute — populates options from the product's variations and drives the add-to-cart variation picker.","note":"In a single-product context prints one `<option>` per value of the given variation attribute. Place it on the `<select>`; it gets `name=\"attribute_<attr>\"`, as WooCommerce expects for variation selection.","format":"wp-var-select=\"pa_attribute\""},"wp-attr-meta":{"description":"Loops over a product's custom (non-taxonomy) WooCommerce attributes — the per-product attributes defined directly on the product rather than as global pa_* taxonomies.","note":"Unlike wp-attr-terms, this works with a product's custom attributes (not a global pa_* taxonomy), i.e. values entered on the product itself. The name is written exactly as it is set in the product attribute, including non-Latin characters.","format":"wp-attr-meta=\"Attribute name\""},"wp-cart-term":{"description":"Outputs a taxonomy term of the product in a cart row — e.g. the category or a custom attribute term, shown next to each cart line item.","note":"Inside the cart loop (`wp-cart=\"items\"`) prints the names of the given taxonomy's terms for the product in the row. Works like wp-cart-attr, but for terms. Its pair is wp-cart-if-term (conditional output when the term is present).","format":"wp-cart-term=\"taxonomy\""},"wp-cart-if-term":{"description":"Conditional block inside a cart row — renders its contents only if the line-item product has the given taxonomy term.","note":"Conditional block in the cart loop: shows the wrapped block if the product in the row has the given term. Works like wp-cart-if-attr, but for terms.","format":"wp-cart-if-term=\"taxonomy:term\"  or  wp-cart-if-term=\"term\""},"wp-radio-terms":{"description":"Renders a radio-button list of taxonomy terms for a filter — single-select variant of wp-checkbox-terms.","note":"The radio counterpart of wp-checkbox-terms. Place it on a `<label>` containing `<input type=\"radio\">`. The template is repeated for every term; the `<input>` gets `name=\"<taxonomy>\"` (a single value, not an array as with checkboxes) and `value=\"<slug>\"`, and the current choice from `$_GET` is checked automatically.","format":"wp-radio-terms=\"taxonomy\""},"wp-select-terms":{"description":"Renders a <select> dropdown of taxonomy terms for a filter — the option list is populated from the taxonomy at render time.","note":"The `<select>` counterpart of wp-radio-terms\/wp-checkbox-terms. Place it on a `<select>`. It gets `name=\"<taxonomy>\"`, one `<option value=\"<slug>\">` is printed per term, and the option matching `$_GET[<taxonomy>]` is marked `selected`.","format":"wp-select-terms=\"taxonomy\""},"wp-term-query2":{"description":"Nested term loop, level 2 — runs inside wp-term-tree \/ wp-term-query to render the children of the current term. Parent is set automatically from the outer loop.","note":"A nested loop inside a parent wp-term-query: iterates over the children of the current outer term (`parent => $term->term_id` is added to the arguments automatically). Inside it the term is `$term_2`.","format":"wp-term-query2=\"query parameters\""},"wp-term-query3":{"description":"Nested term loop, level 3 — the third level of a term hierarchy, nested inside a level-2 loop. Same auto-parent behaviour as level 2.","note":"Same as wp-term-query2, one level deeper (the children of `$term_2`). Inside it the term is `$term_3`.","format":"wp-term-query3=\"query parameters\""},"wp-term-select":{"description":"Loops over terms from a named term-query preset configured in the theme panel — lets an admin define the term set once and reuse it across templates.","note":"The WP_Term_Query counterpart of wp-query-name: the arguments come from a named term-query preset on the Queries screen of the theme panel.","format":"wp-term-select=\"preset-name\""},"wp-menu-tree":{"description":"Renders a WordPress menu by name with your own markup: one pattern for a plain item and one for an item with a dropdown (wp-menu-tpl=\"link\" \/ \"drop\"). Any depth: wp=\"menu-children\" inside a sub-item prints the next level.","note":"The menu counterpart of wp-term-tree: prints a menu with its nesting. Inside the block these marks work: `wp=\"menu_title\"`, `wp=\"menu_link\"`, `wp=\"menu_title_link\"`, `wp_if=\"menu_children\"`, `wp=\"menu_children\"` (recursion).","format":"wp-menu-tree=\"Menu name\""},"php-insert":{"description":"Inserts PHP code INSIDE the element, replacing its children — the element keeps its tag and attributes but its content becomes the code's output.","note":"Replaces the element's content (its children) with `<?php <code> ?>`. The element's own tags stay. Unlike php-replace, which removes the element itself.","format":"php-insert=\"php code\""},"php-replace":{"description":"Replaces the ENTIRE element (tag included) with the output of the PHP code — use when you need to swap the whole node for dynamic markup.","note":"Removes the element (tags and content) and puts `<?php <code> ?>` in its place. Same behaviour as wp-replace-php.","format":"php-replace=\"php code\""},"php-prepend":{"description":"Inserts PHP code at the START of the element's content — prepends the code output before the existing children.","note":"Keeps the element and its children and adds `<?php <code> ?>` BEFORE the children. Its pair is php-append. Combines with php-before\/php-after (different insertion points); cannot be combined with php-replace.","format":"php-prepend=\"php code\""},"php-append":{"description":"Inserts PHP code at the END of the element's content — appends the code output after the existing children.","note":"The mirror of php-prepend: adds `<?php <code> ?>` AFTER the element's children.","format":"php-append=\"php code\""},"wp-code":{"description":"Includes a PHP file inside the block's content. Filename is given without extension — the generator appends `.php`. The file must exist at the theme root.\r\n\r\nExample:\r\n```html\r\n<div class=\"custom-block\" wp-code=\"my-helper\"><\/div>\r\n```\r\nThe contents of `my-helper.php` are rendered inside the `<div>` (via `include`).","format":"wp-code=\"file_name\"  (no extension)"},"wp-html":{"description":"Inserts arbitrary HTML inside the element. The attribute value is an HTML string that becomes the element's children. The outer tag is preserved.\r\n\r\nExample:\r\n```html\r\n<div class=\"hint\" wp-html=\"<strong>Important!<\/strong> Check the field.\"><\/div>\r\n```\r\nThe `<div>` gains an inner `<strong>` element.","format":"wp-html=\"any html\""},"wp-replace":{"description":"Replaces the ENTIRE element with arbitrary HTML. Unlike wp-html the outer container is also removed.\r\n\r\nExample:\r\n```html\r\n<div class=\"placeholder\" wp-replace=\"<hr class='separator'>\"><\/div>\r\n```\r\nThe `<div>` is replaced with the bare `<hr>`.","format":"wp-replace=\"any html\""},"wp-replace-php":{"description":"Replaces the ENTIRE element with the result of PHP code. Analogue of php-replace (two aliases of the same semantics).\r\n\r\nExample:\r\n```html\r\n<div class=\"placeholder\" wp-replace-php=\"echo do_shortcode('[my-form]');\"><\/div>\r\n```\r\nThe `<div>` is replaced with the shortcode output.","format":"wp-replace-php=\"php code\""},"wp-php-class":{"description":"Dynamic CSS class from a PHP variable or expression. Added to the existing `class` attribute separated by a space.\r\n\r\nExample:\r\n```html\r\n<div class=\"card\" wp-php-class=\"get_field('extra_class')\">\r\n  Card content\r\n<\/div>\r\n```\r\n`class=\"card\"` becomes `class=\"card <result-of-PHP>\"` (e.g. `card featured-2025`).","format":"wp-php-class=\"$variable_or_expression\""},"wp-load-part":{"description":"Marks the block that is loaded via AJAX when the paired wp-load button with the same name is clicked. Used for «Show more» and similar lazy-load flows.\r\n\r\nExample:\r\n```html\r\n<div wp-query=\"'post_type' => 'product'\" wp-load-part=\"product\" class=\"product-list\">\r\n  <!-- products -->\r\n<\/div>\r\n<a wp-load=\"product\" class=\"btn\">Show more<\/a>\r\n```\r\nClicking the button loads more products into the block with `wp-load-part=\"product\"`.","format":"wp-load-part=\"name\""},"wp-size":{"description":"Thumbnail size for the post featured image. A modifier on an `<img>` element: changes the WordPress image size used to render the post thumbnail from the default `full` to the named size. Standard values: `thumbnail`, `medium`, `large` (or any size registered via `add_image_size()`).\r\n\r\nExample:\r\n```html\r\n<img wp-image wp-size=\"medium\" class=\"card-thumb\">\r\n```\r\nThe image is loaded at the `medium` size (smaller bytes, faster on listing pages).","format":"wp-size=\"medium\"  \/ \"large\" \/ \"thumbnail\" \/ any registered size"},"wp-fields-group":{"description":"Creates an ACF\/SCF field group from the field attributes inside the element it is placed on. Put it on the element that holds the fields — most often on body; the value is the group name in the admin (alternative: wp_meta). Without wp-fields-group on the page, no field groups are created for that template automatically (you can still add them manually in ACF\/SCF settings). It does not create template files — those are generated from the Webflow pages separately.","note":"The group is bound to the template where the fields stand: page → the current page template (post_template), single-{cpt} → post type {cpt}; option fields — by placing them on the theme-options page; term (taxonomy) fields — to the archive template \/ taxonomy. One page can hold several groups (several wp-fields-group with different fields inside), but do not repeat the same fields in different groups of one template — they will be duplicated in the admin and may cause bugs when filling them in.","format":"wp-fields-group=\"Group name\""},"wp-show-editor":{"description":"Keeps the WP visual editor visible on pages bound to a template via wp-fields-group. By default the editor is hidden — this attribute brings it back.","note":"Place it on body. By default the editor is hidden on pages with wp-fields-group; with this attribute it stays visible.","format":"wp-show-editor","placement":"body"},"fld-":{"description":"value belongs to a specific post, page, or CPT entry","prefix":"fld-","context":"post","types":{"text":{"description":"Single-line text field, the most common type. It replaces the element’s whole content with the field’s value; the text in the HTML becomes the field’s first value on “Load data”, not a fallback. Translatable via Polylang\/WPML.","acf_type":"text"},"textarea":{"description":"Another spelling of fld-area: the same multi-line plain-text field.","acf_type":"textarea","alias_of":"area"},"wysiwyg":{"description":"Another spelling of fld-editor: the same visual editor field.","acf_type":"wysiwyg","alias_of":"editor"},"image":{"description":"Image field. On an <img> the build takes src from the field and removes srcset and sizes, so the image chosen in the admin is the one shown; alt and class stay as in the markup.","acf_type":"image","return_format":"url"},"file":{"description":"Arbitrary file upload — PDF, DOCX, ZIP, etc. The URL is injected into the href of an <a>. Standard media uploader in admin.","acf_type":"file","return_format":"url"},"link":{"description":"Universal link as a plain-text field — user enters a URL, the generator writes it into href. No post picker, no scheme validation.","acf_type":"text"},"select":{"description":"Drop-down list — (label, value) pairs are configured in the Theme Panel via a sub-repeater.","acf_type":"select"},"radio":{"description":"Radio buttons — pick one option from a predefined list. Options are configured in the Theme Panel.","acf_type":"radio"},"loop":{"description":"Repeater — the user adds any number of rows, each with its own set of fields. Inside fld-loop, use ordinary fld-* attributes; the parser detects that they belong to the row. The TF analogue of the ACF\/SCF Repeater.","acf_type":"repeater"},"group":{"description":"Container of nested fields — all fld-* inside become sub-fields of the group in admin. No own value, just structures the Theme Panel.","acf_type":"group"},"page_link":{"description":"Link to a WordPress page — drop-down picker over existing pages, posts, and CPTs in admin. Returns the permalink and respects the active Polylang\/WPML locale.","acf_type":"page_link"},"google_map":{"description":"Full Google Map object — synonym for gmap. Read via get_field as an array (lat, lng, address, place_id, zoom).","acf_type":"google_map","alias_of":"gmap"},"show":{"description":"Conditional block reveal — true in admin keeps the block on the front, false removes it (via CSS display:none or a PHP guard).","acf_type":"true_false"},"hide":{"description":"Conditional block hide — mirror of show with inverted logic. true in admin removes the block from the markup.","acf_type":"true_false"},"bg_image":{"description":"Block background image — the generator writes the URL into the inline background-image style. If the block also has a background color or gradient, the image may not render in some browsers.","acf_type":"image","return_format":"url"},"lbox_image":{"description":"Lightbox image — the generator wraps the <img> in an <a href> pointing to the full size with attributes that trigger a modal viewer (Fancybox, GLightbox, native).","acf_type":"image","return_format":"url"},"lbox_video":{"description":"Lightbox video — the field accepts a URL (YouTube, Vimeo, MP4) and turns into a lightbox link with on-click embed.","acf_type":"text"},"youtube":{"description":"YouTube video by URL — the generator inserts an embed iframe into the current element.","acf_type":"text"},"video":{"description":"Video by URL — place it on a video block and the admin gets a text field for any video link (YouTube, Vimeo, …); on the front it plays as an embedded player.","acf_type":"text"},"lottie":{"description":"Lottie animation — the field accepts a URL to a JSON file. On the front, it boots a lottie-player on the current element.","acf_type":"text"},"layouts":{"description":"Flexible Content — the user picks different block types in admin and arranges them in arbitrary order. Each block type is a separate fld-layout with its own markup.","acf_type":"flexible_content"},"layout":{"description":"A single block template inside fld-layouts — contains the elements rendered for a specific layout variant.","acf_type":"text"},"email_link":{"description":"Email link in one attribute — the generator builds href=\"mailto:...\" and injects the address from the field as the visible link text inside <a>.","acf_type":"text"},"phone_link":{"description":"Phone link in one attribute — the generator builds href=\"tel:...\" and injects the number from the field as the visible text inside <a>.","acf_type":"text"},"anchor":{"description":"Anchor link — the field accepts an identifier without the # sign; the generator prepends the hash when writing into href.","acf_type":"text"},"title":{"description":"Writes the value into the HTML title attribute — the tooltip on hover. Most common on links and images.","acf_type":"text"},"alt":{"description":"Writes the value into the alt attribute of an img tag — the image description for accessibility and SEO. Polylang\/WPML-aware.","acf_type":"text"},"code":{"description":"Arbitrary code snippet — the value is printed verbatim, no escaping (raw output). Use for tracking pixels, third-party iframe widgets, inline styles.","acf_type":"acf_code_field"},"class":{"description":"Writes the value into the HTML class attribute. Useful for conditional styling: pick a string in admin (e.g. is-featured) and it becomes a block class on the front.","acf_type":"text"},"placeholder":{"description":"Writes the value into the placeholder attribute of an input or textarea — the hint shown inside an empty form field.","acf_type":"text"},"value":{"description":"Writes the value into the value attribute of input\/select — for defaulting form inputs from admin-editable copy.","acf_type":"text"},"id":{"description":"Writes the value into the HTML id of the current element. For auto-generation from content, see auto_id or slug_id.","acf_type":"text"},"bg_color":{"description":"Background color — writes the value into the inline background-color style. Color-picker in admin.","acf_type":"color_picker"},"color":{"description":"Text color — writes the value into the inline color style of the current element. The admin shows a color-picker with alpha.","acf_type":"color_picker"},"style":{"description":"Arbitrary inline CSS on the current element — writes the value into the style attribute. Use sparingly: it overrides stylesheets.","acf_type":"text"},"custom":{"description":"Arbitrary custom attribute: exposes any HTML attribute of the element to the admin as an editable field. Value format: \"attr-name:Label in admin\". For example, to make src or href editable: fld-custom=\"src:Image link\" or fld-custom=\"href:Link field name\". Need several on one element — use the numbered variants fld-custom1...fld-custom20.","acf_type":"text"},"shortcode":{"description":"Shortcode as a field value — the content is passed through do_shortcode before output. Any WordPress shortcode in any place in the theme.","acf_type":"text"},"area":{"description":"Multi-line plain-text field without a visual editor: line breaks typed in the admin become line breaks on the site. For leads, addresses and short descriptions.","acf_type":"textarea"},"editor":{"description":"Visual editor (TinyMCE) for formatted text: headings, lists, links, images. Put it on a div: WordPress wraps the text in paragraphs itself.","acf_type":"wysiwyg"},"checkbox":{"description":"Binds an input[type=checkbox] state to a boolean ACF\/SCF field. The generator adds the checked attribute when the value is true.","acf_type":"text"},"gallery":{"description":"Image gallery — an array of images with drag-and-drop ordering. Rendered on the front as a loop over images.","acf_type":"gallery","return_format":"array"},"gmap":{"description":"Google Maps field — coordinates, address, and zoom in one picker with an interactive map. Requires a Google Maps API key in Theme Settings.","acf_type":"google_map"},"gmap_addr":{"description":"Textual address from a Google Map — extracts the address component from the gmap object. Useful for a caption under the map.","acf_type":"text"},"image_gallery":{"description":"Gallery without automatic lightbox wrapping — use it when your modal viewer is wired through a custom JS component.","acf_type":"gallery","return_format":"array"},"lbox_gallery":{"description":"Gallery in a lightbox — each image is automatically wrapped in an <a> with lightbox attributes for the chosen widget.","acf_type":"gallery","return_format":"array"},"checkbox_custom":{"description":"Custom checkbox inside fld-loop — every row gets a unique name, so form submission returns an array of values.","acf_type":"text"},"auto_id":{"description":"Generates a unique HTML id from the value of a linked ACF\/SCF field. Useful when repeater rows render in sequence and need stable ids for anchors or CSS.","acf_type":"text"},"slug_id":{"description":"Slug-style id with transliteration — the generator takes the value of the linked field and converts it to slug form (Cyrillic → Latin, spaces → hyphens, lowercase).","acf_type":"text"},"posts":{"description":"Loop over manually-chosen posts — rendered on the front as a WP_Query with the user-defined order preserved.","acf_type":"relationship"},"terms":{"description":"Loop over selected terms — the array from a taxonomy field, convenient for rendering tag clouds or link lists.","acf_type":"taxonomy"},"bg_video":{"description":"HTML5 background video — a group of three fields: poster placeholder, mp4, and webm. The generator attaches a <video> with autoplay\/muted\/loop to the block background.","acf_type":"group"},"list":{"description":"List of values via textarea — each line becomes an array element. Good for benefits, tags, simple enumerations without a full repeater.","acf_type":"textarea"}}},"opt-":{"description":"site-wide asset — logo, contacts, favicon","prefix":"opt-","context":"options","types":{"text":{"description":"Single-line text field, the most common type. It replaces the element’s whole content with the field’s value; the text in the HTML becomes the field’s first value on “Load data”, not a fallback. Translatable via Polylang\/WPML.","acf_type":"text"},"textarea":{"description":"Another spelling of fld-area: the same multi-line plain-text field.","acf_type":"textarea","alias_of":"area"},"wysiwyg":{"description":"Another spelling of fld-editor: the same visual editor field.","acf_type":"wysiwyg","alias_of":"editor"},"image":{"description":"Image field. On an <img> the build takes src from the field and removes srcset and sizes, so the image chosen in the admin is the one shown; alt and class stay as in the markup.","acf_type":"image","return_format":"url"},"link":{"description":"Universal link as a plain-text field — user enters a URL, the generator writes it into href. No post picker, no scheme validation.","acf_type":"text"},"loop":{"description":"Repeater — the user adds any number of rows, each with its own set of fields. Inside fld-loop, use ordinary fld-* attributes; the parser detects that they belong to the row. The TF analogue of the ACF\/SCF Repeater.","acf_type":"repeater"},"group":{"description":"Container of nested fields — all fld-* inside become sub-fields of the group in admin. No own value, just structures the Theme Panel.","acf_type":"group"},"layouts":{"description":"Flexible Content — the user picks different block types in admin and arranges them in arbitrary order. Each block type is a separate fld-layout with its own markup.","acf_type":"flexible_content"},"layout":{"description":"A single block template inside fld-layouts — contains the elements rendered for a specific layout variant.","acf_type":"text"},"area":{"description":"Multi-line plain-text field without a visual editor: line breaks typed in the admin become line breaks on the site. For leads, addresses and short descriptions.","acf_type":"textarea"},"editor":{"description":"Visual editor (TinyMCE) for formatted text: headings, lists, links, images. Put it on a div: WordPress wraps the text in paragraphs itself.","acf_type":"wysiwyg"},"bg_image":{"description":"Block background image — the generator writes the URL into the inline background-image style. If the block also has a background color or gradient, the image may not render in some browsers.","acf_type":"image","return_format":"url"},"show":{"description":"Conditional block reveal — true in admin keeps the block on the front, false removes it (via CSS display:none or a PHP guard).","acf_type":"true_false"},"hide":{"description":"Conditional block hide — mirror of show with inverted logic. true in admin removes the block from the markup.","acf_type":"true_false"},"custom":{"description":"Arbitrary custom attribute: exposes any HTML attribute of the element to the admin as an editable field. Value format: \"attr-name:Label in admin\". For example, to make src or href editable: fld-custom=\"src:Image link\" or fld-custom=\"href:Link field name\". Need several on one element — use the numbered variants fld-custom1...fld-custom20.","acf_type":"text"},"gallery":{"description":"Image gallery — an array of images with drag-and-drop ordering. Rendered on the front as a loop over images.","acf_type":"gallery","return_format":"array"},"lbox_image":{"description":"Lightbox image — the generator wraps the <img> in an <a href> pointing to the full size with attributes that trigger a modal viewer (Fancybox, GLightbox, native).","acf_type":"image","return_format":"url"},"file":{"description":"Arbitrary file upload — PDF, DOCX, ZIP, etc. The URL is injected into the href of an <a>. Standard media uploader in admin.","acf_type":"file","return_format":"url"},"anchor":{"description":"Anchor link — the field accepts an identifier without the # sign; the generator prepends the hash when writing into href.","acf_type":"text"},"alt":{"description":"Writes the value into the alt attribute of an img tag — the image description for accessibility and SEO. Polylang\/WPML-aware.","acf_type":"text"},"class":{"description":"Writes the value into the HTML class attribute. Useful for conditional styling: pick a string in admin (e.g. is-featured) and it becomes a block class on the front.","acf_type":"text"},"code":{"description":"Arbitrary code snippet — the value is printed verbatim, no escaping (raw output). Use for tracking pixels, third-party iframe widgets, inline styles.","acf_type":"acf_code_field"},"title":{"description":"Writes the value into the HTML title attribute — the tooltip on hover. Most common on links and images.","acf_type":"text"}}},"tax-":{"description":"value belongs to a term (category, tag, custom taxonomy)","prefix":"tax-","context":"term","types":{"text":{"description":"Single-line text field, the most common type. It replaces the element’s whole content with the field’s value; the text in the HTML becomes the field’s first value on “Load data”, not a fallback. Translatable via Polylang\/WPML.","acf_type":"text"},"area":{"description":"Multi-line plain-text field without a visual editor: line breaks typed in the admin become line breaks on the site. For leads, addresses and short descriptions.","acf_type":"textarea"},"image":{"description":"Image field. On an <img> the build takes src from the field and removes srcset and sizes, so the image chosen in the admin is the one shown; alt and class stay as in the markup.","acf_type":"image","return_format":"url"},"link":{"description":"Universal link as a plain-text field — user enters a URL, the generator writes it into href. No post picker, no scheme validation.","acf_type":"text"},"bg_image":{"description":"Block background image — the generator writes the URL into the inline background-image style. If the block also has a background color or gradient, the image may not render in some browsers.","acf_type":"image","return_format":"url"},"show":{"description":"Conditional block reveal — true in admin keeps the block on the front, false removes it (via CSS display:none or a PHP guard).","acf_type":"true_false"},"hide":{"description":"Conditional block hide — mirror of show with inverted logic. true in admin removes the block from the markup.","acf_type":"true_false"},"loop":{"description":"Repeater — the user adds any number of rows, each with its own set of fields. Inside fld-loop, use ordinary fld-* attributes; the parser detects that they belong to the row. The TF analogue of the ACF\/SCF Repeater.","acf_type":"repeater"},"group":{"description":"Container of nested fields — all fld-* inside become sub-fields of the group in admin. No own value, just structures the Theme Panel.","acf_type":"group"},"bg_color":{"description":"Background color — writes the value into the inline background-color style. Color-picker in admin.","acf_type":"color_picker"},"id":{"description":"Writes the value into the HTML id of the current element. For auto-generation from content, see auto_id or slug_id.","acf_type":"text"}}},"display":{"description":"Controls how the element is displayed in the ACF admin","values":{"table":{"description":"Renders a fld-looper as a table layout in the admin — a compact row grid. Good for short fields (name + price + quantity)."},"block":{"description":"Each repeater row is a separate block-card with vertically stacked fields. Default for most types."},"row":{"description":"Fields within a row flow horizontally (flex) — for short «label + value» pairs in admin."}}},"instructions":{"description":"Adds a help text (description) under a field’s label in the WordPress admin. Place it on the same element that carries a field attribute (fld-text, opt-link, a group or repeater container, …) and editors see your guidance right where they fill the field in.","note":"Works at any nesting level — leaf fields, group\/repeater rows, and the containers themselves. An instructions on a disabled or mistyped attribute is ignored, since no field is created for it.","format":"instructions=\"Hint text\""},"fld-no-import":{"description":"The field is created and works as usual, but «Load data» does not write the source value into it — content entered in wp-admin is neither overwritten nor wiped. Place it next to the field mark; the scope in the spelling does not matter (opt-no-import, tax-no-import mean the same). A value of 0 \/ false \/ off \/ no turns the mark off.","format":"fld-no-import=\"1\""},"block":{"description":"Reserved. Not implemented — the generator does not convert it.","format":"block=\"Block Name\""},"area":{"description":"Reserved. Not implemented — the generator does not convert it.","format":"area=\"Area Name\""},"php-if":{"description":"Conditional rendering: the element is output only if the PHP expression in the value is truthy. E.g. php-if=\"is_user_logged_in()\" shows the block to logged-in visitors only. Any boolean expression works; sibling of wp-if (which leans on ready-made WordPress conditions).","format":"php-if=\"condition\""},"__forms":{"description":"Form ID for the submission handler"},"__onclick":{"description":"JavaScript onclick (kept as onclick)"},"__target_tab":{"description":"Tab control"},"__query":{"description":"Query parameters"},"__recaptcha_response":{"description":"reCAPTCHA response"},"__telegram":{"description":"Telegram setting ID"},"__bitrix":{"description":"Bitrix24 setting ID"},"__amo":{"description":"amoCRM setting ID"},"__sender_reply":{"description":"Sender auto-reply setting ID"},"__ip":{"description":"Visitor IP address"},"__site":{"description":"Site domain"},"__browser":{"description":"Browser user agent"},"__attachments":{"description":"Attached files"},"sub-":{"description":"Compatibility prefix for a sub-field inside a repeater or group. Deprecated — do not use it in new markup: a plain fld-* inside the container already is a sub-field.","prefix":"sub-","types":{"text":{"description":"Single-line text field, the most common type. It replaces the element’s whole content with the field’s value; the text in the HTML becomes the field’s first value on “Load data”, not a fallback. Translatable via Polylang\/WPML."},"image":{"description":"Image field. On an <img> the build takes src from the field and removes srcset and sizes, so the image chosen in the admin is the one shown; alt and class stay as in the markup."},"link":{"description":"Universal link as a plain-text field — user enters a URL, the generator writes it into href. No post picker, no scheme validation."},"area":{"description":"Multi-line plain-text field without a visual editor: line breaks typed in the admin become line breaks on the site. For leads, addresses and short descriptions.","acf_type":"textarea"},"link_text":{"description":"Link text for a repeater sub-field — paired with sub-link, rendered between <a>...<\/a>. Use it when the link's label and URL are edited separately.","acf_type":"text"}},"deprecated":true},"wp-menu-tpl":{"description":"Menu item template marker inside wp-menu \/ wp-menu-tree. Place it on the item template so the parser does not have to guess templates: link — a plain item, drop — an item with a dropdown. A ThemeForge attribute (no alternative spelling).","values":{"link":{"description":"Template for a plain menu item with no nested children — a simple link. The generator uses this element as a «leaf» when building the menu."},"drop":{"description":"Template for a menu item with a dropdown — must contain wp=\"menu-children\" for the nested list. The generator recursively expands child items."}}}}}}