Set up the WordPress plugin
Install the official WOHNO WordPress plugin, connect it with your API key, and embed your listings natively and SEO-friendly via block, widget or shortcode.
The official WOHNO WordPress plugin shows your listings natively and SEO-friendly on your WordPress site. You maintain your properties exactly once in WOHNO; the plugin renders them as real HTML as a grid, large cards, a list or an interactive map. The detail page and application run first-party on wohno.de – so the applicant folder, personal data and GDPR responsibility stay with WOHNO.
What problem this solves: you want to show your WOHNO listings on your own agency website – automatically in sync, without running your own portal and without applicant data being created on your server.
Looking for a plain Vanilla-JS embed without WordPress (a static page, your own framework)? Then the Embed listings on your website guide is the right place.
Prerequisites
- WordPress 6.4 or newer and PHP 8.1 or newer.
- A WOHNO account with at least one published listing.
- A secret key (
sk_…) with thelistings:readscope. The plugin calls the API server-side only and stores the key encrypted; it never reaches the browser.
Unlike a browser-side embed, here you need no publishable key (
pk_…) and no origin allowlist: the fetch happens server-side in WordPress, not in your visitors' browser.
Step 1 — Create a secret key
- Open Dashboard → Settings → API.
- Click Create API key and choose Secret key (
sk_…). - Assign the
listings:readscope. - Save and copy the key. Keep it safe – it is shown in full only once.
Step 2 — Install and connect the plugin
- Install and activate the WOHNO plugin in WordPress.
- Open the new Wohno menu in the WordPress sidebar.
- Switch to the Connection tab, paste your secret key and save.
- Click Test connection. On success, the plugin is ready to use.
The key is stored server-side in wp_options – encrypted with AES-256-GCM, provided
AUTH_KEY/SECURE_AUTH_KEY are set in wp-config.php (the WordPress default) and the
server provides openssl. It is sent only over HTTPS in the X-API-Key header, never
in the query string and never logged.
Step 3 — Embed listings
There are three equivalent ways:
- The Gutenberg block "Wohno – Listings" (with editor preview and ready-made block patterns).
- The classic widget "Wohno – Listings" for widget areas.
- The shortcode
[wohno_listings]for pages and posts.
A typical shortcode with filters:
[wohno_listings city="Köln" rooms_min="2" rent_max="1200" layout="grid" columns="3"]You embed a single listing by ID:
[wohno_listing id="9f1c2a3b-1111-2222-3333-444455556666"]The Embed tab of the plugin settings provides a shortcode generator with a live preview and a picker for individual listings – so you never have to look up an ID.
Shortcode reference: [wohno_listings]
| Attribute | Values | Default | Description |
|---|---|---|---|
city | text (2–80 chars) | – | City filter |
zip | up to 5 digits | – | ZIP filter (prefix) |
rooms_min | 0–20 | – | Minimum number of rooms |
rooms_max | 0–20 | – | Maximum number of rooms |
rent_max | euros (e.g. 1200) | – | Max. cold rent in euros; the plugin converts to cents internally |
property_type | apartment, house, studio, wg_room, other | – | Property type |
wbs_only | 1 | – | WBS-only listings |
q | text (up to 100 chars) | – | Full-text search |
limit | 1–50 | 9 | Listings per page |
columns | 1–4 | 3 | Columns (grid only) |
layout | grid, cards, list, map | grid | Layout |
search | 1 | off | Show the visitor filter bar |
load_more | 1 / false | 1 | "Load more" button (cursor pagination) |
[wohno_listing]
| Attribute | Values | Description |
|---|---|---|
id | UUID | ID of a single listing |
Appearance & branding
In the Appearance tab you set the default layout, number of columns, accent colour
and corner radius. For full design control you can copy the card template
wohno/listing-card.php into your (child) theme – the plugin then uses your version.
Custom templates must escape their own output (esc_html, esc_url, esc_attr).
Map layout & OpenStreetMap
The map layout (layout="map") uses Leaflet with OpenStreetMap tiles and needs no
API key. Your visitors' browsers load map tiles directly from OpenStreetMap, which
transmits their IP address to OpenStreetMap. Without the map layout no such connection
is made. The plugin contributes suggested privacy-policy text for both data flows
(Tools → Privacy).
Performance: non-blocking rendering
The plugin never renders blocking against the API:
- Each query has a fresh window (~5 minutes) and a longer retain window (~1 day). Fresh hits return immediately from the cache.
- Stale hits return the cache and trigger a background refresh; only the very first view of a query fetches synchronously.
- A 5-minute WP-Cron prewarms known queries in the background. The refresh is
ETag-validated – a
304 Not Modifiedcosts no API quota.
Security
- The secret key is used server-side only (encrypted at rest), sent only over HTTPS
in the
X-API-Keyheader, and never exposed in the browser or page source. - A non-HTTPS configuration of the API base is rejected, so the key-bearing request can never be downgraded to plaintext.
- No applicant data is created on your website – the application runs first-party on wohno.de.
Troubleshooting
| Symptom | Possible cause | Fix |
|---|---|---|
| No listings visible | Key invalid or missing scope | Run "Test connection"; create a key with listings:read |
| "API key invalid or unauthorized" | Wrong scope (401/403) | Create an sk_… key with listings:read in the dashboard |
| Listings appear delayed | Caching (~5 min) | Wait briefly; the prewarm refreshes in the background |
| "API limit reached" | Rate limit (429) | Retry later; the plugin serves the cache meanwhile |
| Filter returns (almost) nothing | Filters too narrow | Loosen city, rent_max or rooms_min |
Configuration for staging/self-hosting
The WOHNO_API_BASE constant in wp-config.php lets you override the API base URL
(default https://wohno.de). Only HTTPS is accepted – the exception being local
development hosts (localhost, *.test, *.local).
define( 'WOHNO_API_BASE', 'https://staging.example.com' );Next steps
- Embed listings on your website — browser-side embedding with a publishable key.
- Authentication guide — key types, scopes and rotation.
- API reference — the full
listingsfield whitelist.