OmniDirectory – Directory & Listings

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

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

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.