7th Nov '22
/
2 comments

How to apply a custom query var to multiple query loops in Bricks

In this tutorial, we’ll learn how to apply a PHP filter to modify the query var of multiple query loops in a single function

Table of Contents

Introduction

In my last project, I needed to create multiple query loops with a custom query var that couldn’t be achieved within the builder: I needed to order the query loop by multiple dynamic values. So, instead of creating a filter for each element, I shared the same custom query var option with multiple elements.

Let’s see how to achieve it.

The code

In my case, I wanted to order the query loops by two different custom fields value: one called featured and the other one called order. In bricks, you are only able to order your loop by one single dynamic data inside the builder. So, I needed to use the bricks/posts/query_vars filter (here is the documentation) to achieve my goal.

Target ID’s

First of all, I created an array with all the IDs of the query loop elements that I wanted to modify.

Then I checked if the $element_id is part of the array, else the function stops.

And finally, I applied my custom meta_query and orderby options to the query var.

Now all the query loops listed in my array inherit from my custom query var in a single function.

add_filter( 'bricks/posts/query_vars', function( $query_vars, $settings, $element_id ) {

   // list all the elements' IDs here
   $elements = array(
       'ovkyjc',
       'flmjqp',
       'wyxffa',
       'almdys',
   );

   // Check if the element_id is inside the array
   if ( !in_array($element_id, $elements)) {
      return $query_vars;
   }

   // Apply the custom query var
   $query_vars['meta_query'] = array(
      'relation' => 'AND',
         'featured_clause' => array(
             'key' => 'featured',
             'compare' => 'EXISTS',
             'type'    => 'numeric',
         ),
         'order_clause' => array(
             'key' => 'order',
             'compare' => 'EXISTS',
             'type'    => 'numeric',
         ),
   );
   $query_vars['orderby'] = array(
      'featured_clause' => 'DESC',
      'order_clause' => 'DESC',
   );

   // return the modified query var
   return $query_vars;
}, 10, 3 );

Target a class

We can also target classes instead of IDs.

Update for Bricks v1.8+

It looks like the _cssClasses is no longer included in the $settings, so is no longer possible to use classes like this to identify elements as in the code below. Use $element_id as shown above – David.

Set a class on the query loop element. In this example we use the class my-special-class.

Then we set the variable $class with our class in the following code:

add_filter( 'bricks/posts/query_vars', function( $query_vars, $settings, $element_id ) {

   // Set your class here
   $class = 'my-special-class';
   
   // Check if the element has the correct class set
   if ( !isset( $settings['_cssClasses'] ) || !$settings['_cssClasses'] === $class ) {
      return $query_vars;
   }

   // Apply the custom query var
   $query_vars['meta_query'] = array(
      'relation' => 'AND',
         'featured_clause' => array(
             'key' => 'featured',
             'compare' => 'EXISTS',
             'type'    => 'numeric',
         ),
         'order_clause' => array(
             'key' => 'order',
             'compare' => 'EXISTS',
             'type'    => 'numeric',
         ),
   );
   $query_vars['orderby'] = array(
      'featured_clause' => 'DESC',
      'order_clause' => 'DESC',
   );

   // return the modified query var
   return $query_vars;
}, 10, 3 );

And then we’re done.

Get access to all 610 Bricks code tutorials with BricksLabs Pro

2 comments

  • Looks like this code doesn't work for Bricks 1.8. It might need an update, unless I'm doing something wrong.

    I logged the $settings variable and it doesn't have the class. I wanted to leave a comment with code but Patchstack blocked it.

    • A
      David Browne

      Can confirm, looks like we can't target elements by class. Tested with Bricks v1.8.1. The internal ID of the class is there, but not the actual class name that we add.

      Targeting by the $element_id is the way to go.

Leave your comment

 

Related Tutorials..

Pro
Conditional Output Based on ACF Date Field in Bricks

Conditional Output Based on ACF Date Field in Bricks

Updated on 1 Aug 2024 Looking to have a Section or other elements in Bricks rendered on the frontend only if today's date is before…
Categories:
Pro
ACPT Gallery Field Query Loop in Bricks

ACPT Gallery Field Query Loop in Bricks

How we can output images from ACPT‘s Gallery field for posts as a grid using a query loop.
Categories:
Pro
Conditionally Outputting Query Loop Item Based on Post Meta in Bricks

Conditionally Outputting Query Loop Item Based on Post Meta in Bricks

Rendering query-loop enabled posts depending on the value of each post's custom field value is tricky because by default, the custom field plugins' functions or…
Categories:
Related Posts by Author in Bricks

Related Posts by Author in Bricks

Querying posts on single posts by the author of the current post.
Categories:
Pro
Nested Meta Box Query Loop Inside a CPT Query Loop in Bricks

Nested Meta Box Query Loop Inside a CPT Query Loop in Bricks

This Pro tutorial provides the steps for setting up a cloneable Meta Box group query inside a CPT query in Bricks. Scenario: CPT: course Meta…
Categories:
Pro
“My Favorites” in Bricks

“My Favorites” in Bricks

This Pro tutorial provides the steps to set up and use My Favorites in Bricks Builder.
Categories:
Pro
Previous Two Posts in Bricks Query Loop

Previous Two Posts in Bricks Query Loop

This Pro tutorial shows how we can modify the parameters of a Bricks query to limit the posts to the previous two whilst cycling to…