Author Archive

How to use custom SMS provider with Listeo Notifications add-on

Send SMS through a local gateway instead of Twilio by adding one filter, so every notification and OTP goes out through any provider with an HTTP API, and your code survives plugin updates.


Before you start

This part is for developers. It needs a small code snippet, so skip it if Twilio works for you.

Twilio works almost everywhere, but local and domestic SMS gateways are often far cheaper for a site that only sends to one country. Listeo Notifications & OTP Verification 2.0 adds two filters that let you plug in any gateway with an HTTP API. Twilio stays the default provider: nothing changes on your site unless you add the snippet below.

You will need:

  • Listeo Notifications & OTP Verification 2.0 or later. The filters do not exist in earlier versions.
  • An SMS gateway with an HTTP API, plus its endpoint URL and credentials.
  • Someone comfortable writing a few lines of PHP.

Note One filter covers everything the add-on sends: around 20 booking and listing notifications, the scheduled booking reminders, and the phone OTP used by registration and login. They all pass through the same send function.


Step 1: Put your code in the right place

Your snippet must live outside the add-on, or the next update will delete it.

  1. Recommended – a small plugin of your own, or a single file in wp-content/mu-plugins/. Files in mu-plugins load automatically and need no activation.
  2. Recommended – your child theme’s functions.php.
  3. Never – inside the Listeo Notifications & OTP Verification plugin folder. Editing the add-on’s own files means losing the change on every update, which is exactly the problem this filter solves.

Warning – Do not edit class-listeo-notifications.php or any other file inside the add-on. Use the filter instead. Plugin updates overwrite those files without asking.


Step 2: Add the filter

The filter is listeo_sms_pre_send. Return null and Listeo keeps using Twilio exactly as before. Return anything else and Twilio is never called.

Paste this into the file you created in Step 1, then replace the endpoint and credentials with the ones from your gateway.

<?php

add_filter( 'listeo_sms_pre_send', function( $result, $to, $body ) {

    $endpoint = 'https://gateway.example.com/api/send';
    $username = 'my-user';
    $token    = 'my-token';

    $response = wp_remote_post( $endpoint, array(
        'timeout' => 15,
        'headers' => array(
            'Authorization' => 'Bearer ' . $token,
            'Content-Type'  => 'application/json',
        ),
        'body' => wp_json_encode( array(
            'username' => $username,
            'to'       => ltrim( $to, '+' ),
            'message'  => $body,
        ) ),
    ) );

    if ( is_wp_error( $response ) ) {
        return array(
            'sent'   => false,
            'status' => 'error',
            'error'  => $response->get_error_message(),
        );
    }

    $code = wp_remote_retrieve_response_code( $response );
    $data = json_decode( wp_remote_retrieve_body( $response ), true );

    if ( 200 !== $code ) {
        return array(
            'sent'   => false,
            'status' => 'error',
            'error'  => isset( $data['message'] ) ? $data['message'] : 'HTTP ' . $code,
        );
    }

    return array(
        'sent'   => true,
        'id'     => isset( $data['message_id'] ) ? $data['message_id'] : '',
        'status' => 'sent',
        'error'  => '',
    );

}, 10, 3 );

What your callback receives

  1. $to – the destination number, already normalized by Listeo, so you do not repeat that work. International input, and any national number that your Default country code setting can complete, arrives in E.164 with a leading plus, for example +972501234567. A number written with 00 instead of a plus is treated as international too, so 0049… resolves even with no default country code set. If a visitor types a national number without a country code and the site has no default country code configured, the number is passed through with every non-digit character removed. That is the same value Twilio would have received, so if your gateway requires E.164, check for the leading plus yourself.
  2. $body – the finished message text, with all merge tags already replaced.

If your gateway expects a local format rather than E.164, strip the prefix in your callback, for example ltrim( $to, '+' ).

What your callback can return

  1. null – keep the built-in Twilio transport. Twilio runs exactly as before. This is also what happens when no callback is attached at all.
  2. true or false – the message was sent, or it failed. Enough if you do not need the delivery log to show your gateway’s own message id.
  3. WP_Error – failed. Its error message is stored with the delivery log entry.
  4. An array – array( 'sent' => bool, 'id' => string, 'status' => string, 'error' => string ). sent tells Listeo whether delivery succeeded, id and status are your gateway’s own message id and status (recorded in the delivery log the same way a Twilio message SID is), and error is the reason shown when sent is false.
  5. Listeo_Notification_Result – accepted as well, so a callback written for the WhatsApp filter below cannot misfire here. On the WhatsApp filter the result is used exactly as it is. On listeo_sms_pre_send only its sent or failed state, its message and its provider id are kept, and a skipped() result counts as not sent (logged as a deliberate skip rather than an error) because this filter has no third state to report.
  6. Any other value – treated as a failed send. Listeo never assumes that an unrecognized value means success, so a mistake in your callback appears in the delivery log instead of producing an OTP that was never delivered.

Note The sent key is checked with PHP’s empty(), so false, 0, '' and the string '0' all count as “not sent”.


Step 3: Turn Debug Mode off and send a test

Debug Mode is evaluated before the filter. While it is on, every message is simulated and logged and your gateway is never contacted, so you cannot test a custom gateway with Debug Mode enabled.

  1. Go to Listeo Core > Notifications > Logs & Debug and turn Debug Mode off.
  2. Trigger a real message, for example request a login OTP or place a test booking.
  3. Come back to Logs & Debug and check the Delivery history table.

Where to see the result

The Delivery history table lists Time, Event, Recipient, Channel and Status as columns. The provider message id and the error text your callback returned are behind View details in the Details column.

Tip Test with an OTP request rather than a booking. It is the fastest round trip, it goes through the same send function, and it tells you immediately whether your gateway accepted the number format.


Sending WhatsApp through your own gateway

WhatsApp has its own send path, so it has its own filter: listeo_notification_whatsapp_pre_send. It runs before both the Twilio and the Meta Cloud API WhatsApp providers.

It takes one argument more than the SMS filter, so register it with 10, 4:

add_filter( 'listeo_notification_whatsapp_pre_send', function( $result, $to, $body, $context ) {
    // Same return values as listeo_sms_pre_send.
    return null;
}, 10, 4 );
  1. $context – holds the merge-tag values used to build the message, and array( 'test' => true ) when the message comes from the admin test button. Use it if your gateway needs extra data about the message.
  2. $to – always valid E.164 with a leading plus here. The WhatsApp channel rejects anything else before the filter runs, so the “no default country code” case cannot reach it.

The accepted return values are the same as for listeo_sms_pre_send, and the outcome is logged the same way.


Troubleshooting

  • Messages do not seem to go anywhere

  • The delivery log shows a failure although you think the callback worked

  • Your gateway rejects the number

  • Nothing you do has any effect

Important Your callback runs on every SMS the site sends, including the login and registration OTP. If it throws or hangs, phone verification stops working. Keep the request timeout short, handle is_wp_error(), and test an OTP request before you consider the integration done.


Other developer hooks

This add-on exposes more hooks than the two above, including listeo_sms_normalize_phone for country-specific numbering rules, listeo_sms_otp_request_allowed and listeo_sms_otp_global_hourly_limit for OTP rate limiting, listeo_notification_channels and listeo_notification_channel_allowed for the channel layer, and listeo_notification_whatsapp_meta_payload for approved WhatsApp templates. They are documented in the Listeo Developer Hooks Reference.

Header Builder

The Header Builder lets you arrange and style your Listeo header in a live preview. Open Listeo Editor > Header Builder in your WordPress dashboard.


Build your header

Drag elements from the left panel into the header, then reorder them in the preview. Click an element to edit its settings. Add your logo, menu, account links, cart, search or a button such as Add Listing.

Use Header settings to change the background, height and width, choose static or sticky positioning, and adjust content colors. Auto contrast helps keep text and icons readable against the background.

Header Builder with the element palette, live preview and menu visibility controls


Menus and responsive layouts

Select a WordPress menu in the menu settings. Changes made under Appearance > Menus sync automatically. Use dropdowns or mega menus, with columns, icons, short descriptions and an optional introduction.

Two-column mega menu with icons, short descriptions and an introduction

Switch between Desktop, Laptop, Tablet and Mobile to check each layout. Element visibility can vary by screen size and whether a visitor is logged in. The Logged out and Logged in previews help you check both versions.


Different headers for different pages

Open the header selector at the top and choose Manage presets to create alternative headers. Assign them to individual pages under Page overrides, or use the Single listing and Dashboard template overrides.

When you are happy with the result, click Save settings.


Video overview

How to Set Up and Use Listeo PWA

Turn your Listeo website into an installable app.
Visitors can add it to their phone or computer, while opened booking details and eligible QR tickets stay available offline.

The installed app uses your existing WordPress website. Browsing current listings, creating or changing bookings, payments, messages and account changes still require an internet connection.


Before you start

You need:

  • WordPress 6.0 or newer and PHP 7.3 or newer.
  • Listeo Core 2.1.8 or newer.
  • An active Listeo PWA license
  • HTTPS enabled on the whole website.
  • A square WordPress Site Icon, at least 512 × 512 pixels, in PNG, JPEG or WebP format.
  • No other PWA plugin active.

The Site Icon is required. Set it in Appearance → Customize → Site Identity or directly in Listeo → PWA Settings.


Install and configure Listeo PWA

  1. Go to Plugins → Add New → Upload Plugin.
  2. Upload listeo-pwa.zip, then install and activate it.
  3. Open Listeo → PWA License and activate your license.
  4. Open Listeo → PWA Settings.
  5. Set the Site Icon and enable Enable PWA.
  6. Adjust the app name, colors, install suggestion and offline options.
  7. Save the settings, then purge page, CDN and hosting caches.
  8. Run Installation check and test the app on a real phone.

If you use Cloudways or another host with Varnish, purge Varnish after changing PWA settings. Cached manifest or service worker responses can prevent installation.


Let visitors install the app

The automatic installation suggestion can appear on all screens, mobile only or desktop only. You can set a delay and include or exclude specific page IDs. Checkout and booking payment pages are always excluded.

You can also add a permanent install button with:

  • [listeo_pwa_install]
  • [listeo_pwa_install text="Get the app"]
  • The Listeo PWA Install Button Elementor widget.
  • A WordPress Custom Link with the CSS class listeo-pwa-install.

The PWA Settings page also provides a downloadable QR code that opens the public installation page. On iPhone and iPad, visitors install the app through Share → Add to Home Screen.


Offline bookings and QR tickets

A booking is saved automatically when an authorized user opens its details while online.

  • Guests get the same booking information available in My Bookings.
  • Owners and team members get the information available in Bookings.
  • Users can search, open and remove local copies from the Saved page.
  • The per-device limit is 25 by default. Set it to 0 to remove the count limit. Browser storage limits still apply.

Eligible guest tickets can include the issued ticket code and QR image. Users can open a large ticket view, switch between tickets, share or download the ticket image, add the booking to a calendar with an .ics file and share the public listing page.

Offline copies are read-only and show the last saved information. Ticket admission is still verified online by the organizer. Local copies are removed after a detected sign-out or account change, or when the user clears browser data.


Settings reference

  • App name, icon and colors

  • Install suggestion

  • Offline data and app navigation

  • Analytics and launch attribution


Push notifications

Listeo PWA uses the existing Web Push feature in Listeo Notifications. You do not need separate push credentials. Each visitor must allow notifications and subscribe on their device. On iPhone and iPad, they subscribe from inside the installed app.


Troubleshooting

  • PWA Settings is missing

  • The app cannot be installed

  • It works for administrators but not on a phone

  • The installation suggestion does not appear

  • A booking or ticket is missing offline


Listeo MCP

Purethemes MCP lets you manage WordPress from ChatGPT or Claude. The assistant can use only the tools you enable, and every action still follows the connected user’s WordPress permissions.

What can Purethemes MCP do? Basically everything.

  • Build Elementor pages and edit individual widget settings.
  • Configure Listeo search forms and add or remove search filters.
  • Add or remove fields in Listeo Editor submission forms.
  • Create and configure listing types, booking modes, and taxonomies.
  • Create, edit, publish, approve, and renew Listeo listings.
  • Manage bookings, availability, time slots, payments, cancellations, and rescheduling.
  • Create and modify WordPress pages, posts, menus, metadata, and media.
  • Manage WooCommerce orders, coupons, order notes, and refunds.
  • Audit listings and site configuration for missing content or setup issues.
  • Control every capability with permissions, activity logs, and supported undo.

Example requests

  • Listings & moderation
    • “Approve the listings waiting for review, but reject any without photos.”
    • “Renew every featured listing that expires this week for another 30 days.”
    • “Unpublish the ‘Old Diner’ listing and set its rejection reason to ‘permanently closed’.”
    • “Create a ‘Downtown Coworking’ listing in the Offices category with these details and put it live.”
  • Bookings & availability
    • “A guest just called — book the Beach Villa for next Fri–Sun for John ([email protected]).”
    • “Move tomorrow’s 2 PM appointment at the Barber Shop to Thursday and email the client.”
    • “Block the Mountain Cabin for all of August, and mark last week’s pending booking as paid.”
    • “Show this month’s reservations and revenue by status.”
  • Directory setup
    • “Add a ‘Pet friendly’ feature to Restaurants and include it in the search form.”
    • “Create a new ‘Event Space’ listing type with a per-day booking mode.”
    • “Add an ‘Instagram’ custom field to the submit form for the Shops type.”
  • Health checks
    • “Which listings are missing a cover image, opening hours, or a map location?”
    • “List everything expiring in the next 7 days.”


Before you connect

– Your site needs a public HTTPS address and pretty permalinks.
– The AI service must support custom remote MCP connections.
– A WordPress administrator must approve the connection.

Local, VPN-only, and firewalled sites cannot be reached by cloud-based AI services. Connector availability can also depend on the service plan or workspace.


Connect your assistant

1. Download Purethemes MCP from Customer Portal → 
2. On your WordPress site, go to Plugins → Add New → Upload, select the zip with plugin.
2. After activation navigate to Listeo Core → MCP Server
3. Choose an access profile and save.
4. Copy the address shown for your assistant.

ChatGPT

1. Go to Settings → Security and Login and enable Developer Mode.
2. Go to Plugins → Add Plugin and paste the ChatGPT address.


Claude

1. Go to Settings → Connectors.
2. Click Add → Add Custom Connector and paste the Claude address.

 

ChatGPT and Claude use different MCP addresses. Copy the URL from the matching provider card. Then sign in to WordPress and approve access.

In both cases it will ask you to authenticate and allow the access to your site, you can define the access profile and what tools the MCP will be able to control

 


Choose an access profile

– Read only: Inspect listings, bookings, WordPress content, users and store data. Cannot change the site.
– Daily Operations: Manage listings and bookings. Cannot refund orders, change site structure or manage user accounts.
– Content & Setup: Daily operations plus WordPress content, menus, Elementor and Listeo configuration. No refunds or user management.
– Full access (YOLO mode): Everything is switched on: listings, bookings, WordPress content, users, WooCommerce refunds and permanent deletions. Capability checks and the activity log still apply.
– Custom permissions: Select permissions individually.

mcp permissions for listeo


Changing permissions in MCPsettings might require deleting app/connection from ChatGPT/Claude and adding it again.


Recent activity

Open Activity Logs to view connection controls and the audit log.

– Activity loads only when the panel is opened, 20 events at a time.
– Metadata is kept for up to 90 days.
– Message bodies, argument values, and tool results are never logged.
– Revoke all connections disconnects every authorized AI app.


If the connection fails

1. Click Re-run beside the connection status and follow the displayed fix.
2. Check HTTPS and pretty permalinks.
3. Allow /.well-known/* and /wp-json/puriochat-mcp/* through your server, security plugin, and CDN.
4. If you use Cloudflare, make sure Claude-User is not blocked under Manage AI bot access.
5. Save the MCP settings and reconnect the assistant.

Note: Listeo MCP is a separated plugin that is specifically created for Listeo while MCP available in PurioChat Pro is for general use and lacks deep integration with Listeo theme.

 

Listeo Team – co-authors functionality

The Team feature lets listing owners invite employees without sharing an account. Owners choose which listings each employee can access and what they can do.

What the Team Feature Does

Owners can give employees one or more permissions:

  • Edit listings: Edit assigned listings.
  • Manage bookings: View and manage bookings for assigned listings.
  • Messages: Reply to messages linked to assigned listings.

Employees use their own accounts. They cannot see the owner’s other listings, bookings, messages, wallet, subscriptions, or account settings.

Choose What Employees Can Edit

For employees with the Edit listings permission, you can allow access to specific areas:

  • Content & Media
  • Location
  • Pricing & Coupons
  • Booking Settings
  • Availability Calendar
  • Opening Hours

All areas are selected by default for new team members.

Listing and Resource Access

You can assign an employee to:

  • A whole listing: The employee can use their granted permissions for that listing.
  • A specific resource: The employee can manage only selected rooms, staff, tables, vehicles, or other resources.

Resource access requires the Listeo Booking Plus add-on. Without it, you can assign only whole listings.


Requirements

  • Listeo Core 2.0.53 or newer
  • Listeo Booking Plus, only for resource access

Step 1: Enable the Team Feature

Go to WP Admin → Listeo Core → General → Team.

  1. Turn on Enable Team feature.
  2. Set the Team Page. Click Create page, or select a page that contains [listeo_team].
  3. Set the Team Invitation Page. Click Create page, or select a page that contains [listeo_team_invite].
  4. Set Maximum team members. Use 0 for no limit. Pending and active members both count toward the limit.
  5. Set Invitation expiry. The default is 7 days.
  6. Choose whether employees may unpublish or delete assigned listings. Both options are off by default.
  7. Click Save Settings.

After you assign a Team or Team Invitation page, the Create page button changes to an Edit page link.

Team settings in Listeo Core

If the Team feature is enabled but no Team Page is set, WordPress shows an admin warning. Create or select a page with [listeo_team] to fix it.

Team Emails

Go to WP Admin → Listeo Core → Emails → Team Emails to edit these messages:

  • Team Invitation Email: Sent to the invited person. Available tags: {owner_name}, {site_name}, {invite_link}, {expiry_date}.
  • Team Invitation Response Email: Sent to the owner when someone accepts, declines, or leaves. Available tags: {employee_name}, {owner_name}, {site_name}, {response}.
  • Team Member Removed Email: Sent to an employee after access is revoked. Available tags: {owner_name}, {site_name}.

Team email settings


Step 2: Invite an Employee

Open the Team page in the owner dashboard.

  1. Click Invite New Member.
  2. Enter the employee’s email address.
  3. Select at least one permission: Edit listings, Manage bookings, or Messages.
  4. If they can edit listings, select the areas they may change.
  5. Select the listings they may access.
  6. If Listeo Booking Plus is active, you can assign specific resources instead.
  7. Click Send Invitation.

You can invite someone before you have listings and assign listings later. Sites with many listings use a search field to make selection easier.

Invite New Member form

You cannot invite yourself. For a pending invitation, use Resend Invite. If the person is already an active member, edit their access instead.


Step 3: Accept the Invitation

The process depends on whether the invited person already has an account:

  • Existing user: They sign in, open the Team page, and select Accept or Decline.
  • New user: They open the Team Invitation page and register. Their email is already filled in and cannot be changed. Selecting Register & Join Team creates the account and activates access.

Team invitation registration page

Invitation Statuses

Status Meaning
Pending Sent but not answered
Active Accepted and ready to use
Declined Declined by the invited person
Revoked Removed by the owner, or the employee left
Expired The pending invitation is too old

After an Employee Joins

What Owners Can Do

The Team page shows each employee’s status, permissions, assigned listings or resources, and invitation date. Owners can:

  • Edit permissions and assignments.
  • Resend Invite for pending or declined invitations.
  • Revoke access for pending or active members.

Team management page

What Employees See

The dashboard shows only the pages allowed by their permissions:

  • My Listings: Requires Edit listings.
  • Bookings: Requires Manage bookings.
  • Messages: Requires Messages.
  • My Teams: Shows their team memberships and includes a Leave Team action.

Owner tools such as Add Listing, Coupons, Ad Campaigns, Wallet, Statistics, and Subscriptions stay hidden. Dedicated employee accounts also do not see Reviews or Bookmarks. Existing owner or guest accounts keep those menu items.

Employees only see messages linked to their assigned listings. Direct messages to the owner are private.


Resource Access with Listeo Booking Plus

This section applies only when Listeo Booking Plus is active.

Resource access lets an employee manage selected rooms, staff, tables, vehicles, or other resources without access to the full listing.

The employee must also have the Edit listings permission. Without it, the resource assignment will not work.

A resource employee can:

  • Edit assigned resources within the allowed areas.
  • Pause or resume assigned resources.
  • Manage bookings for assigned resources.

They cannot create, delete, or reassign resources. Listing owners and admins keep those controls. An employee with whole-listing access may create or duplicate resources, but cannot delete or reassign them.

Employees open assigned resources from the Resources dashboard page. Make sure Listeo Core → Pages → Manage Resources Page points to a published page containing [lbp_manage_resources].


FAQ
  • Can employees see the owner's other content?

  • Can I limit how many employees an owner can invite?

  • Can an employee unpublish or delete a listing?

  • What happens when I revoke an employee?

  • Can an employee manage resource bookings without the Manage bookings permission?


Troubleshooting
  • The invitation link is invalid, expired, or already used

  • A new employee is asked to sign in with a different account

  • An employee cannot see a conversation

  • An employee cannot unpublish or delete a listing

  • You have reached the maximum number of team members

  • A resource-only employee cannot open their resource

  • Please wait a moment before resending this invitation

  • You have sent too many invitations. Please try again later.


For Developers

Team / Employees includes a permission API, filters, and actions for access checks, editable areas, resource assignments, and revoking access. See the Developer Hooks Reference for the full list.

Migrate to Listeo from HivePress, Directorist and ListingPro

Switching from HivePress, ListingPro or Directorist? Bring your data with you!
The free Listeo Migration migrates your listings, categories, custom fields, images, reviews and users to Listeo — no CSV exports, no manual re-entry.

Moving a directory between platforms usually means rebuilding every listing by hand. Not anymore. The Listeo Migration plugin automates the entire transformation directly in your WordPress database, in one guided process. Type mapping, attribute mapping and a read-only preview let you verify everything before a single row is changed.

If you’ve been running your directory on HivePress, ListingPro or Directorist and want Listeo’s built-in bookings, marketplace and AI-powered search (see why users switch from HivePress →), this guide walks you through the whole migration step by step.

Listeo Migration plugin settings

✅ FREE add-on converts directly in your database (NO export/import round-trip):
1. Listings (published, draft, pending & private — titles, descriptions, slugs, authors)
2. Categories (mirrored to Listeo, missing ones created automatically)
3. Custom Fields / Attributes (mapped to existing Listeo fields, new fields or amenities)
4. Geolocation (Latitude & Longitude for Map Pin + Address)
5. Gallery Images (featured image kept separate — no duplicated covers)
6. Reviews & Star Ratings (with recalculated average rating per listing)
7. Listing Types (service / rental / event / classifieds — manual map or auto-detect)
8. User Roles (listing authors get Listeo’s “owner” role for dashboard access)
9. Featured & Verified badges
10. Contact Details (phone, website, email & socials pre-mapped out of the box)

💡 Smart mapping included: price ranges like “$25–$40” are split automatically into Listeo’s min/max price fields, URLs and emails are sanitized, and only approved reviews are counted so pending or spam reviews won’t distort your ratings.

🔁 Safe to re-run – converted listings are flagged and skipped on subsequent runs, so an interrupted conversion can simply be restarted.

⚠️ Back up your database before converting. The migration modifies your data in place — a full backup takes minutes and makes the whole process risk-free. Also make sure the Listeo Core plugin is installed and activated first: the converter needs Listeo’s categories, features and the “owner” role to exist, and will warn you if they don’t.


Installation & How to use?
  1. Download .zip https://purethemes.net/listeo-migration.zip with Listeo Migration plugin
  2. Upload listeo-migration.zip in WP Dashboard → Plugins → Add New and install & activate. Do this on the site that still contains your HivePress, ListingPro or Directorist data — you switch the theme after conversion, not before.
  3. Go to Tools → Listeo Migration. The converter automatically scans your site and shows how many HivePress, ListingPro or Directorist listings were found and how many listing authors still need the Listeo owner role. If no data is detected, there’s nothing to migrate. 🙂
  4. Preview before you convert. Click “Preview 5 Listings” to see a read-only, field-by-field breakdown — each field, its current value, and the Listeo field it maps to. Nothing is written to the database at this stage.
  5. Configure the mapping. Assign a Listeo listing type (service, rental, event or classifieds) to each HivePress, ListingPro or Directorist category — or leave it on Auto-detect (a “Hotels” category becomes a rental, “Workshops” becomes an event, and so on). Then review the attribute table and decide where each custom field should go:
    – map it to an existing Listeo field,
    – create a brand-new custom field (added automatically to Listeo’s Forms & Fields Editor),
    – merge it into the amenities/features taxonomy,
    – or skip it entirely.Common attributes — phone, website, email, socials, price — are pre-mapped out of the box. You can also enable stripping of Gutenberg block markup from descriptions, since Listeo uses the classic editor for listings. Hit Save Settings when you’re happy with the mapping.
  6. Migrate user roles. Click “Migrate Roles” to grant the Listeo owner role to every user who authored a listing, so your vendors can log into the Listeo dashboard right away. Existing accounts, passwords and profiles are untouched.
  7. Hit “Start Conversion” and let the magic happen. Listings are processed in small batches with a live progress bar and per-listing log, so even directories with thousands of listings convert reliably without server timeouts. When it finishes, a summary shows how many listings were converted, skipped or had errors — with direct edit links for anything that needs attention.
  8. Switch to the Listeo theme. Activate Listeo, run the setup wizard and open a few migrated listings to verify categories, map pins, galleries and reviews. That’s it — your directory is now running on Listeo with bookings, listing packages and all other built-in features →

FAQ
  • Is the Listeo Migration free?

  • Will I lose my reviews and ratings?

  • Do my users need to re-register?

  • What happens to my custom attributes?

  • Can I re-run the conversion?

  • Do I need WP All Import or a CSV export?

  • What about my listing photos?


Markdown for AI Agents

This plugin serves a clean Markdown version of your public pages to AI agents, crawlers, and any tool that would rather read structured text than a full HTML page.

Markdown is easier for AI to work with: it keeps your headings, lists, and links but drops the navigation, scripts, styles, and forms. Less noise, and the agent understands the page more reliably.

Note The plugin requires Listeo Core. It doesn’t touch Cloudflare – no Worker, no paid plan, and no custom server config on a standard WordPress host.


Is it better than llms.txt?

Certainly. There is still no convincing evidence that llms.txt works. Ahrefs’ analysis of 137,000 websites found that 97% of llms.txt files were never accessed.

Serving Markdown to AI agents via HTTP content negotiation (Accept: text/markdown) is a different approach. It’s already supported by major infrastructure like Cloudflare, and AI search agents such as Claude/ChatGPT/Perplexity request Markdown directly when available. More at The Cloudflare Blog: Introducing Markdown for Agents

On our own site we use the same solutions and we see the Markdown versions being requested hundreds of times per day.


Install and preload the cache

  1. Download plugin from Customer Portal →
  2. In the WordPress admin, go to Plugins > Add New and upload the plugin ZIP.
  3. Activate Listeo Markdown for Agents (Listeo Core needs to be active first).
  4. Open Listeo Core > Listeo Markdown.
  5. Go to the Preload Cache tab and click Start / preload missing.

Preloading runs in small background batches via Action Scheduler (or WP-Cron if that’s not available). It’s worth doing right after activation, especially on directories with hundreds or thousands of listings.

The same screen has a content browser where you can search and filter by post type or cache status to see what’s cached, generated on demand, or excluded. It loads a few items at a time so it stays light on shared hosting.

Plugin “Preload Cache” Page

Tip Use Rebuild all after a big site-wide design or visibility change. Everyday edits are handled for you and don’t need a rebuild.


How it works

Every supported public page gets a Markdown twin at the same URL with .md on the end:

https://example.com/about/
https://example.com/about.md

https://example.com/listing/example-listing/
https://example.com/listing/example-listing.md

https://example.com/product/example-product/
https://example.com/product/example-product.md

Agents can also just ask the normal page URL for Markdown using a standard HTTP header:

curl https://example.com/about/ \
  -H "Accept: text/markdown"

Either way the response comes back as Content-Type: text/markdown. The .md URLs are cacheable by browsers and CDNs; responses negotiated through the HTML URL are marked private and no-store so they never mix with your regular page cache.


Disk cache and automatic updates

Generated documents live in a protected, non-public cache inside your WordPress uploads folder.

  • If a cached file exists, the plugin serves it straight from disk.
  • If it’s missing, WordPress builds the Markdown on the spot, returns it, and saves it for next time.
  • When a post, page, listing, product, testimonial, taxonomy, or relevant public field changes, its Markdown is refreshed automatically.

There’s no “pending” page and no Worker in the way. The very first request can be a little slower than a cache hit, but the agent still gets the finished document in that same request.


Supported content

  • WordPress posts and pages, including Gutenberg content.
  • Published Elementor pages rendered through the normal public pipeline.
  • Listeo listings — details, taxonomies, opening hours, images, and contact fields your visibility settings allow.
  • WooCommerce products — descriptions, price, availability, attributes, categories, and images.
  • Testimonials.

Only published, publicly viewable, password-free content qualifies, and common SEO noindex settings are respected. Cart, checkout, My Account, shop archives, attachments, Elementor templates, and private Listeo data are all left out.


Like Cloudflare Markdown for Agents – minus the Worker

The idea mirrors Cloudflare Markdown for Agents: send Accept: text/markdown, get structured Markdown back instead of HTML.

The difference is where the work happens. Cloudflare converts HTML to Markdown on its network for enabled zones. This plugin does it inside WordPress, so it understands Listeo and WooCommerce content directly and caches the result on your own disk. It works with or without Cloudflare, and there’s no Worker to deploy or maintain.

Listeo Pay Per Lead

Turn every inquiry into revenue. Bookings and contact messages become leads with masked guest details; listing owners pay per lead to unlock them, using prepaid credit packs or checkout.

AI Skills for Coding Agents

This is not a plugin. Please read the instructions below. 😊
Codex and Claude Code

The Listeo AI Agent Toolkit is a downloadable package for Claude Code, Cursor, Codex, and other AI coding agents. It helps agents customize Listeo in an update-safe way, without editing core theme or plugin files directly.

The toolkit includes:

  • AI agent instructions for working with Listeo safely
  • Listeo runtime 130+ hooks and extension points
  • Common customization recipes
  • Example add-on plugin code
  • Example Elementor widget add-on code
  • WordPress security, escaping, i18n, and update-safe development rules

To use the toolkit properly, make sure your site is running the at least 2.0.51 version of Listeo and latest plugins versions because old version do not have large amount of hooks.


How to Use It

  1. Go to purethemes.net/customer-portal/ and enter your Listeo license key.
  2. Download the Skills for AI Coding Agents package.
  3. Add the folder to your Claude Code, Cursor, or Codex project context.
    We recommend adding Listeo theme and two plugins (Listeo Core and Listeo Elementor) to the project to give AI better context.
  4. Ask your AI coding agent to read the toolkit before making changes.
  5. Coding agent will create a separated plugin or MU plugin with your customizations.
  6. Do not edit Listeo theme, Listeo Core, or Listeo Elementor files directly. This keeps your custom features separate from Listeo itself, so future theme and plugin updates do not overwrite your changes.