Title: OmniDirectory – Directory &amp; Listings
Author: Kerio
Published: <strong>September 15, 2026</strong>
Last modified: October 3, 2026

---

Search plugins

![](https://ps.w.org/omnidirectory/assets/banner-772x250.png?rev=3697771)

![](https://ps.w.org/omnidirectory/assets/icon-256x256.png?rev=3697763)

# OmniDirectory – Directory & Listings

 By [Kerio](https://profiles.wordpress.org/soulja/)

[Download](https://downloads.wordpress.org/plugin/omnidirectory.4.3.32.zip)

 * [Details](https://vec.wordpress.org/plugins/omnidirectory/#description)
 * [Reviews](https://vec.wordpress.org/plugins/omnidirectory/#reviews)
 *  [Installation](https://vec.wordpress.org/plugins/omnidirectory/#installation)
 * [Development](https://vec.wordpress.org/plugins/omnidirectory/#developers)

 [Support](https://wordpress.org/support/plugin/omnidirectory/)

## Description

#### Overview: What Is OmniDirectory?

OmniDirectory is one flexible directory engine for building searchable WordPress
directories — staff, members, professionals, businesses, organizations, and more.
Every entry shares the same underlying structure: a name, a set of relabelable directory
fields, a category, and a profile page, presented through your choice of search 
and profile layouts.

Rather than offering separate tools for each type of directory, OmniDirectory adapts
to your use case by relabeling its existing fields and choosing appropriate layouts—
no code required.

#### Directory Use Cases

The same directory engine can be adapted for:

 * Staff Directory
 * Employee Directory
 * Team Directory
 * Member Directory
 * Professional Directory
 * Business Directory (can be adapted for)
 * Company Directory (can be adapted for)
 * Organization Directory (can be adapted for)
 * Institution Directory (can be adapted for)
 * Medical Directory
 * School / University Directory (can be adapted for)
 * Church Directory (can be adapted for)
 * Nonprofit / Community Directory (can be adapted for)
 * Multilingual Directory
 * Arabic / RTL Directory

These are use cases of one directory engine, reached by relabeling fields and choosing
a layout — not separate built-in modes with specialized fields for each industry.

#### Search and Discovery

Add the `[omnidirectory_search]` shortcode to any page for a live, AJAX-powered 
search box — results appear as visitors type, without a page reload.

By default, search matches an entry’s name/title and its Directory Category. Other
fields (Phone, Email, Bio, etc.) are not searched by default; a developer can extend
what’s searched using this plugin’s own filter hooks. Live search results are cached
briefly and invalidated immediately whenever a directory entry changes, and basic
AJAX rate limiting helps reduce the impact of automated request flooding. Results
are capped to a configurable limit rather than paginated.

#### Arabic, Multilingual and RTL Support

Search includes real Arabic-aware normalization: common letter variations (different
forms of Alef, ta marbuta versus ha, and similar cases) are matched during search,
so visitors find listings even when spelling varies slightly. Every layout renders
with the correct `dir="rtl"` or `dir="ltr"` attribute based on the site’s active
language.

OmniDirectory registers its directory entries and category taxonomy as translatable
for both **Polylang** and **WPML** (a `wpml-config.xml` file is included), so multilingual
sites can maintain a translated version of each entry and category. This covers 
the directory structure and manual entry translation; it does not mean every workflow
is automatically language-aware — CSV-imported entries, for example, are not automatically
linked into a translation group (see the CSV section below).

#### Adaptable Fields

OmniDirectory has a fixed set of built-in directory fields, and their labels can
be relabeled from Settings — without code — to fit different use cases. For example:

**Medical directory:** Specialty / Location / Phone
 **Company directory:** Department/
Office / Phone **Professional directory:** Profession / Location / Phone **Member
directory:** Role / Location / Phone

Relabeling changes what visitors see; it does not add new fields. OmniDirectory 
does not currently include a tool for creating unlimited or arbitrary custom fields.

#### Search-Result Layouts

Eight layouts for search results, switchable from Settings:

 * Modern Grid Cards (`grid`) — default
 * Horizontal List Row (`horizontal`)
 * Avatar Badge Compact (`badge`)
 * Structured Table View (`table`)
 * Masonry Pinterest Grid (`masonry`)
 * Horizontal Directory List (`directory_list`)
 * Compact Table Matrix (`table_matrix`)
 * Interactive Hover Flip Cards (`flip_cards`)

#### Single-Profile Layouts

Eight layouts for individual profile pages, switchable from Settings:

 * Modern Centered Card (`modern_card`) — default
 * Two-Column Sidebar (`two_column_sidebar`)
 * Hero Banner Top (`hero_banner_top`)
 * Tabbed Profile View (`tabbed_profile`)
 * Minimalist Clean (`minimalist_clean`)
 * Split Screen Cover (`split_screen_cover`)
 * Interactive Dashboard (`interactive_dashboard`)
 * Floating Card Overlay (`floating_card_overlay`)

#### Profile Information and Documents

Each directory entry can include a name, a profile photo, its relabelable directory
fields, Phone, Email, a Bio, a Website field, a Directory Category, and a gallery
shortcode field (stores and renders a shortcode you provide — this is not a built-
in gallery builder).

Profiles can also have Documents attached: PDF, DOC, DOCX, XLS, XLSX, and TXT files,
each with its own custom label, and checked against its real file type on the server
before being accepted.

#### Click-to-Reveal Contact Details

Optionally keep phone numbers and email addresses out of the initial page source
until the visitor clicks Reveal. This is a lightweight deterrent against basic automated
scanning of static HTML — it is not anti-scraping or bot-protection software, and
does not stop a scraper that fully executes JavaScript.

#### CSV Import and Reliability

Bulk-add or back up your directory with CSV import/export. Column headers are matched
automatically against common naming variants. The entire file — row count, header,
and every row — is validated before anything changes; an invalid or oversized file(
over 1,000 rows) is rejected up front, with nothing changed.

Import then runs as a resumable background process: new entries are staged privately
first, then safely swapped in to replace the previous directory only once every 
new entry is fully ready — with a “Resume Import” option if it ever needs a manual
nudge. Featured images referenced in the CSV are downloaded afterward, independently,
in the background, using WordPress’s own safe HTTP request handling (which rejects
unsafe destinations such as private/internal network addresses and their redirects),
with a bounded number of retries for any image that fails.

**Important:** CSV import replaces your directory’s dataset — it does not selectively
update individual existing entries. Re-importing a file results in a fresh set of
entries matching that file, not in-place edits to the entries already there.

#### Structured Data

Profile pages include Schema.org (JSON-LD) structured data using the `Person` type
by default, to help search engines understand the page. Developers can extend or
change this behavior using this plugin’s WordPress filters; there is no dashboard
setting for configuring Schema.org types.

#### Performance and Reliability

 * Live search results are cached, with immediate invalidation when a directory 
   entry changes.
 * Live search includes basic AJAX rate limiting.
 * CSV import runs in the background, in small resumable batches, rather than one
   long page request.
 * The whole file is validated before any existing directory entry is changed.
 * New entries are staged privately, then safely swapped in once staging is complete.
 * Featured images from CSV import are downloaded in the background, separately 
   from the import itself, with bounded retries for failures.

#### Who Is OmniDirectory For?

Site owners and developers building a searchable directory of people or listings—
staff and team pages, member directories, professional or business listings, and
multilingual or Arabic-language directories — who want one adaptable plugin rather
than a tool built narrowly for a single industry.

#### Getting Started

 1. Activate the plugin.
 2. Go to **Directory Members  Directory Settings** to relabel the directory fields
    for your project and choose your search and profile layouts.
 3. Add entries under **Directory Members  Add New**, or bulk-import them via **Directory
    Members  Import / Export**.
 4. Place the `[omnidirectory_search]` shortcode on any page to show the live search
    box.

## Screenshots

[⌊Live search results in the default Modern Grid Cards layout.⌉⌊Live search results
in the default Modern Grid Cards layout.⌉[

Live search results in the default Modern Grid Cards layout.

[⌊A member's profile page in the Tabbed Profile View layout.⌉⌊A member's profile
page in the Tabbed Profile View layout.⌉[

A member’s profile page in the Tabbed Profile View layout.

[⌊Directory Settings: field labels, layout pickers, and color/display toggles.⌉⌊
Directory Settings: field labels, layout pickers, and color/display toggles.⌉[

Directory Settings: field labels, layout pickers, and color/display toggles.

## Installation

#### Automatic installation

 1. In your WordPress admin, go to **Plugins  Add New**.
 2. Search for “OmniDirectory”.
 3. Click **Install Now**, then **Activate**.

#### Manual installation

 1. Download the plugin zip file.
 2. In your WordPress admin, go to **Plugins  Add New  Upload Plugin**.
 3. Choose the zip file and click **Install Now**.
 4. Activate the plugin through the **Plugins** menu.

#### After activation

 1. Visit **Directory Members  Directory Settings** to configure field labels, layouts,
    and colors.
 2. Add your directory entries under **Directory Members  Add New**.
 3. Add the `[omnidirectory_search]` shortcode to any page or post where you want the
    search box to appear.

## FAQ

### What can I build with OmniDirectory?

A searchable WordPress directory of people or listings — staff, team members, professionals,
businesses, organizations, or a multilingual/Arabic directory — by relabeling the
built-in fields and choosing a layout.

### Is OmniDirectory only for staff directories?

No. Staff directories are one common use case, but the same fields and layouts can
be relabeled for member, professional, business, or other directory types.

### Can I create a business directory?

Yes, by adapting the existing directory fields and category taxonomy to your business
listings.

### Can I create a member directory?

Yes. You can adapt the existing fields and categories for member listings.

### Can I create a professional directory?

Yes — the default field labels are already suited to professional/medical-style 
listings.

### Can I create an employee directory?

Yes.

### Can I create a medical directory?

Yes, the default field labels (Specialty/Title, Location/Office, Phone) are designed
with this in mind.

### Can I create a school or university directory?

You can adapt OmniDirectory for this by relabeling its existing fields; there are
no fields built specifically for academic departments or courses.

### Can I create an Arabic/RTL directory?

Yes. Search includes Arabic letter-variant normalization, and every layout renders
with the correct RTL/LTR direction based on the site’s language.

### Does OmniDirectory support WPML?

Yes. The directory post type and category taxonomy are registered as translatable,
and a `wpml-config.xml` file is included.

### Does OmniDirectory support Polylang?

Yes. The directory post type and category taxonomy are registered with Polylang 
automatically.

### Can I customize directory field labels?

Yes, from Directory Settings.

### Can I add unlimited custom fields?

You can relabel OmniDirectory’s existing directory fields to fit different use cases
without writing any code. It does not currently include a tool for adding new, unlimited
custom fields beyond that fixed set.

### Can I customize the directory layouts?

Yes — eight search-results layouts and eight single-profile layouts are available
from Directory Settings.

### Can I import directory entries from CSV?

Yes, with automatic column mapping, a 1,000-row limit per file, and background processing.

### Does CSV import update existing entries?

No. CSV import replaces your directory’s dataset with what’s in the file; it does
not selectively edit individual existing entries in place.

### Can I attach documents to profiles?

Yes — PDF, DOC, DOCX, XLS, XLSX, and TXT files, each with an optional custom label.

### Can I hide phone/email values until clicked?

Yes, using the Click-to-Reveal option. This keeps the value out of the initial page
source until clicked; it is not anti-scraping or bot-protection software.

### Does OmniDirectory include a Gutenberg block?

No. OmniDirectory currently uses a shortcode (`[omnidirectory_search]`), which also
works inside the Block Editor’s Shortcode block.

### What is OmniDirectory not designed to do?

OmniDirectory focuses on searchable directory and listings functionality. It does
not provide membership management (user registration, logins, or gated content),
marketplace or e-commerce features (payments, vendor accounts, product catalogs),
booking systems, reviews/ratings, or affiliate functionality.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“OmniDirectory – Directory & Listings” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ Kerio ](https://profiles.wordpress.org/soulja/)
 *   [ KeriO ](https://profiles.wordpress.org/kerio/)

[Translate “OmniDirectory – Directory & Listings” into your language.](https://translate.wordpress.org/projects/wp-plugins/omnidirectory)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/omnidirectory/), check
out the [SVN repository](https://plugins.svn.wordpress.org/omnidirectory/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/omnidirectory/) 
by [RSS](https://plugins.trac.wordpress.org/log/omnidirectory/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 4.3.32

 * Updated the plugin name and description to reflect OmniDirectory’s broader positioning
   as an adaptable WordPress directory and listings plugin, rather than a staff-
   directory-only tool. No functional changes.
 * Code quality: corrected the placement of several existing code-documentation 
   comments (`phpcs:ignore`) so they correctly annotate the specific, already-reviewed,
   intentionally bounded queries used by the CSV import swap process. No query logic,
   behavior, or performance characteristics were changed.
 * Added `omnidirectory_single_profile_extra_fields` extension point for companion
   plugins. No effect by itself.
 * Added `omnidirectory_csv_import_aliases` extension point for companion plugins.
   No effect by itself.
 * Added `omnidirectory_csv_row_meta_input` extension point for companion plugins.
   No effect by itself.
 * Added `omnidirectory_profile_data_fields` extension point for companion plugins,
   allowing their own content to be printed inside the profile details area of all
   8 single-profile layouts. No effect by itself.

#### 4.3.31

 * New: featured images from a CSV import are now downloaded and attached in the
   background, independently of member import and the directory swap — a slow or
   failing image can no longer affect whether the directory itself imports successfully.
 * Security: background image downloads use WordPress’s own safe HTTP request handling(
   rejecting unsafe destinations, including private/internal network addresses and
   their redirects) and a bounded maximum download size, instead of the plugin’s
   previous unbounded image-fetching method.
 * Reliability: a failed image download is retried a limited number of times, then
   left alone with its original URL and error kept for reference, without ever blocking
   the rest of the import.
 * Reliability: background image processing is crash-safe — an interruption at any
   point, including right after an image file is saved, is recognized on the next
   attempt so the same image is never downloaded or attached twice.
 * Import/Export page now shows a simple count of remaining and permanently failed
   images for the current import, separate from the member import status.

#### 4.3.30

 * Reliability: the existing directory is no longer touched while a CSV import is
   being staged in the background — new members are prepared privately first, and
   only swapped in to replace the previous directory once every new member is fully
   ready.
 * New: the old-to-new directory swap itself runs as a resumable background process(
   via WP-Cron), publishing the newly staged members and retiring the previous ones
   in small batches rather than all at once.
 * Reliability: the swap can safely resume after an interruption at any point — 
   including partway through publishing new members or retiring old ones — without
   creating duplicates or affecting members outside the current import.
 * Reliability: the same import lock with a renewing heartbeat used for staging 
   now also protects the swap step, and “Resume Import” can continue a swap that
   appears to have stalled, not just the staging step.
 * Performance: the live-search cache is invalidated once when a swap finishes, 
   instead of separately for every member changed during the swap.
 * Import/Export page wording updated to describe the new staged-then-swapped process
   instead of the previous immediate-replacement description.

#### 4.3.29

 * Reliability: CSV import now fully validates the entire file (row count, header,
   and every row’s Name column) before touching any existing Directory Member — 
   an invalid or oversized file is rejected up front with a clear message, with 
   nothing changed.
 * New: CSV import now runs as a resumable background job (via WP-Cron) instead 
   of a single request, processing rows in small batches with a saved checkpoint
   after each one — removing the previous dependency on one long-running page request
   completing without a timeout.
 * Reliability: importing members are staged privately in the background; each row
   is tracked so a batch that’s interrupted and retried never creates duplicate 
   members, and any categories left incomplete by an interruption are correctly 
   finished on retry.
 * Reliability: background import batches use a lease with a renewing heartbeat 
   to coordinate safely, and a “Resume Import” action is available if a batch ever
   needs a manual nudge to continue.

#### 4.3.28

 * Performance: live search results are now cached, with an instant invalidation
   the moment any Directory Member is added, edited, trashed, restored, or deleted.
 * Performance: the Category Filter dropdown no longer loads every member in a category
   to narrow results — it now queries only the already-matched search results directly.
 * Security: live search now has basic rate limiting to reduce the impact of automated
   request flooding.

#### 4.3.27

 * Fix: a fatal error on member profile pages when a companion plugin added markup
   with a `display` CSS style — a callback was declared `private` but WordPress’s
   hook system calls it from outside the class.

#### 4.3.26

 * Fix: the Polylang custom-field-sync filter now removes only this plugin’s own
   fields, instead of unconditionally emptying the whole list (which silently disabled
   that Polylang feature for every other plugin’s fields too).

#### 4.3.25

 * Fix: 4 settings (search placeholder, post type label, items per page, primary
   color) now correctly autoload, removing 4 unnecessary individual database queries
   per page load.

#### 4.3.24

 * Security: companion-plugin hook output (Action Bar, Interactive Map, QR Code,
   Rich Text Editor) is now escaped with `wp_kses()` instead of echoed raw.
 * Security: CSV import now rejects malformed upload data before it can trigger 
   a PHP error.

#### 4.3.23

 * Added a “Recent Activity” log on the Import/Export page, recording settings resets
   and CSV exports/imports.

#### 4.3.22

 * Removed the unused ‘wysiwyg’ meta-field mechanism entirely (was inactive on Free,
   per WordPress.org Trialware guidelines) and replaced it with two generic extension
   filters for companion plugins.
 * Security: reduced unescaped-output exceptions from 52 to 2, with every remaining
   case individually justified.

#### 4.3.21

 * Added `omnidirectory_search_result_rendered` action for companion-plugin search-
   impression tracking. No effect by itself.

#### 4.3.20

 * Added Schema.org (JSON-LD) structured data to single member profile pages for
   better search engine understanding.

#### 4.3.19

 * Added `omnidirectory_settings_page_after` action for companion plugins to add
   their own settings sections. No effect by itself.

#### 4.3.18

 * CSV import now clears the existing directory (to Trash, recoverable) before importing,
   preventing duplicate entries on re-import.

#### 4.3.17

 * Moved the companion-plugin Action Bar extension point from search cards to the
   single profile page.

#### 4.3.16

 * Added `omnidirectory_result_card_actions` extension point for companion plugins.
   No effect by itself.

#### 4.3.15

 * Fixed a raw `<style>` tag on the Directory Settings page to use proper WordPress
   asset enqueuing, per WordPress.org review feedback.

#### 4.3.14

 * Updated “Tested up to” version per WordPress.org’s requirements.

#### 4.3.13

 * Addressed WordPress.org review feedback: added reviewer to Contributors list;
   fixed 2 more unescaped-output findings.

#### 4.3.12

 * Fixed a Plugin Check false-positive warning on Bio field output (no functional
   change; output was already sanitized).

#### 4.3.11

 * Fixed the Rich Text Editor’s text being invisible in dark-mode browsers.

#### 4.3.10

 * Fixed the Rich Text Editor’s toolbar failing to load in some environments by 
   explicitly enqueuing its assets.

#### 4.3.9

 * Diagnostic build (superseded by 4.3.10).

#### 4.3.8

 * Simplified the Bio field’s Rich Text Editor rendering; removed a redundant asset-
   loading call.

#### 4.3.7

 * Fixed the Rich Text Editor’s toolbar reverting to defaults on page reload.

#### 4.3.6

 * Removed the unused default content editor from the Directory Member edit screen.

#### 4.3.5

 * Fixed a translated member profile 404 issue on multilingual (Polylang) sites.

#### 4.3.4

 * Adjusted the Rich Text Editor’s internal ID format for better compatibility.

#### 4.3.3

 * Directory Member edit screens now always use the classic editor, for Rich Text
   Editor reliability. Filterable.

#### 4.3.2

 * Fixed the Rich Text Editor’s toolbar not loading its full configuration under
   the Block Editor.

#### 4.3.1

 * Minor compatibility and stability fixes.

#### 4.1.0

 * Fixed several PHPCS code-standards findings in the CSV export/import handlers,
   with no behavior change.

#### 4.0.0

 * Replaced the Sample Data Generator with a full CSV Import/Export module, including
   automatic column matching and image fetching.

#### 3.10.0

 * Added 3 more optional custom fields (Field 3, 4, 5), each with a customizable
   label.

#### 3.9.0

 * Rebuilt the single-profile Language Switcher on buttons instead of links, for
   reliability.

#### 3.8.1

 * Resolved 9 PHPCS code-standards findings, with no behavior change to search or
   multilingual support.

#### 3.8.0

 * The Language Switcher now swaps profile content via AJAX in place, without a 
   full page reload.

#### 3.7.1

 * Hardened the multilingual (Polylang/WPML) integration against partial or broken
   installs.

#### 3.7.0

 * Added an automatic Single Profile Language Switcher for Polylang/WPML sites.

#### 3.6.0

 * Explicit Polylang/WPML integration improvements for post type and category visibility.

#### 3.5.1

 * Fixed Arabic search results being excluded on language-mismatched pages.

#### 3.5.0

 * Fixed multilingual (Polylang/WPML) search to correctly stay scoped to the visitor’s
   language.

#### 3.4.3

 * Resolved the final Plugin Check warning.

#### 3.4.2

 * Resolved 4 more Plugin Check warnings on a search query.

## Meta

 *  Version **4.3.32**
 *  Last updated **3 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/omnidirectory/)
 * Tags
 * [business directory](https://vec.wordpress.org/plugins/tags/business-directory/)
   [directory](https://vec.wordpress.org/plugins/tags/directory/)[member directory](https://vec.wordpress.org/plugins/tags/member-directory/)
   [multilingual](https://vec.wordpress.org/plugins/tags/multilingual/)[staff directory](https://vec.wordpress.org/plugins/tags/staff-directory/)
 *  [Advanced View](https://vec.wordpress.org/plugins/omnidirectory/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/omnidirectory/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/omnidirectory/reviews/)

## Contributors

 *   [ Kerio ](https://profiles.wordpress.org/soulja/)
 *   [ KeriO ](https://profiles.wordpress.org/kerio/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/omnidirectory/)