WordPress plugin intelligence profile

Substack Importer

The Substack Importer allows you to import content from a Substack newsletter into your WordPress site.

WP PlugIndex snapshot

Current directory snapshot

Tested up to WordPress 6.9
Current version1.2.0
WordPress coverageTested up to WordPress 6.9
Minimum stackWP 5.2 · PHP 7.4
Directory statusactive
Last directory update22 Apr 20266mo ago
Active installations1K+Adoption metric — not a quality score
WordPress.org rating2.8 / 5 from 4 ratings
Official packageDirect from WordPress.org

Repository metrics are context, not quality scores. Active installations measure adoption and can strongly reflect a plugin’s age and historical popularity. Ratings, recent updates and “Tested up to” metadata also do not guarantee modern code, error-free operation, security, feature completeness or suitability for a particular site. Why active installs don’t tell the whole story →

WP PlugIndex currently records Substack Importer version 1.2.0 as active, updated 6mo ago and tested up to WordPress 6.9.

Overview

About this plugin

The Substack Importer will import content from an export file downloaded from your Substack newsletter.

The following content will be imported:

  • Posts and images.
  • Podcasts.
  • Comments (only for publicly accessible posts).
  • Author information.

In the future, we plan to improve the importer by:

  • Mailing lists.
  • Enhancing the performance of processing export files with many posts and media.

Development

For running unit tests and contributing to the plugin, see the README on GitHub.

Tests can be run with wp-env or with any local WordPress setup paired with a Docker MySQL container. Run composer install first, then vendor/bin/phpunit.

Hooks

The Substack Importer provides filters and actions at key stages of the content conversion pipeline.

Post-level Filters

substack_importer_post_meta

Filter the post metadata loaded from the Substack API before it is used for author, comments, and other post data.

Parameters:

* $post_meta (array|null) – The post metadata from the Substack API response.

* $post (array) – The raw Substack post data from the CSV.

* $id (int) – The Substack post ID.

substack_importer_raw_content

Filter the raw HTML content before Gutenberg conversion. Runs after the subtitle has been prepended (if present). Useful for cleaning up Substack-specific HTML, adding custom elements, or stripping unwanted markup.

Parameters:

* $html_body (string) – The raw HTML content from the Substack export.

* $post (array) – The raw Substack post data from the CSV.

* $post_meta (array|null) – The post metadata from the Substack API response.

substack_importer_subtitle

Filter the subtitle HTML before it is prepended to the post content. Return an empty string to skip the subtitle entirely.

Parameters:

* $heading (string) – The subtitle HTML (default: an h2 element).

* $post (array) – The raw Substack post data.

substack_importer_post_content_after_conversion

Filter the post content after Gutenberg conversion but before it is added to the WXR. , membership plugins).

Parameters:

* $post_content (string) – The converted Gutenberg block content.

* $post (array) – The original Substack post data.

* $post_meta (array|null) – Additional post metadata from Substack API.

substack_importer_post_data

Filter the final post data array before it is added to the WXR.

Parameters:

* $post_data (array) – The post data.

* $post (array) – The original Substack post data.

Content Conversion Filters

substack_importer_converted_node

Filter the result of a single node conversion to a Gutenberg block. Allows modification of the block name and attributes. Return a null block_name to skip the node.

Parameters:

* $block_data (array) – Array with ‘block_name’ and ‘block_attributes’ keys.

* $node (DOMElement) – The converted DOM node.

g. ‘p’, ‘div’, ‘h2’).

substack_importer_image_result

Filter the image node conversion result. Useful for adjusting image sizes, captions, or link destinations.

Parameters:

* $result (array) – Array with ‘block_attributes’ and ‘node’ keys.

* $image_data (array|null) – The decoded image data from the Substack data-attrs attribute.

substack_importer_pre_embed_conversion

Short-circuit the embed node conversion before default handling. Return a non-null array to skip the built-in switch statement entirely. Useful for handling unsupported embed types or overriding the default conversion for a specific provider.

Parameters:

* $pre_result (array|null) – Return non-null to short-circuit. Expected keys: ‘node’, ‘block_attributes’, ‘block_name’.

* $node (DOMElement) – The embed DOM node before conversion.

* $parent (DOMElement) – The parent DOM element.

g. ‘youtube-wrap’, ‘tweet’).

substack_importer_embed_result

Filter the embed node conversion result after the default conversion. Useful for modifying embed URLs, adding custom attributes, or changing how embeds are represented.

Parameters:

* $output (array) – Array with ‘block_name’, ‘block_attributes’, and ‘node’ keys.

* $first_class (string) – The CSS class identifying the embed type.

substack_importer_audio_block

Filter the Gutenberg audio block HTML for podcast posts.

Parameters:

* $block (string) – The Gutenberg audio block HTML.

* $audio_url (string) – The URL of the podcast audio file.

Paywall Filters

substack_importer_paywall_marker_text

Filter the paywall marker text that appears in the imported content.

Parameters:

* $marker_text (string) – The default paywall marker text.

* $node (DOMElement) – The paywall node being converted.

* $parent (DOMElement) – The parent element.

substack_importer_paywall_content

Filter the entire paywall conversion result. Return a non-null value to override the default conversion.

Parameters:

* $result (array|null) – The conversion result, null to use default.

* $node (DOMElement) – The paywall node being converted.

* $parent (DOMElement) – The parent element.

Actions

substack_importer_before_post

Fires before a single Substack post is processed and converted. Useful for setting up state or performing actions before conversion begins.

Parameters:

* $post (array) – The raw Substack post data from the CSV.

* $post_meta (array|null) – The post metadata from the Substack API response.

* $id (int) – The Substack post ID.

substack_importer_after_post

Fires after a single Substack post has been converted and added to the WXR. Useful for logging, progress tracking, or performing cleanup after each post.

Parameters:

* $post_data (array) – The final post data that was added to the WXR.

* $post (array) – The raw Substack post data from the CSV.

* $post_meta (array|null) – The post metadata from the Substack API response.

* $id (int) – The Substack post ID.

WordPress.org metadata

Plugin tags

Topics listed for this plugin in the WordPress.org directory.

  • importer
  • substack
Compatibility & maintenance

Compatibility & maintenance

Tested up to WordPress 6.9

Not yet marked as tested with WordPress 7.1. WordPress.org currently lists Tested up to 6.9.

Current WordPress releaseWordPress 7.1
WordPress.org Tested up to6.9
Minimum requirementsWordPress 5.2 · PHP 7.4
Update activity22 Apr 20266mo ago

“Tested up to” is directory metadata supplied by the plugin author. WP PlugIndex does not turn an older declaration into a claim that the plugin is incompatible.

Changes recorded by WP PlugIndex

Recent tracked changes

No tracked version or compatibility changes have been recorded by WP PlugIndex yet.

Tracking & source

WP PlugIndex tracks public WordPress.org directory metadata and records selected version, compatibility and availability changes as they are detected.

Plugin watchlist

Watch this plugin

Sign in to your WP PlugIndex account or create a free account. Free accounts can watch up to 5 plugins and see what changed.

Watch limit

Watchlist limit reached

You have reached your current active watch limit.