WP Manifestindependent plugin directory
manifest / editor / sqs71-to-gutenberg

Squarespace 7.1 → Gutenberg Converter

Squarespace 7.1 content to Gutenberg (WordPress) content converter

by Walkabout Chronicles migration · github.com/davipontesblog/sqs71-to-gutenberg · website

0stars
0forks

Install

No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:

wp plugin install https://github.com/davipontesblog/sqs71-to-gutenberg/archive/refs/heads/main.zip

A WordPress plugin that re-scrapes a live Squarespace 7.1 site and rewrites matching WordPress posts as proper Gutenberg block markup (wp:image, wp:gallery, wp:paragraph, wp:heading, wp:embed, wp:list, wp:quote, wp:separator).

Built for migrations where the standard Squarespace XML export drops gallery structure (galleries are exported "version 7.0 only") or leaves Squarespace HTML soup behind that the block editor can't edit cleanly.

Why this exists

Squarespace's official XML export does not export gallery content from 7.1 sites and produces nested <div class="sqs-block ..."> HTML rather than discrete image references. As a result, when imported with the WordPress Importer (or WordPress.com's Squarespace import) the posts end up as one big "Classic"/HTML blob in the editor and images are referenced by external URL only.

This plugin works around all of the above by fetching the live rendered HTML of each post from the source site, parsing the Squarespace block markup, and emitting equivalent Gutenberg block markup with images uploaded to the local Media Library.

Requirements

  • WordPress 6.4 or newer
  • PHP 7.4 or newer
  • The source Squarespace site is still publicly reachable (this plugin does not work against an expired/cancelled subscription)
  • Each WordPress post you want to convert has the same slug as its Squarespace counterpart (this is the default for sites imported via the built-in WordPress importer)

Install

  1. Drop the sqs71-to-gutenberg folder into wp-content/plugins/.
  2. Activate Squarespace 7.1 → Gutenberg Converter from Plugins.
  3. Visit Tools → Squarespace → Gutenberg.

Configure

  • Source domain — the live Squarespace 7.1 site, e.g. https://www.example.com.
  • Post URL pattern — placeholders {year}, {month}, {day}, {slug}. Example for Walkabout-style sites: /walkabout-chronicles/{year}/{month}/{day}/{slug}.
  • Batch size — how many posts per "Run batch" click.
  • Dry run — preview block-type counts and a content head without writing.
  • Force reconvert — re-run on posts already marked converted.
  • Date offset (days) — set if your imported post dates are off by N days vs. the live site. The fetcher also automatically tries ±1 day to absorb timezone drift.
  • Image quality — Squarespace ?format= value (defaults to 2500w).
  • Request timeout — per-URL HTTP timeout in seconds.

Run

Either use Tools → Squarespace → Gutenberg in wp-admin, or run via WP-CLI:

wp sqs71 convert --slugs=routines,the-shifting --dry-run
wp sqs71 convert --all --batch-size=20
wp sqs71 convert --all --force

The plugin marks each converted post with _sqs71_converted_at post meta so re-runs skip them by default.

Squarespace XML imports often drop the cover-image association on each post. The plugin can rebuild it by walking the live Squarespace blog JSON and matching each post's assetUrl (cover image) to a Media Library attachment. Sideloads any missing images on the fly.

In wp-admin: scroll down on Tools → Squarespace → Gutenberg to the "Set featured images from Squarespace" section. From WP-CLI:

wp sqs71 set-featured --limit=100
wp sqs71 set-featured --all                # loops until done
wp sqs71 set-featured --retry --limit=200  # retry posts that didn't get a thumbnail

The plugin tags each processed post with _sqs71_featured_set meta so re-runs are idempotent. Use --retry to force a re-attempt on posts that were processed but didn't successfully get a thumbnail (most often: posts with WP slugs that don't match the live Squarespace slug, e.g. -2/-3 duplicate-import artifacts; the retry path falls back to _sqs71_resolved_url post meta if present).

Reassign post authors

Squarespace XML imports often collapse all posts under a single user. The plugin can rebuild authorship by walking the live Squarespace blog JSON, finding each post's original authorId, and matching it to a WP user (creating new users for any Squarespace authors who don't have a matching WP account if you opt in).

In wp-admin: scroll to "Reassign post authors from Squarespace" on the Tools → Squarespace → Gutenberg page. Click Survey authors first to see the unique authors in the source; then Reassign authors to apply. From WP-CLI:

wp sqs71 reassign-authors --survey                 # list authors first
wp sqs71 reassign-authors --create-users --all     # create missing users + reassign
wp sqs71 reassign-authors --all                    # reassign without creating users
                                                   # (posts whose author has no WP
                                                   # match get flagged 'no-wp-user')

Created users are given role Author with a 32-char random password (reset via the standard WP password-reset flow). Each WP user gets a sqs71_author_id user-meta entry so future runs find them by their Squarespace ID even if the display name changes.

Each processed post is tagged with _sqs71_author_set meta so re-runs are idempotent.

What it converts

Squarespace block class Gutenberg block emitted
sqs-block image-block core/image (with caption, alt, attachment)
sqs-block gallery-block core/gallery containing core/image items
sqs-block html-block core/paragraph / core/heading / core/list / core/quote
sqs-block embed-block core/embed
sqs-block video-block core/embed
sqs-block quote-block core/quote
sqs-block horizontal-rule-block / line-block core/separator
sqs-block spacer-block dropped (block editor handles spacing)
any other sqs-block core/html fallback so content isn't lost

Caveats

  • Squarespace's HTML markup isn't formally versioned. A class-name change on their side could break the parser. Always do a 3-post dry run first.
  • The plugin writes to post_content. Back up the database before a full run.
  • Supported post type is post. Pages and custom types can be added by extending the rewriter.

License

GPL v2 or later — see LICENSE.