حلقه پرسوجو (Query Loop)
Query Loop builder برای همه المانهای layout، Accordion و Slider در دسترس است.
همچنین برای Accordion (Nestable)، Tabs (Nestable) و Slider (Nestable) قابل فعالسازی است.
پایگاه داده را (طبق پارامترهای کوئری) query میکند و نتایجی را که داخل حلقه میخواهید نمایش دهید رندر میکند (داده پویا).
میتوانید post typeها، taxonomy termها و userها را query کنید. موارد استفاده معمول:
- Posts: آخرین پستها، پستهای مرتبط (برای هر post type ثبتشده و public)
- Terms: دستهبندیها و تگهای پست، دستهبندی محصولات و غیره
- Users: فهرست نویسندگان وبلاگ، اعضای community و اعضای تیم
مهم
Bricks Query Loop بهطور خودکار commentهای HTML !--brx-loop-xxxxx--> را در frontend تولید میکند. این commentها برای AJAX Pagination، Query Filters، Load More و Infinite Scroll ضروری هستند.
یادداشت
این commentها را حذف نکنید — در غیر این صورت این قابلیتها ممکن است از کار بیفتند.
برخی افزونههای بهینهسازی عملکرد بهطور پیشفرض همه commentهای HTML را حذف میکنند. اگر چنین افزونهای دارید، commentهای تولیدشده Bricks را حفظ کنید.
نحوه ساخت query loop
یک المان «Container» به canvas اضافه کنید. تنظیم Use Query Loop را فعال کنید تا container به آیتم حلقه (repeater) تبدیل شود.

پس از فعالسازی Use Query Loop، کنترل Query (آیکون loop/infinity) را میبینید.
کنترل query را باز کنید و پارامترهای کوئری برای دریافت محتوا از پایگاه داده را تنظیم کنید.
این container اکنون repeater item شماست. همه المانهای داخل آن بهاندازه تعداد نتایج کوئری تکرار میشوند.
کنترل Query
کنترل Query سه object type پشتیبانی میکند: posts، terms و users.

- Posts کوئری از نوع WP_Query فعال میکند. پیشفرض است — برای حلقه posts، pages، media یا custom post type.
- Terms WP_Term_Query را فعال میکند — برای حلقهزدن اصطلاحات taxonomy. مفید برای فهرست دستهبندی محصولاتی که محصول دارند.
- Users WP_User_Query را فعال میکند — برای حلقه userهای سایت. مفید برای نویسندگان وبلاگ یا اعضای تیم (اگر بهعنوان user سایت ثبت شده باشند).
کنترلهای query بر اساس نوع انتخابشده تطبیق مییابند.
Query editor (PHP)
Bricks 1.9.1 کنترل Query editor را معرفی کرد که کوئری PHP سفارشی برای انعطاف و قابلیت query بیشتر.
Query editor پس از فعالسازی «Query editor (PHP)» ظاهر میشود.
یادداشت
باید code execution را در تنظیمات Bricks فعال کنید تا به این قابلیت دسترسی داشته باشید.

باید آرایه PHP حاوی WordPress query arguments برگردانید.
طبق screenshot، query editor از داده پویا پشتیبانی میکند.
کوئری Posts

Post type: یک یا چند post type (پیشفرض: posts)
Order by: مرتبسازی بر اساس post ID، author، title، published یا modified date، comment count، relevance، menu order یا random (پیشفرض: published date). (چند مقدار @since 1.11.1)
Order: صعودی یا نزولی (پیشفرض). (چند مقدار @since 1.11.1)
Posts Per Page: تعداد پست در هر صفحه (پیشفرض: وردپرس > تنظیمات > Reading > Blog pages show at most)
Offset: تعداد پستهای ردشده.
Ignore Sticky Posts: اگر نمیخواهید sticky posts به ابتدای مجموعه منتقل شوند فعال کنید.
Disable Query Merge: اگر نمیخواهید کوئری در archive، search و غیره auto-merge شود فعال کنید. معمولاً برای Query loop در footer، header یا non-main query. GUI برای فیلتر bricks/posts/merge_query است.
Child Of: parent ID برای برگرداندن فقط فرزندان. (post_parent در WP_Query)
Include/Exclude: شامل یا مستثنی کردن یک یا چند پست. میتوانید dynamic tag روی این کنترل هم استفاده کنید (@since 1.12)
Exclude Current Post: پست فعلی از حلقه مستثنی میشود (مفید برای «related posts»)
Terms Include/Exclude: شامل یا مستثنی پستهایی با یک یا چند term.
Taxonomy Query: یک یا چند taxonomy query برای فیلتر پستها.
Tax Query Relation: taxonomy queryها inclusive (OR) یا exclusive (AND).
Meta Query: یک یا چند meta query بر اساس custom field.
Relation: meta queryها inclusive (OR) یا exclusive (AND).
Random seed TTL: مدت (دقیقه) که random seed وجود دارد. برای جلوگیری از duplicate در order random. «0» برای خاموش کردن.
اگر TTL را 10 دقیقه بگذارید، نتیجه کوئری 10 دقیقه یکسان میماند — duplicate در صفحات مختلف یا infinite scroll جلوگیری میشود. (@since 1.7.1)
Is main query (Archive, Search): در قالب archive یا search، یکی از حلقهها را main query انتخاب کنید. 404 هنگام پیمایش صفحات جلوگیری میشود. Pagination element را هم درست تنظیم کنید.
این گزینه را برای چند کوئری روی یک صفحه فعال نکنید — فقط اولی main query archive میشود. (@since 1.8)
گزینههای مرتبسازی پیشرفته
از نسخه 1.11.1، Order By و Order در Bricks Query Loop چند معیار مرتبسازی را پشتیبانی میکنند. قوانین پیچیده مستقیماً در Bricks — بدون PHP filter سفارشی.

مثلاً مرتبسازی بر اساس name نزولی و سپس ID نزولی. Bricks معیارها را بهترتیب اعمال میکند.
سناریوهای مثال:
- Multi-Criteria Ordering: فهرست directory — ابتدا popularity (custom field) نزولی، سپس date added صعودی.
- Custom Order Clauses with Meta Queries: مرتبسازی بر اساس performance date و time در meta query. مثال کد در این مقاله.

بهترین روش برای Pagination و Order By
با چند معیار مرتبسازی، ID را بهعنوان معیار دوم بگنجانید تا duplicate در صفحات paginate نشود. مثلاً 5 پست در صفحه و 15 پست با price یکسان — فقط order by price ممکن است پست را در چند صفحه نشان دهد. order by price سپس ID نتیجه یکنواخت میدهد.
مثال 1: آخرین پستها
در این مثال چهار آخرین پست (تصویر شاخص، عنوان، excerpt) با Query Loop Builder.

Container به canvas اضافه کنید — blueprint هر آیتم کوئری.
Use Query Loop را فعال کنید.
Image داخل container — «Featured Image» از Dynamic Data.
Container دیگر با Heading و Text. Heading: {post_title}. Text: {post_excerpt}.
میتوانید Post Title element یا Post Excerpt element هم استفاده کنید.
Posts Per Page را روی 4 بگذارید.
کوئری Media
Bricks 1.5 امکان query فایلهای media (attachment post type). Media (attachment) در Posts query type.
پس از انتخاب Media، کنترل mime type. پیشفرض images؛ mime type دیگر با کاما (مثلاً image/jpeg,image/png,image/gif).
برای تصاویر attach شده به پست، Child of با post ID. پویا: {post_id}.

مثال 2: گالری media
Container، Block داخل آن، Image داخل Block.
Container: flex-wrap wrap، direction افقی (row). Block: Query Loop، Media post type، posts per page. Block layout: width و height (مثلاً 300px).
Image: {post_id} — attachment posts برمیگردد، image ID همان post ID. object-fit cover، height 300px.

کوئری محصولات WooCommerce
از 1.10، تنظیمات جدید برای WooCommerce products query. با انتخاب Products post type بخش WooCommerce. (فقط اگر WooCommerce فعال باشد)
مثال 1: محصولات Featured WooCommerce
10 محصول featured آخر در homepage:

مثال 2: محصولات Related WooCommerce
4 محصول related در قالب single product:

مثال 3: محصولات Upsells WooCommerce
3 upsell در قالب single product:

کوئری Terms

Taxonomies: یک یا چند taxonomy (پیشفرض: none).
Order by: term ID، name، parent، count یا include list.
Order: صعودی (پیشفرض) یا نزولی.
Number: تعداد term در هر صفحه. وردپرس پیشفرض all؛ Bricks پیشفرض Reading settings. 0 برای همه.
Offset: تعداد term ردشده.
Parent: parent term ID برای direct-child. 0 برای termهایی که فرزند دارند. مثلاً 55 فقط T-shirts.
Child of: term ID برای child terms. مثلاً 55 → T-shirts و Tees (ساختار).
Childless: (bool) فقط term بدون فرزند. روی non-hierarchical بیاثر. پیشفرض false.
Disable Query Merge: auto-merge خاموش. (@since 1.7.1)
Terms Include/Exclude: شامل/مستثنی term
Show empty: term بدون post assign.
Meta Query: فیلتر بر اساس custom field.
Relation: OR یا AND.
No Results: متن وقتی نتیجهای نیست.
Current post term: termهای assign شده به پست فعلی. (@since 1.8.4) فقط single post. فقط اگر «Type» = «Term». همان منطق bricks/terms/query_vars

مثال 3: دستهبندی محصولات
فهرست پویا دستهبندی محصول (تصویر + لینک archive).
WooCommerce و sample products. Container loop. Basic Text با {term_name}.

Query: «terms»، Taxonomy «Product Categories». در canvas بهاندازه دستهها container. dynamic data: term ID، name، archive URL، description، term meta.
Background image container: Product Category Image:

Container به archive لینک — Term Archive URL. HTML tag «a (link)»، link type Dynamic Data:

کوئری Users

Roles: یک یا چند role (پیشفرض: any)
Order by: user ID، name، username، nicename، login، email، registered date، post count یا include list.
Order: صعودی (پیشفرض) یا نزولی.
Number: تعداد user در صفحه. وردپرس all؛ Bricks Reading settings. -1 برای همه.
Offset: user ردشده.
Current post author: نویسنده پست فعلی (@since 1.9.1)
Disable Query Merge: (@since 1.7.1)
Meta Query: فیلتر custom field.
Relation: OR یا AND.
No Results: متن بدون نتیجه.
مثال 4: نویسندگان وبلاگ
بخش فهرست نویسندگان — role «Author».
Container با query user type. Image (ACF profile) و Basic Text {wp_user_display_name}.

المان Pagination
همراه query loop builder. Pagination در گروه WordPress پنل المانها.

Pagination جدا layout انعطافپذیر میدهد.
Pagination را به canvas اضافه کنید و در Related Query المان query را انتخاب کنید:

نکته: نام توصیفی به containerهای query-enabled بدهید.
Load more (دکمه)
علاوه بر infinite scroll، هر المان (معمولاً Button) با interaction «Load more» interaction:

Query loop در Accordion و Slider
Accordion و Slider هم Query Loop برای تغذیه پویا بخشها.
Query Loop control در Accordion — بهاندازه نتایج accordion item.
title، subtitle و content «master» accordion item بهعنوان template:

همان در Slider — Query control و slide item بهعنوان template:

Include/Exclude: پشتیبانی dynamic data tag
از 1.12، dynamic data tag در «Include» و «Exclude».
include/exclude پویا از ACF یا Meta Box relationship:
- Include: ID به
post__in. - Exclude: ID به
post__not_in.

داده پویا برای post ID از custom field — همراه meta query یا taxonomy query.
انواع فیلد پشتیبانیشده
- ACF: Relationship، Post Object، Gallery
- Meta Box: Relationship، Post، Image Advanced، Image، Image Upload، Single Image
- JetEngine: Relationship، Post، Gallery، Media (
@since 2.2)
مهم
با dynamic data در Include، Post Type با مقادیر فیلد همخوان باشد. Gallery field → Post Type Media.
مثال 1: ACF Relationship با Post Type و Order
ACF Relationship به چند post type — فقط «Book» به ترتیب relationship field:

مثال 2: Meta Box Image Advanced برای Nestable Slider
قبلاً PHP filter برای post__in. اکنون مستقیم در UI.
dynamic field، Post Type = Media، Mime Type در صورت نیاز.
یادداشت
داخل حلقه {post_id} و {post_title} — نه {featured_image}.

مثال 3: ACF Gallery با Random Order
Post Type Media، Mime Type در صورت نیاز، Random (rand).
یادداشت
{post_id} و {post_title} — نه {featured_image}.


Query Type: Array
Array query loop — حلقهزدن هر آرایه PHP یا JSON. (@since 2.2)
مفید برای:
- آرایههای پاسخ API. (API query)
- ترکیب منابع (posts + آرایه سفارشی).
- خروجی functionهای سفارشی.

مانند هر query Bricks: استایل، dynamic tag، pagination.
پشتیبانی: AJAX/non-AJAX pagination، Load More، Infinite Scroll
Use Case 1: آرایههای تودرتو از API
cars: ['BMW', 'Mazda'] — nested array loop و path در Array Editor:

Use Case 2: آرایه PHP سفارشی
Function با dynamic tag {echo:my_custom_array()}:
// Ensure that my_custom_array is whitelisted via the bricks/code/echo_function_names hook
function my_custom_array() {
return [
['name' => 'John', 'age' => 30],
['name' => 'Jane', 'age' => 25],
];
}
Dynamic Data Tag: {query_array:raw}
{query_array:raw} - مقدار آرایه فعلی (لیست ساده رشته).
{query_array:raw @key:'age'} - کلید خاص از آیتم آرایه.
مثال 1: لیست ساده
{query_array:raw} داخل حلقه.
مثال 2: آرایه Associative
[
['name' => 'John', 'age' => 30],
['name' => 'Alan', 'age' => 25],
['name' => 'Pony', 'age' => 66]
]
{query_array:raw @key:'name'} و {query_array:raw @key:'age'}
مثال 3: آرایههای تودرتو
[
{
"name": "John",
"age": 30,
"cars": ["Ford", "BMW", "Fiat"]
},
{
"name": "Elbert",
"age": 66,
"cars": ["Mazda", "Benz"]
}
]
حلقهزدن هر cars:
- Array Loop تودرتو داخل parent.
- Array Editor:
{query_array:raw @key:'cars'} {query_array:raw}در nested loop.
Results Filter
Results Filter — فیلتر نتایج پس از fetch و قبل از render (مانند bricks/query/result PHP filter). (@since 2.2)
Loop Types: Array، ACF Repeater
- حذف نتایج غیرضروری
- جلوگیری از render حلقه ناخواسته

مثال: فیلتر بر اساس Age
[
['name' => 'John', 'age' => 30],
['name' => 'Alan', 'age' => 25],
['name' => 'Pony', 'age' => 66]
]
فقط age کمتر از 50:
| Field | Operator | Value |
|---|---|---|
{query_array:raw @key:'age'} |
< |
50 |
Pony (66) حذف — فقط John و Alan.
یادداشت
چند rule با منطق AND. فیلتر پیچیدهتر: hook bricks/query/result.
هوکهای query loop
- bricks/query/run (filter)
- bricks/terms/query_vars (filter)
- bricks/users/query_vars (filter)
- bricks/posts/merge_query (filter)
- bricks/posts/query_vars (filter)
- bricks/query/loop_object (filter)
- bricks/query/loop_object_id (filter)
- bricks/query/loop_object_type (filter)
- bricks/query/no_results_content (filter)
- bricks/query/before_loop (action)
- bricks/query/after_loop (action)
- bricks/query/result (filter)
- bricks/query/result_count (filter)
- bricks/query/result_max_num_pages (filter)
- bricks/query/init_loop_index (filter)
