Selfhost Podcasting exposes WordPress filters and actions for developers who need to adjust forms, feed output, migration behavior, storage behavior, background processing, or private podcasting.
Use these hooks in a small custom plugin or theme functionality plugin. Avoid editing Selfhost Podcasting plugin files directly.
Admin and form hooks
sh_podcasting_form_fields
Filters podcast information fields.
sh_podcasting_epi_form_fields
Filters episode information fields.
sh_podcasting_settings_form_fields
Filters feed settings fields.
sh_podcasting_integrations_form_fields
Filters integration fields.
sh_podcasting_manage_form_fields
Filters management fields. The Pro module uses this to add private podcasting settings.
sh_podcasting_settings_field_markup
Filters custom field markup for settings and management forms.
sh_podcasting_admin_submenu_pages
Filters Selfhost admin submenu pages.
sh_podcasting_admin_podcast_section_labels
Filters labels used for podcast management sections.
Validation and sanitization hooks
sh_podcasting_pod_sanitization_methods
Filters podcast and settings sanitization callbacks.
sh_podcasting_epi_sanitization_methods
Filters episode sanitization callbacks.
sh_podcasting_integration_sanitization_methods
Filters integration sanitization callbacks.
Feed output hooks
sh_podcasting_pod_feed_data
Filters the full prepared podcast feed data before markup arrays are generated.
sh_podcasting_feed_generator
Filters the class name used to generate feeds. The Pro module uses this to swap in its feed generator.
sh_podcasting_feed_podcast_id
Overrides the podcast ID resolved from a feed key. Migration feed takeover uses this pattern while serving source-compatible URLs.
sh_podcasting_should_register_feed
Controls whether a feed should be registered for a podcast.
sh_podcasting_channel_markup_array
Filters channel-level feed tags.
sh_podcasting_item_markup_array
Filters item-level feed tags.
sh_podcasting_namespaces
Filters RSS namespace declarations.
sh_podcasting_pod_escape_methods
Filters channel data escaping callbacks.
sh_podcasting_epi_escape_methods
Filters episode data escaping callbacks.
sh_podcasting_pod_excerpt_length
Filters podcast summary excerpt length.
sh_podcasting_epi_excerpt_length
Filters episode summary excerpt length.
sh_podcasting_episode_permalink
Filters episode links in the feed.
sh_podcasting_preview_audio_url
Filters audio URLs used by the browser preview.
Save and lifecycle actions
selfhost_podcasting_podcast_created
Runs after a podcast is created.
selfhost_podcasting_podcast_saved
Runs after podcast data, settings, or management options are saved.
selfhost_podcasting_feed_settings_saved
Runs after feed settings are saved.
selfhost_podcasting_integration_saved
Runs after an integration is saved.
selfhost_podcasting_privacy_status_changed
Runs when podcast privacy status changes.
selfhost_podcasting_podcast_deleted
Runs when a podcast is deleted or a migrated podcast is removed.
selfhost_podcasting_episode_saved
Runs after an episode is saved or imported.
selfhost_podcasting_episode_deleted
Runs after an episode is detached or deleted from a podcast.
selfhost_podcasting_media_migrated
Runs after media is moved through the integration media migration flow.
Background job hooks
The background queue identifier is sh_podcasting_bg_jobs. Several dynamic filters are built from it:
sh_podcasting_bg_jobs_process_intervalsh_podcasting_bg_jobs_lock_timeoutsh_podcasting_bg_jobs_max_dispatchessh_podcasting_bg_jobs_dispatch_windowsh_podcasting_bg_jobs_max_consecutive_errorssh_podcasting_bg_jobs_enabledsh_podcasting_bg_jobs_max_upload_items_per_tasksh_podcasting_bg_jobs_upload_circuit_windowsh_podcasting_bg_jobs_upload_circuit_max_failuressh_podcasting_bg_jobs_query_argssh_podcasting_bg_jobs_query_urlsh_podcasting_bg_jobs_post_argssh_podcasting_bg_jobs_memory_exceededsh_podcasting_bg_jobs_queue_lock_time
Task handlers use:
sh_podcasting_bg_task_{$task_type}
Built-in task types include upload_media, delete_media, and backfill_duration.
S3 storage hooks
Storage-related filters include:
sh_podcasting_s3_multipart_thresholdsh_podcasting_s3_multipart_part_sizesh_podcasting_s3_max_remote_download_sizesh_podcasting_s3_temp_space_buffersh_podcasting_s3_verify_object_attemptssh_podcasting_s3_verify_delivery_url
Use these only if you understand your provider's upload and delivery behavior.
Migration hooks
sh_podcasting_migration_providers
Filters available migration providers.
selfhost_podcasting_migration_completed
Runs after migration completes.
selfhost_podcasting_takeover_status_changed
Runs when source feed takeover is enabled or disabled.
Podcast Player hooks
selfhost_podcasting_podcast_player_validate_migration
Controls validation for Podcast Player migration handoff.
The integration also uses Podcast Player's external defaults filter when the installed Podcast Player version supports it.
Pro private podcasting hooks
Private podcasting exposes filters including:
shp_private_podcasting_supported_integrationsshp_private_feed_qr_urlshp_private_token_email_subjectshp_private_token_email_messageshp_private_token_email_enabledshp_private_episode_access_min_range_bytes
Use these to customize supported access providers, QR image generation, notification emails, and private episode access behavior.
Compatibility advice
- Prefer filters over directly editing plugin metadata.
- Keep custom feed tags valid XML.
- Test feed output after changing markup hooks.
- Avoid expensive database queries inside feed filters.
- Be careful with private feed hooks because token validation and audio protection depend on predictable URLs and ownership checks.
