Added
- Full internationalization: plugin strings are now in English with a bundled French translation, so the Dashboard displays in French on French-locale sites and in English everywhere else.
- New settings backup feature: export your configuration to a JSON file and re-import it later, from a dedicated section on the WPSnipHub screen.
uninstall.php: deleting the plugin now cleans up everything it created in the database, including content added through its custom post types and taxonomies.CONTRIBUTING.md: guidelines and a compliant template for anyone writing a new module.- Dev-only tooling (PHPCS/WPCS, Stylelint) to keep future contributions compliant with WordPress coding standards.
Changed
- Every module is now disabled by default on a fresh install — you choose what to turn on.
- The settings screen was rebuilt on WordPress's native Settings API and now groups modules into 5 categories for easier browsing.
- Deleting WPSnipHub now also removes all portfolio/testimonial/event content and their taxonomy terms, not just the plugin's own settings — since that content can't be managed anywhere once the plugin is gone.
- All 20 modules' comments and documentation blocks were rewritten to a single, consistent format.
- Bumped "Tested up to" to WordPress 7.1.
- Widened the module-title column on the settings screen for better readability.
Fixed
- Critical: enabling the WooCommerce module without WooCommerce installed crashed every page on the site.
- Saving the module list silently failed due to an invalid nested HTML form.
- The Scripts and Styles modules did nothing at all, due to a documentation-comment bug that had disabled their code since they were introduced.
- Inconsistent spacing between labels and fields on the custom image-size settings.
- A WordPress debug notice caused by loading translations too early.
- Several stray files and a minor security-hardening tweak flagged by the official Plugin Check tool.
Technical details
wpsh_load_modules()no longer callswpsh_get_modules()(which now contains translation-function calls) from theplugins_loadedhook, since that fires beforeload_plugin_textdomain()runs oninit— it reads the already-sanitizedwpsh_enabled_modulesoption directly instead, avoiding a_load_textdomain_just_in_timenotice on every request.uninstall.phptemporarily re-registers the plugin's custom post types/taxonomies (reusing the existing config functions, nothing duplicated) purely sowp_delete_post()/wp_delete_term()can be used safely; post IDs are queried directly via$wpdbrather thanget_posts(), since WordPress's'any'status filter silently excludes drafts and auto-drafts.- The wider module-title column (
.form-table th) is scoped inside@media screen and (min-width: 783px), matching WordPress core's own breakpoint for the settings screen's mobile stacked layout, so the two never conflict. wpsh_wc_remove_shop_breadcrumbs()now guards its call tois_shop()withfunction_exists(), since it runs on the coretemplate_redirecthook regardless of whether WooCommerce is active._docs.phphad its duplicated (and outdated) plugin-structure comment removed; the authoritative version now lives inCONTRIBUTING.md.
Full Changelog: v1.2.5...v1.3.0