A guild listing its members' businesses. A regional food directory. A showcase of sites built with a product. Directories like these grow from the people listed in them: each one submits a listing, keeps it current, and expects it to look right. The site owner's job is to check new entries and keep out the junk.
Total CMS runs this pattern without a plugin. It is how this site works: the showcase, the designers directory and the extension directory are all submitted by members and approved before they appear.
This page's JumpStart builds one for Harbor County Makers Guild, a fictional craft guild: ten makers' businesses in five towns, with a sign-up page, a page where each member keeps their own listings, and the public directory. The screenshots below come from it.
Members submit, you approve
A directory is a collection with a custom schema: name, description, logo, address, categories, links, whatever the listings need. Members sign in through their own auth collection, separate from the admin, and get a form for their entry.
Three settings turn that into a moderated directory:
- An owner property. The server stamps the member's id on each listing they create, and refuses any read or write of another member's listing. Members see only their own entries.
- A protected
draftfield. Every listing a member creates or edits is saved as a draft, whatever the form sends. Only an admin can publish it. If checking every edit is too much, protect it so only new listings wait, and edits to a live listing go straight out. - An access group that grants members create, read and update on the collection, and nothing else.
Admins see every submission in the collection table, open it, and publish it. A form action can email you the moment something arrives.
The public side
Published listings are ordinary content, so the directory pages are yours to design: a grid with filters by category or region, a page per listing with a gallery and a map link, a featured row at the top. Give the schema an SEO card and each listing has its own title, description and social image, which makes it a page listed businesses are glad to link to.
Turn on the collection's sitemap and RSS feed, with drafts left out of both, and published listings go to search engines and to anyone who follows "newest listings".
Keeping it clean
- Listings stay accurate because owners edit them. A business that moves updates its own address. The listing leaves the directory until you approve the change, or stays up if you review only new listings.
- You can remove anything. An admin can unpublish or delete a listing at any time; the member's account is separate and can be deactivated too.
- Ownership is enforced by the server, not by a form hiding other people's entries, so a member can't edit someone else's listing by guessing its address.
Where it stops
- It doesn't take payment for listings. Paid or tiered listings need a payment service alongside, with an admin applying the tier.
- Search is the site's search. Filtering by category or region, plus a keyword search across the fields you choose, covers most directories. The MapMax Geocoder extension turns addresses into coordinates for a map, but a "within 10 miles of me" search is custom work.
- Someone builds it once. The schema, the member form and the directory pages are a project for someone comfortable with Total CMS. After that, the members keep it going.
What you need
- Pro, because a directory needs a custom schema and owned collections build on it.
- Any host with PHP 8.2 or later, with no database. Each listing is a plain file, so the directory is easy to back up, move or export.