OxyPods is a WordPress plugin that exposes Pods custom fields in the Oxygen 6 (Breakdance) Dynamic Data picker — including live preview in the visual editor.
- Author: QuirkyRobots
- License: GPL-2.0-or-later
- Requires PHP: 8.0
- Requires: Pods 3.3+, Oxygen 6 (Breakdance)
When you build a page in Oxygen 6, the Dynamic Data picker lets you bind elements to live data sources. Out of the box, Oxygen 6 has no knowledge of Pods custom fields. OxyPods registers every field from every post-type pod with Oxygen's Dynamic Data system, so they appear in the picker grouped under Pods → [Pod Name].
Fields render live in the visual editor, not as raw shortcodes.
- Download the latest release zip from Releases
- In WordPress admin go to Plugins → Add New → Upload Plugin
- Upload the zip and activate
- Both Pods and Oxygen 6 must be active — OxyPods will show a warning banner if either is missing
- Open any post or template in the Oxygen 6 builder
- Add an element that supports Dynamic Data (Text, Image, Gallery, etc.)
- Click the Dynamic Data icon
- Scroll to the Pods category — your pod fields appear grouped by pod name
- For Gallery elements, set Type: Gallery in the filter to see only gallery-compatible fields
OxyPods adds a settings page at Settings → OxyPods which shows:
- Status banner confirming both Pods and Oxygen 6 are active
- A table of all detected pods and fields, showing how each is registered and its Dynamic Data slug
- A diagnostics table showing the raw
_pods_{field}and plain meta values for the most recently published post of each pod type — useful for confirming data is stored correctly
Fields show as raw shortcodes in the editor
This means the Dynamic Data AJAX call is returning empty. Check the Diagnostics page — if _pods_{field} is empty for the relevant field, re-save the post through the WordPress editor with Pods active.
Gallery field not visible in the picker Make sure Type is set to Gallery (not All) in the Dynamic Data picker. Gallery fields are filtered by return type.
Images empty after selecting the field
Confirm the attachment IDs shown in Diagnostics exist as posts with post_status = inherit in wp_posts. Run:
SELECT ID, post_status FROM wp_posts WHERE ID IN (30, 51, 52);Debug attachment ID resolution
Add temporarily to functions.php:
add_action('wp_loaded', function() {
$ids = oxypods_get_attachment_ids( YOUR_POST_ID, 'YOUR_FIELD_NAME' );
error_log( 'OxyPods attachment IDs: ' . wp_json_encode( $ids ) );
});Then check wp-content/debug.log.
Oxygen 6 fires breakdance_loaded on plugins_loaded. OxyPods listens for breakdance_loaded and registers its own wp_loaded callback. This guarantees:
- The Breakdance class hierarchy is fully declared before OxyPods extends it
- Pods is fully initialised (
pods_api()is callable) bywp_loaded - Fields are registered before
template_include, where Breakdance fires itsbreakdance_dynamic_data_getAJAX handler
Pods stores file/image relationship data two ways:
_pods_{field_name}— a single array-typed meta key containing all attachment IDs (written byPodsAPI::save_relationships()){field_name}— one individual meta row per attachment ID
OxyPods reads both layers, trying the _pods_ key first for speed.
The Oxygen 6 builder previews dynamic data by sending a POST request to the post's URL with action=breakdance_dynamic_data_get. OxyPods field handlers use get_the_ID() and get_post_meta() directly — the same pattern as native Breakdance fields — ensuring they work correctly in this AJAX context.
Pull requests welcome at github.com/QuirkyRobots/oxypods.