//

BrightLeaf

GFSearch is built to help you display Gravity Forms entries your way — including workflow-specific information from Gravity Flow. In this post, we’ll show how to use that power to build a custom Gravity Flow inbox that’s more flexible, better looking, and easier for users to navigate than the default one.

Whether you’re building a sidebar widget, a personalized dashboard, or just want more control over how tasks are presented to your users, GFSearch gives you the flexibility that the native inbox can’t.

GravityOps Search – Search and Display Gravity Forms Entries
GravityOps Search – Search and Display Gravity Forms Entries
Version 1.0.1 Requires WP 6.5 Requires PHP 8.0 135+ downloads Last updated November 26, 2025

Search Gravity Forms entries on the front end and display matching results anywhere. Filter by any field value. Output custom formatted data.

GravityOps Search is a free, powerful shortcode for searching Gravity Forms entries on the front end and displaying the matching results anywhere on your site. Instead of paging through the admin entries screen, you can drop a single shortcode into a page, post, GravityView, or custom template and surface exactly the data you need. It works like an Excel-style lookup for Gravity Forms entries: you define which forms and fields to search, how to compare the values, and what to output for each match.

The core [gravops_search] shortcode lets you target one form, several forms, or even all forms at once. You can filter by one field or many, pass in values directly in the shortcode content, and control whether entries must match all conditions or any of them. The same shortcode can handle simple lookups (showing a single field from the latest matching entry) or more complex reporting-style views that combine fields, entry properties, and custom HTML. Because everything is driven by attributes, you stay in full control of which entries are included and how their data appears on the front end.

Results are rendered through a flexible display attribute, which understands both simple comma-separated field lists and advanced custom display strings with placeholders. You can output raw values, mix multiple fields into labeled text, or construct HTML lists, tables, and cards with links, CSS classes, and nested shortcodes. This gives you a fully custom front-end listing of Gravity Forms entries that you can drop into any layout, theme, or builder, without building a custom query or touching PHP.

GravityOps Search fully supports Gravity Forms entry properties (such as entry ID, form ID, created-by, and more) alongside regular fields, and it includes options for sorting, limiting, and deduplicating results before they are rendered. You can sort by field values or entry properties, choose ascending, descending, or random ordering, add a secondary sort key, and request unique values only. When no entries match, you can show fallback text or per-field default values, so front-end visitors never see a broken layout or confusing blank output.

This plugin is built explicitly for front-end entry search and display. It does not add live search tools to the Gravity Forms admin area and does not replace the Entries screen. Instead, it focuses on one thing and does it well: querying Gravity Forms entries in the background and printing clean, formatted results on the pages your users actually see.

Features

  • Front-end search for Gravity Forms entries using a single, flexible shortcode.
  • Target all forms, a single form, or a comma-separated list of form IDs using the target attribute.
  • Filter entries by a comma-separated list of field IDs or entry properties via the search attribute.
  • Pass search values in the shortcode content, separated by a pipe (|) to match positions with the fields in search.
  • Choose whether entries must match all search conditions (default) or any condition by setting search_mode=\"any\".
  • Use the operators attribute to control how each value is compared to its field, with support for equals, not-equals, partial matches, SQL-style LIKE, “in” / “not in” arrays, and numeric comparisons (greater than / less than / greater-or-equal / less-or-equal).
  • Display one or many fields and properties for each result using the display attribute, which supports both simple lists and rich custom templates.
  • Include entry properties and field values in your output using placeholder formats like {13}, {id}, {form_id}, and {gos:id} where appropriate.
  • Build fully custom HTML output (lists, tables, cards, badges, buttons, links) directly inside the display string.
  • Insert CSS classes and inline markup into the output so results adopt your theme’s design and layout patterns.
  • Use the separator attribute to control how multiple entry results are separated (including HTML separators or no separator at all using __none__).
  • Sort entries using sort_key, sort_direction, and sort_is_num, with optional secondary_sort_key and secondary_sort_direction for tie-breaking.
  • Limit the number of results returned with limit, including support for limit=\"all\" when you need to show every matching entry.
  • Turn on unique to return only unique result values, great for building deduplicated lists such as unique email addresses, user IDs, or other fields.
  • Search for empty or blank values with the search_empty attribute and an empty shortcode content, to find incomplete or missing data.
  • Provide fallback values when no entries match—or when individual fields are empty—using the default attribute.
  • Add an admin link to each result with the link attribute so power users can jump directly from the front end to the entry in the Gravity Forms admin.
  • Designed to work smoothly alongside GravityView, GravityMath, and other shortcodes that can be nested inside the output.
  • Compatible with the legacy gfsearch snippet approach while offering ongoing updates and a more robust, plugin-based implementation.

How It Works

At its core, GravityOps Search evaluates your shortcode attributes and content to determine which entries to fetch, then formats each matching entry according to the display string you provide. The target attribute defines which forms to query: pass 0 to search all forms, a single form ID to target one form, or a comma-separated list of IDs for multi-form searches. The search attribute specifies the field IDs and entry properties to filter on, and the shortcode content supplies the corresponding values, separated by the pipe (|) character in the same order.

You can configure the search_mode attribute to determine matching logic. The default mode (all) requires each entry to satisfy all conditions, while search_mode=\"any\" returns entries that meet at least one of the conditions listed. This gives you the flexibility to build both strict, multi-field filters and more permissive, keyword-style searches. If you need to perform a global search across all fields for a given value, you can leave the relevant search ID blank, and the plugin will look for that value anywhere in the entry.

Sorting, limiting, and uniqueness are handled after the search conditions are applied. You can specify a sort_key (field ID, entry property, or meta key) with sort_direction set to ASC, DESC, or RAND. If you are sorting by numeric data, sort_is_num ensures values are compared correctly rather than as plain strings. When you need a consistent secondary ordering—such as sorting first by date and then by name—you can use secondary_sort_key and secondary_sort_direction. Once ordered, the plugin applies the limit attribute to control how many entries are actually returned and optionally filters down to unique results based on the full rendered output when unique is enabled.

Defaults and fallbacks keep your front-end output robust. The default attribute can define text to display when no entries are found or when specific fields are empty, and the plugin can handle multiple default values mapped to multiple display fields. The separator attribute governs how multiple entries are joined, making it easy to build line-separated lists, HTML elements, or table rows. Because each [gravops_search] shortcode runs its own live database query, you can place different instances around your site to build different views of the same underlying Gravity Forms data.

Display and Formatting

The display attribute is the heart of how results are shown. In its simplest form, you can pass a comma-separated list of field IDs or entry properties, such as display=\"13,14,15\". For each matching entry, GravityOps Search outputs those values in order, using sensible default separators between fields and entries. This mode is ideal when you simply need to surface raw values: a quick list of email addresses, a set of IDs, or basic single-column output.

For more control, display supports custom display strings with placeholders. Instead of a list of IDs, you can provide a template like display=\"Name: {13}, Email: {14}\", which will be rendered for each matching entry. Placeholders like {13} insert the value of field 13, while placeholders such as {id} and {form_id} work with entry properties. When you need to reference non-numeric properties or use merge tags in contexts that parse standard tags (such as GravityView content fields, confirmations, or notifications), you can use the special {gos:id} syntax. This gives you a consistent way to assemble complex messages, labels, and markup that incorporate both field data and meta data.

The display attribute also accepts full HTML, including tags, attributes, and CSS classes. You can wrap values in ,, ,, “, or any other markup to build lists, tables, cards, or media objects. Because the separator attribute supports HTML as well, you can structure your markup so that each entry becomes one list item, table row, or card component. This makes it straightforward to integrate entry results into existing sections of your design, matching your theme and layout without a custom PHP query.

Nesting Shortcodes and Advanced Templates

GravityOps Search supports nesting other shortcodes inside the display attribute via a double-curly-brace syntax: {{ ... }}. This means you can embed tools like GravityMath, another gravops_search, or any other shortcode directly inside the output template for each entry. The outer [gravops_search] processes its own placeholders first and then hands the rendered string to the nested shortcodes, allowing you to feed entry values into calculations, secondary lookups, or formatting helpers.

When you nest a second gravops_search inside the display attribute, each shortcode runs its own search and display logic in sequence. The outer shortcode resolves placeholders such as {13} and {gos:id} in its display string, while the nested shortcode uses its own display template and attributes. In nested scenarios where you need to reference placeholder values as input to another shortcode or formula, you can use the gos:id pattern without braces (for example, gos:21) to avoid conflicts with merge-tag parsing. This lets you do things like passing a field value into a GravityMath filter or dynamically controlling filters and IDs inside the nested shortcode configuration.

Because nested shortcodes are fully supported and the plugin respects all standard shortcode attributes, you can construct sophisticated, layered outputs without custom PHP. For example, you can build a front-end summary that uses one [gravops_search] to list matching entries, another to pull related entries, and a GravityMath shortcode to compute totals—all wrapped in your own HTML structure. GravityOps Search handles placeholder substitution and nested processing order so that each piece of your template receives the data it needs at the right time.

Search Operators and Multi-Input Fields

The operators attribute lets you tell GravityOps Search exactly how to compare each search value against its corresponding field or property. You define a comma-separated list of operators that line up with the IDs in the search attribute. Supported operators include equality (= or is), inequality (!=, isnot, is not), partial matches (contains), SQL-style wildcard matches (like), membership tests (in, not in), and numeric comparisons (gt, lt, gt=, lt=). If you provide fewer operators than search fields, remaining fields default to exact matches; extra operators beyond the number of fields are ignored. When you omit operators entirely, all fields use exact matching by default.

For more advanced scenarios, certain operators expect specific value formats. When using in or not in, for example, you can pass a PHP-style array in the shortcode content—such as array(\'item one\',\'item two\',\'item three\')—to test whether the field value appears in that list. This makes it easy to filter entries against multiple acceptable values for a single field without duplicating field IDs. Combined with search_mode, you can express a wide range of conditions: from strict multi-field comparisons to flexible multi-value lists and keyword-style filters.

Multi-input Gravity Forms fields (like Name, Address, and Checkbox fields) are fully supported, but they behave differently for display versus search. When displaying, using the base field ID in a placeholder (e.g., {13}) automatically combines all sub-inputs (such as first name and last name) into a single string separated by spaces. If you need to display a specific sub-input—like first name only—you can use its input ID directly, for example {13.3}. When searching, checkboxes are best handled by searching the base field ID so that changes to individual options or dynamic checkboxes do not break the search. Other multi-input fields (like Name and Address) should be searched using their individual input IDs (e.g., 13.3, 13.6), as searching by the base ID will not work for those types.

Performance and Access Control

Every [gravops_search] shortcode runs a live database query against Gravity Forms entries, so thoughtful usage is important for both performance and privacy. On the performance side, heavy use of limit=\"all\", many nested shortcodes, and large forms with complex conditions can slow down page loads. To keep pages responsive, it is recommended to set a reasonable limit where possible, minimize unnecessary nesting, and consider caching the rendered page output using your preferred caching plugin or server-level caching tools. These simple steps help ensure that even data-heavy views remain fast and reliable.

On the access-control side, the shortcode does not enforce any special permission checks by itself. Anyone who can view the page where the shortcode is placed will be able to see whatever Gravity Forms entry data you choose to display, including potentially sensitive information. To protect private or restricted data, you should place the shortcode inside pages or templates that are protected by membership plugins, password protection, role-based visibility, or other gating mechanisms. This keeps the plugin flexible and focused on data retrieval and formatting, while allowing you to decide how and where to expose entry data based on your site’s security model.

GravityOps Search is designed to be both powerful and predictable: you define the forms, fields, filters, and display template, and the plugin takes care of querying and rendering. Used thoughtfully, it becomes a core tool for building dynamic, entry-driven front-end experiences on top of Gravity Forms, without custom development or complex integrations.

  • Search across Gravity Forms
  • Display results any way you like

What’s Wrong With the Default Gravity Flow Inbox?

Gravity Flow is a powerful tool, but the inbox layout is rigid:

  • It only shows four fixed columns
  • You can’t change which fields appear
  • You can’t restyle it to match your site
  • It can also be difficult for users to spot the task they need in a long, cluttered list of entries

That’s fine for some back-end use cases. But if you want to build a polished, on-brand frontend you need more control.


Why GFSearch is a Better Inbox

Using GFSearch, you can create custom workflow views that:

  • Show only the tasks assigned to the current user
  • Display any part of the entry or workflow metadata you need
  • Link back to the Gravity Flow entry for approval or updates
  • Fit anywhere on your site (including dashboards, widgets, or sidebars)
  • Render using whatever layout makes sense: lists, tables, cards, accordions, etc.

GFSearch handles the filtering. You handle the display.


Design Your Inbox: Layout Options

Here are just a few examples of how you might replace the inbox with your own layout using GFSearch.

📋 Table Layout (Admin-Style)

A clean table layout for dashboards:

<table>
  <thead>
    <tr>
      <th>Step</th>
      <th>Submitted By</th>
      <th>Field 21</th>
      <th>Form Title</th>
      <th>Status</th>
      <th>Created At</th>
      <th>Name</th>
      <th>Date</th>
    </tr>
  </thead>
  <tbody>
  [gfsearch search="workflow_user_id=0"
  display="<tr>
    <td><a href='{gfs:workflow_submission_url}'>{current_step:name}</a></td>
    <td>{gfs:created_by:display_name}</td>
    <td>{21}</td>
    <td>{gfs:form_title}</td>
    <td><a href='{gfs:workflow_submission_url}'>{gfs:workflow_status}</a></td>
    <td>{gfs:created_at}</td>
    <td>{12}</td>
    <td>{25}</td>
  </tr>"
  separator="__none__"]pending[/gfsearch]
  </tbody>
</table>

📄 List Layout (Good for Sidebars)

Simpler output for narrow areas — this is based on a live implementation we use in the sidebar of one of our sites (with form and page IDs changed):

<ul>
  [gfsearch search='workflow_email_' target='1'
    display="<li style='color:white;'>
      Tuition Contract for<br>
      {96}<br>
      <a href='{gfs:workflow_submission_url: page_id=2 assignee=email_field[22]}' target='_blank'>
        {current_step:name}
      </a>
    </li>"
    default="You don't have any tasks." separator='__none__' limit=all]
  pending
  [/gfsearch]

  [gfsearch search='workflow_user_id_0' target='3'
    display="<li style='color:white;'>
      Invoice for {1}<br>
      <a href='{gfs:workflow_submission_url token=true}' target='_blank'>
        {gfs:current_step:name}
      </a>
    </li>"
    default="You don't have any invoices." separator='__none__' limit=all]
  pending
  [/gfsearch]
</ul>

🧱 Card Layout (For App-Like Dashboards)

Custom styles make this perfect for portals or mobile views:

[gfsearch search="workflow_user_id_0"
  display="<div class='card'>
    <h3>{current_step:name}</h3>
    <p>{21}</p>
    <a href='{gfs:workflow_submission_url}'>Open</a>
  </div>"
  separator="__none__"]pending[/gfsearch]

Our Custom Gravity Flow Inbox

This is one of the approaches we use in production. Our task list is wrapped in a custom accordion shortcode, allowing us to embed task blocks inside collapsible sections and display workflow data exactly the way we want it.

Accordion-style task list generated with GFSearch showing custom Gravity Flow entries
A live example of how we display workflow tasks using GFSearch inside an accordion section.

Here’s what the shortcode looks like:
(accordion wrappers removed for clarity)

<table class='admintaskstable'>
  [gfsearch search='workflow_user_id_0'
    display="<tr class='admintasksrow'>
  <td>
    <a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}' target='_blank'>
      {current_step:name}
    </a>
  </td>
  <td>
    <a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}' target='_blank'>
      {gfs:created_by:display_name}
    </a>
  </td>
  <td>
    <a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}' target='_blank'>
      {{gvlogic if='{gfs:form_id}' is='1||2||3||4' }}{19} (${20} to {1}) {{else}} {21} {{/gvlogic}}
    </a>
  </td>
</tr>"
    default="You don't have any tasks."
    separator='__none__' limit=all]pending[/gfsearch]
</table>

We’ll break down how this works step-by-step below.


Breaking Down the Example: How It Works

Let’s walk through how the real-world GFSearch shortcode we shared works, step by step:

1. search='workflow_user_id_0'

This filters the entries to only show those where the current user is the assigned workflow assignee.

2. display="..."

The display attribute is where you define exactly how each matching entry should appear. In this case, it’s rendering a custom table row (<tr>) for each entry.

3. First Column: Current Workflow Step (with link)

The first <td> in the table row contains a link to the full entry view in the Gravity Flow inbox, using a combination of merge tags:

<a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}'>
  {current_step:name}
</a>
  • https://brightleafdigital.io inserts your site’s base URL. This is a custom merge tag we added on the suggestion of a Gravity Forms Facebook group member.
  • {gfs:form_id} returns the current entry’s form ID. The gfs: prefix ensures that the tag is processed by GFSearch instead of Gravity Forms or GravityView. This behavior is explained in more detail in our documentation.
  • {gfs:id} returns the entry ID.
  • {current_step:name} outputs the label of the current step in the workflow. See the Gravity Flow docs for details.

The result is a clickable link labeled with the current workflow step name that sends the user directly to the detailed inbox view for that entry.

4. Second Column: Submitted By (with link)

The second <td> also links to the full entry view but displays the name of the user who originally submitted the entry:

<a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}'>
  {gfs:created_by:display_name}
</a>

This uses the Gravity Flow merge tag to output the display name of the user who submitted the form. It helps users identify who created the entry without leaving the task list.

5. Third Column: Conditional Output (with nested shortcode)

For details, see the Gravity Flow merge tag documentation (Look for the “Additional Merge Tags” section near the bottom).

The third uses a gvlogic block to conditionally show different content depending on which form the entry came from. Here’s what that part of the shortcode looks like:

<a href='https://brightleafdigital.io/dashboard/my-tasks/?page=gravityflow-inbox&view=entry&id={gfs:form_id}&lid={gfs:id}'>
  {{gvlogic if='{gfs:form_id}' is='1||2||3||4'}}
    {19} (${20} to {1})
  {{else}}
    {21}
  {{/gvlogic}}
</a>

This logic says:

If the entry came from forms with IDs 1, 2, 3, or 4, show values from fields 19, 20 and 1 (e.g. “John Doe ($100 to 1234)”).

Otherwise, show field 21.

This is useful when your forms don’t all use the same structure, and you want the display to adjust accordingly.

Nested Shortcodes in Display

Note that the gvlogic block is nested inside a display=”…” attribute. This only works because GFSearch is built to process shortcodes inside display attributes. Be mindful of escaping and formatting issues when nesting this deeply. More info on this pattern is available in the GFSearch documentation (see the nested shortcodes section).

You can read more about GVLogic here.

6. default="You don't have any tasks."

This message shows if the user has no assigned entries that match the search.

7. separator='__none__'

The separator attribute controls what is placed between each result. In this case, __none__ tells GFSearch not to insert any separators — especially useful when rendering full HTML blocks like <tr> or <li>.

8. limit=all

The limit attribute controls how many entries are displayed. Setting it to all means no limit — GFSearch will return all matching entries.

9. pending

The value between the opening and closing shortcode — in this case, pending — is what GFSearch looks for in the meta field defined by the search attribute. Here, workflow_user_id_0 dynamically becomes a meta key like workflow_user_id_123, meaning “entries assigned to this user.” GFSearch will only return entries where that meta key has a value of pending, which corresponds to the workflow status.

This setup is useful for filtering entries to a specific workflow step, such as pending, approved, rejected, or complete, depending on your use case.



Build the Inbox That Belongs On Your Site

GFSearch gives you the power to turn the Gravity Flow inbox into a frontend experience that actually fits your brand. You decide what’s shown, how it looks, and where it goes — your own fully customizable Gravity Flow inbox.

Need a quick sidebar widget showing “You have 2 pending approvals”? Done.

Want to build a full-page dashboard with different task types grouped in collapsible sections? Easy.

Once your workflows are in place, GFSearch gives you full control over how they’re presented — and not just inboxes. You can build all kinds of filtered views and dynamic layouts using entry data from any form.

See here for all the features of GFSearch.

GravityOps Search – Search and Display Gravity Forms Entries
GravityOps Search – Search and Display Gravity Forms Entries
Version 1.0.1 Requires WP 6.5 Requires PHP 8.0 135+ downloads Last updated November 26, 2025

Search Gravity Forms entries on the front end and display matching results anywhere. Filter by any field value. Output custom formatted data.

GravityOps Search is a free, powerful shortcode for searching Gravity Forms entries on the front end and displaying the matching results anywhere on your site. Instead of paging through the admin entries screen, you can drop a single shortcode into a page, post, GravityView, or custom template and surface exactly the data you need. It works like an Excel-style lookup for Gravity Forms entries: you define which forms and fields to search, how to compare the values, and what to output for each match.

The core [gravops_search] shortcode lets you target one form, several forms, or even all forms at once. You can filter by one field or many, pass in values directly in the shortcode content, and control whether entries must match all conditions or any of them. The same shortcode can handle simple lookups (showing a single field from the latest matching entry) or more complex reporting-style views that combine fields, entry properties, and custom HTML. Because everything is driven by attributes, you stay in full control of which entries are included and how their data appears on the front end.

Results are rendered through a flexible display attribute, which understands both simple comma-separated field lists and advanced custom display strings with placeholders. You can output raw values, mix multiple fields into labeled text, or construct HTML lists, tables, and cards with links, CSS classes, and nested shortcodes. This gives you a fully custom front-end listing of Gravity Forms entries that you can drop into any layout, theme, or builder, without building a custom query or touching PHP.

GravityOps Search fully supports Gravity Forms entry properties (such as entry ID, form ID, created-by, and more) alongside regular fields, and it includes options for sorting, limiting, and deduplicating results before they are rendered. You can sort by field values or entry properties, choose ascending, descending, or random ordering, add a secondary sort key, and request unique values only. When no entries match, you can show fallback text or per-field default values, so front-end visitors never see a broken layout or confusing blank output.

This plugin is built explicitly for front-end entry search and display. It does not add live search tools to the Gravity Forms admin area and does not replace the Entries screen. Instead, it focuses on one thing and does it well: querying Gravity Forms entries in the background and printing clean, formatted results on the pages your users actually see.

Features

  • Front-end search for Gravity Forms entries using a single, flexible shortcode.
  • Target all forms, a single form, or a comma-separated list of form IDs using the target attribute.
  • Filter entries by a comma-separated list of field IDs or entry properties via the search attribute.
  • Pass search values in the shortcode content, separated by a pipe (|) to match positions with the fields in search.
  • Choose whether entries must match all search conditions (default) or any condition by setting search_mode=\"any\".
  • Use the operators attribute to control how each value is compared to its field, with support for equals, not-equals, partial matches, SQL-style LIKE, “in” / “not in” arrays, and numeric comparisons (greater than / less than / greater-or-equal / less-or-equal).
  • Display one or many fields and properties for each result using the display attribute, which supports both simple lists and rich custom templates.
  • Include entry properties and field values in your output using placeholder formats like {13}, {id}, {form_id}, and {gos:id} where appropriate.
  • Build fully custom HTML output (lists, tables, cards, badges, buttons, links) directly inside the display string.
  • Insert CSS classes and inline markup into the output so results adopt your theme’s design and layout patterns.
  • Use the separator attribute to control how multiple entry results are separated (including HTML separators or no separator at all using __none__).
  • Sort entries using sort_key, sort_direction, and sort_is_num, with optional secondary_sort_key and secondary_sort_direction for tie-breaking.
  • Limit the number of results returned with limit, including support for limit=\"all\" when you need to show every matching entry.
  • Turn on unique to return only unique result values, great for building deduplicated lists such as unique email addresses, user IDs, or other fields.
  • Search for empty or blank values with the search_empty attribute and an empty shortcode content, to find incomplete or missing data.
  • Provide fallback values when no entries match—or when individual fields are empty—using the default attribute.
  • Add an admin link to each result with the link attribute so power users can jump directly from the front end to the entry in the Gravity Forms admin.
  • Designed to work smoothly alongside GravityView, GravityMath, and other shortcodes that can be nested inside the output.
  • Compatible with the legacy gfsearch snippet approach while offering ongoing updates and a more robust, plugin-based implementation.

How It Works

At its core, GravityOps Search evaluates your shortcode attributes and content to determine which entries to fetch, then formats each matching entry according to the display string you provide. The target attribute defines which forms to query: pass 0 to search all forms, a single form ID to target one form, or a comma-separated list of IDs for multi-form searches. The search attribute specifies the field IDs and entry properties to filter on, and the shortcode content supplies the corresponding values, separated by the pipe (|) character in the same order.

You can configure the search_mode attribute to determine matching logic. The default mode (all) requires each entry to satisfy all conditions, while search_mode=\"any\" returns entries that meet at least one of the conditions listed. This gives you the flexibility to build both strict, multi-field filters and more permissive, keyword-style searches. If you need to perform a global search across all fields for a given value, you can leave the relevant search ID blank, and the plugin will look for that value anywhere in the entry.

Sorting, limiting, and uniqueness are handled after the search conditions are applied. You can specify a sort_key (field ID, entry property, or meta key) with sort_direction set to ASC, DESC, or RAND. If you are sorting by numeric data, sort_is_num ensures values are compared correctly rather than as plain strings. When you need a consistent secondary ordering—such as sorting first by date and then by name—you can use secondary_sort_key and secondary_sort_direction. Once ordered, the plugin applies the limit attribute to control how many entries are actually returned and optionally filters down to unique results based on the full rendered output when unique is enabled.

Defaults and fallbacks keep your front-end output robust. The default attribute can define text to display when no entries are found or when specific fields are empty, and the plugin can handle multiple default values mapped to multiple display fields. The separator attribute governs how multiple entries are joined, making it easy to build line-separated lists, HTML elements, or table rows. Because each [gravops_search] shortcode runs its own live database query, you can place different instances around your site to build different views of the same underlying Gravity Forms data.

Display and Formatting

The display attribute is the heart of how results are shown. In its simplest form, you can pass a comma-separated list of field IDs or entry properties, such as display=\"13,14,15\". For each matching entry, GravityOps Search outputs those values in order, using sensible default separators between fields and entries. This mode is ideal when you simply need to surface raw values: a quick list of email addresses, a set of IDs, or basic single-column output.

For more control, display supports custom display strings with placeholders. Instead of a list of IDs, you can provide a template like display=\"Name: {13}, Email: {14}\", which will be rendered for each matching entry. Placeholders like {13} insert the value of field 13, while placeholders such as {id} and {form_id} work with entry properties. When you need to reference non-numeric properties or use merge tags in contexts that parse standard tags (such as GravityView content fields, confirmations, or notifications), you can use the special {gos:id} syntax. This gives you a consistent way to assemble complex messages, labels, and markup that incorporate both field data and meta data.

The display attribute also accepts full HTML, including tags, attributes, and CSS classes. You can wrap values in ,, ,, “, or any other markup to build lists, tables, cards, or media objects. Because the separator attribute supports HTML as well, you can structure your markup so that each entry becomes one list item, table row, or card component. This makes it straightforward to integrate entry results into existing sections of your design, matching your theme and layout without a custom PHP query.

Nesting Shortcodes and Advanced Templates

GravityOps Search supports nesting other shortcodes inside the display attribute via a double-curly-brace syntax: {{ ... }}. This means you can embed tools like GravityMath, another gravops_search, or any other shortcode directly inside the output template for each entry. The outer [gravops_search] processes its own placeholders first and then hands the rendered string to the nested shortcodes, allowing you to feed entry values into calculations, secondary lookups, or formatting helpers.

When you nest a second gravops_search inside the display attribute, each shortcode runs its own search and display logic in sequence. The outer shortcode resolves placeholders such as {13} and {gos:id} in its display string, while the nested shortcode uses its own display template and attributes. In nested scenarios where you need to reference placeholder values as input to another shortcode or formula, you can use the gos:id pattern without braces (for example, gos:21) to avoid conflicts with merge-tag parsing. This lets you do things like passing a field value into a GravityMath filter or dynamically controlling filters and IDs inside the nested shortcode configuration.

Because nested shortcodes are fully supported and the plugin respects all standard shortcode attributes, you can construct sophisticated, layered outputs without custom PHP. For example, you can build a front-end summary that uses one [gravops_search] to list matching entries, another to pull related entries, and a GravityMath shortcode to compute totals—all wrapped in your own HTML structure. GravityOps Search handles placeholder substitution and nested processing order so that each piece of your template receives the data it needs at the right time.

Search Operators and Multi-Input Fields

The operators attribute lets you tell GravityOps Search exactly how to compare each search value against its corresponding field or property. You define a comma-separated list of operators that line up with the IDs in the search attribute. Supported operators include equality (= or is), inequality (!=, isnot, is not), partial matches (contains), SQL-style wildcard matches (like), membership tests (in, not in), and numeric comparisons (gt, lt, gt=, lt=). If you provide fewer operators than search fields, remaining fields default to exact matches; extra operators beyond the number of fields are ignored. When you omit operators entirely, all fields use exact matching by default.

For more advanced scenarios, certain operators expect specific value formats. When using in or not in, for example, you can pass a PHP-style array in the shortcode content—such as array(\'item one\',\'item two\',\'item three\')—to test whether the field value appears in that list. This makes it easy to filter entries against multiple acceptable values for a single field without duplicating field IDs. Combined with search_mode, you can express a wide range of conditions: from strict multi-field comparisons to flexible multi-value lists and keyword-style filters.

Multi-input Gravity Forms fields (like Name, Address, and Checkbox fields) are fully supported, but they behave differently for display versus search. When displaying, using the base field ID in a placeholder (e.g., {13}) automatically combines all sub-inputs (such as first name and last name) into a single string separated by spaces. If you need to display a specific sub-input—like first name only—you can use its input ID directly, for example {13.3}. When searching, checkboxes are best handled by searching the base field ID so that changes to individual options or dynamic checkboxes do not break the search. Other multi-input fields (like Name and Address) should be searched using their individual input IDs (e.g., 13.3, 13.6), as searching by the base ID will not work for those types.

Performance and Access Control

Every [gravops_search] shortcode runs a live database query against Gravity Forms entries, so thoughtful usage is important for both performance and privacy. On the performance side, heavy use of limit=\"all\", many nested shortcodes, and large forms with complex conditions can slow down page loads. To keep pages responsive, it is recommended to set a reasonable limit where possible, minimize unnecessary nesting, and consider caching the rendered page output using your preferred caching plugin or server-level caching tools. These simple steps help ensure that even data-heavy views remain fast and reliable.

On the access-control side, the shortcode does not enforce any special permission checks by itself. Anyone who can view the page where the shortcode is placed will be able to see whatever Gravity Forms entry data you choose to display, including potentially sensitive information. To protect private or restricted data, you should place the shortcode inside pages or templates that are protected by membership plugins, password protection, role-based visibility, or other gating mechanisms. This keeps the plugin flexible and focused on data retrieval and formatting, while allowing you to decide how and where to expose entry data based on your site’s security model.

GravityOps Search is designed to be both powerful and predictable: you define the forms, fields, filters, and display template, and the plugin takes care of querying and rendering. Used thoughtfully, it becomes a core tool for building dynamic, entry-driven front-end experiences on top of Gravity Forms, without custom development or complex integrations.

  • Search across Gravity Forms
  • Display results any way you like

Get GravityOps Search

GravityOps Search – Search and Display Gravity Forms Entries
GravityOps Search – Search and Display Gravity Forms Entries
Version 1.0.1 Requires WP 6.5 Requires PHP 8.0 135+ downloads Last updated November 26, 2025

Search Gravity Forms entries on the front end and display matching results anywhere. Filter by any field value. Output custom formatted data.

GravityOps Search is a free, powerful shortcode for searching Gravity Forms entries on the front end and displaying the matching results anywhere on your site. Instead of paging through the admin entries screen, you can drop a single shortcode into a page, post, GravityView, or custom template and surface exactly the data you need. It works like an Excel-style lookup for Gravity Forms entries: you define which forms and fields to search, how to compare the values, and what to output for each match.

The core [gravops_search] shortcode lets you target one form, several forms, or even all forms at once. You can filter by one field or many, pass in values directly in the shortcode content, and control whether entries must match all conditions or any of them. The same shortcode can handle simple lookups (showing a single field from the latest matching entry) or more complex reporting-style views that combine fields, entry properties, and custom HTML. Because everything is driven by attributes, you stay in full control of which entries are included and how their data appears on the front end.

Results are rendered through a flexible display attribute, which understands both simple comma-separated field lists and advanced custom display strings with placeholders. You can output raw values, mix multiple fields into labeled text, or construct HTML lists, tables, and cards with links, CSS classes, and nested shortcodes. This gives you a fully custom front-end listing of Gravity Forms entries that you can drop into any layout, theme, or builder, without building a custom query or touching PHP.

GravityOps Search fully supports Gravity Forms entry properties (such as entry ID, form ID, created-by, and more) alongside regular fields, and it includes options for sorting, limiting, and deduplicating results before they are rendered. You can sort by field values or entry properties, choose ascending, descending, or random ordering, add a secondary sort key, and request unique values only. When no entries match, you can show fallback text or per-field default values, so front-end visitors never see a broken layout or confusing blank output.

This plugin is built explicitly for front-end entry search and display. It does not add live search tools to the Gravity Forms admin area and does not replace the Entries screen. Instead, it focuses on one thing and does it well: querying Gravity Forms entries in the background and printing clean, formatted results on the pages your users actually see.

Features

  • Front-end search for Gravity Forms entries using a single, flexible shortcode.
  • Target all forms, a single form, or a comma-separated list of form IDs using the target attribute.
  • Filter entries by a comma-separated list of field IDs or entry properties via the search attribute.
  • Pass search values in the shortcode content, separated by a pipe (|) to match positions with the fields in search.
  • Choose whether entries must match all search conditions (default) or any condition by setting search_mode=\"any\".
  • Use the operators attribute to control how each value is compared to its field, with support for equals, not-equals, partial matches, SQL-style LIKE, “in” / “not in” arrays, and numeric comparisons (greater than / less than / greater-or-equal / less-or-equal).
  • Display one or many fields and properties for each result using the display attribute, which supports both simple lists and rich custom templates.
  • Include entry properties and field values in your output using placeholder formats like {13}, {id}, {form_id}, and {gos:id} where appropriate.
  • Build fully custom HTML output (lists, tables, cards, badges, buttons, links) directly inside the display string.
  • Insert CSS classes and inline markup into the output so results adopt your theme’s design and layout patterns.
  • Use the separator attribute to control how multiple entry results are separated (including HTML separators or no separator at all using __none__).
  • Sort entries using sort_key, sort_direction, and sort_is_num, with optional secondary_sort_key and secondary_sort_direction for tie-breaking.
  • Limit the number of results returned with limit, including support for limit=\"all\" when you need to show every matching entry.
  • Turn on unique to return only unique result values, great for building deduplicated lists such as unique email addresses, user IDs, or other fields.
  • Search for empty or blank values with the search_empty attribute and an empty shortcode content, to find incomplete or missing data.
  • Provide fallback values when no entries match—or when individual fields are empty—using the default attribute.
  • Add an admin link to each result with the link attribute so power users can jump directly from the front end to the entry in the Gravity Forms admin.
  • Designed to work smoothly alongside GravityView, GravityMath, and other shortcodes that can be nested inside the output.
  • Compatible with the legacy gfsearch snippet approach while offering ongoing updates and a more robust, plugin-based implementation.

How It Works

At its core, GravityOps Search evaluates your shortcode attributes and content to determine which entries to fetch, then formats each matching entry according to the display string you provide. The target attribute defines which forms to query: pass 0 to search all forms, a single form ID to target one form, or a comma-separated list of IDs for multi-form searches. The search attribute specifies the field IDs and entry properties to filter on, and the shortcode content supplies the corresponding values, separated by the pipe (|) character in the same order.

You can configure the search_mode attribute to determine matching logic. The default mode (all) requires each entry to satisfy all conditions, while search_mode=\"any\" returns entries that meet at least one of the conditions listed. This gives you the flexibility to build both strict, multi-field filters and more permissive, keyword-style searches. If you need to perform a global search across all fields for a given value, you can leave the relevant search ID blank, and the plugin will look for that value anywhere in the entry.

Sorting, limiting, and uniqueness are handled after the search conditions are applied. You can specify a sort_key (field ID, entry property, or meta key) with sort_direction set to ASC, DESC, or RAND. If you are sorting by numeric data, sort_is_num ensures values are compared correctly rather than as plain strings. When you need a consistent secondary ordering—such as sorting first by date and then by name—you can use secondary_sort_key and secondary_sort_direction. Once ordered, the plugin applies the limit attribute to control how many entries are actually returned and optionally filters down to unique results based on the full rendered output when unique is enabled.

Defaults and fallbacks keep your front-end output robust. The default attribute can define text to display when no entries are found or when specific fields are empty, and the plugin can handle multiple default values mapped to multiple display fields. The separator attribute governs how multiple entries are joined, making it easy to build line-separated lists, HTML elements, or table rows. Because each [gravops_search] shortcode runs its own live database query, you can place different instances around your site to build different views of the same underlying Gravity Forms data.

Display and Formatting

The display attribute is the heart of how results are shown. In its simplest form, you can pass a comma-separated list of field IDs or entry properties, such as display=\"13,14,15\". For each matching entry, GravityOps Search outputs those values in order, using sensible default separators between fields and entries. This mode is ideal when you simply need to surface raw values: a quick list of email addresses, a set of IDs, or basic single-column output.

For more control, display supports custom display strings with placeholders. Instead of a list of IDs, you can provide a template like display=\"Name: {13}, Email: {14}\", which will be rendered for each matching entry. Placeholders like {13} insert the value of field 13, while placeholders such as {id} and {form_id} work with entry properties. When you need to reference non-numeric properties or use merge tags in contexts that parse standard tags (such as GravityView content fields, confirmations, or notifications), you can use the special {gos:id} syntax. This gives you a consistent way to assemble complex messages, labels, and markup that incorporate both field data and meta data.

The display attribute also accepts full HTML, including tags, attributes, and CSS classes. You can wrap values in ,, ,, “, or any other markup to build lists, tables, cards, or media objects. Because the separator attribute supports HTML as well, you can structure your markup so that each entry becomes one list item, table row, or card component. This makes it straightforward to integrate entry results into existing sections of your design, matching your theme and layout without a custom PHP query.

Nesting Shortcodes and Advanced Templates

GravityOps Search supports nesting other shortcodes inside the display attribute via a double-curly-brace syntax: {{ ... }}. This means you can embed tools like GravityMath, another gravops_search, or any other shortcode directly inside the output template for each entry. The outer [gravops_search] processes its own placeholders first and then hands the rendered string to the nested shortcodes, allowing you to feed entry values into calculations, secondary lookups, or formatting helpers.

When you nest a second gravops_search inside the display attribute, each shortcode runs its own search and display logic in sequence. The outer shortcode resolves placeholders such as {13} and {gos:id} in its display string, while the nested shortcode uses its own display template and attributes. In nested scenarios where you need to reference placeholder values as input to another shortcode or formula, you can use the gos:id pattern without braces (for example, gos:21) to avoid conflicts with merge-tag parsing. This lets you do things like passing a field value into a GravityMath filter or dynamically controlling filters and IDs inside the nested shortcode configuration.

Because nested shortcodes are fully supported and the plugin respects all standard shortcode attributes, you can construct sophisticated, layered outputs without custom PHP. For example, you can build a front-end summary that uses one [gravops_search] to list matching entries, another to pull related entries, and a GravityMath shortcode to compute totals—all wrapped in your own HTML structure. GravityOps Search handles placeholder substitution and nested processing order so that each piece of your template receives the data it needs at the right time.

Search Operators and Multi-Input Fields

The operators attribute lets you tell GravityOps Search exactly how to compare each search value against its corresponding field or property. You define a comma-separated list of operators that line up with the IDs in the search attribute. Supported operators include equality (= or is), inequality (!=, isnot, is not), partial matches (contains), SQL-style wildcard matches (like), membership tests (in, not in), and numeric comparisons (gt, lt, gt=, lt=). If you provide fewer operators than search fields, remaining fields default to exact matches; extra operators beyond the number of fields are ignored. When you omit operators entirely, all fields use exact matching by default.

For more advanced scenarios, certain operators expect specific value formats. When using in or not in, for example, you can pass a PHP-style array in the shortcode content—such as array(\'item one\',\'item two\',\'item three\')—to test whether the field value appears in that list. This makes it easy to filter entries against multiple acceptable values for a single field without duplicating field IDs. Combined with search_mode, you can express a wide range of conditions: from strict multi-field comparisons to flexible multi-value lists and keyword-style filters.

Multi-input Gravity Forms fields (like Name, Address, and Checkbox fields) are fully supported, but they behave differently for display versus search. When displaying, using the base field ID in a placeholder (e.g., {13}) automatically combines all sub-inputs (such as first name and last name) into a single string separated by spaces. If you need to display a specific sub-input—like first name only—you can use its input ID directly, for example {13.3}. When searching, checkboxes are best handled by searching the base field ID so that changes to individual options or dynamic checkboxes do not break the search. Other multi-input fields (like Name and Address) should be searched using their individual input IDs (e.g., 13.3, 13.6), as searching by the base ID will not work for those types.

Performance and Access Control

Every [gravops_search] shortcode runs a live database query against Gravity Forms entries, so thoughtful usage is important for both performance and privacy. On the performance side, heavy use of limit=\"all\", many nested shortcodes, and large forms with complex conditions can slow down page loads. To keep pages responsive, it is recommended to set a reasonable limit where possible, minimize unnecessary nesting, and consider caching the rendered page output using your preferred caching plugin or server-level caching tools. These simple steps help ensure that even data-heavy views remain fast and reliable.

On the access-control side, the shortcode does not enforce any special permission checks by itself. Anyone who can view the page where the shortcode is placed will be able to see whatever Gravity Forms entry data you choose to display, including potentially sensitive information. To protect private or restricted data, you should place the shortcode inside pages or templates that are protected by membership plugins, password protection, role-based visibility, or other gating mechanisms. This keeps the plugin flexible and focused on data retrieval and formatting, while allowing you to decide how and where to expose entry data based on your site’s security model.

GravityOps Search is designed to be both powerful and predictable: you define the forms, fields, filters, and display template, and the plugin takes care of querying and rendering. Used thoughtfully, it becomes a core tool for building dynamic, entry-driven front-end experiences on top of Gravity Forms, without custom development or complex integrations.

  • Search across Gravity Forms
  • Display results any way you like