
Shapely is a powerful and versatile one page WordPress theme with pixel perfect design and outstanding functionality. It ships a large set of customization options for a free theme, all of them in the WordPress Customizer. This theme comes with several homepage widgets that can be used to add portfolio, testimonials, parallax sections, your product or service information, call for action, and much more.
Shapely supports most free and premium WordPress plugins, including WooCommerce, Jetpack, Gravity Forms, Contact Form 7, Yoast SEO, Google Analytics, and many more. Needless to say, that theme is mobile-friendly and responsive, which makes it look stunning on any device.
This theme is best suited for business, landing pages, portfolios, eCommerce stores, local businesses, and personal websites, but can be tweaked to be used on a blog, magazine, or any other awesome website, while highlighting its unique one-page setup.
Shapely works with all the most popular WordPress page builder plugins such as Elementor or WPBakery Page Builder. Shapely is still actively maintained: version 1.3.4 shipped on 11 September 2026 and is tested against WordPress 7.0.
Where Shapely works best
Shapely’s full-width parallax sections and one-page structure suit any site where a photograph has to carry the page. It is one of our picks in the roundups for photography themes, gallery themes, wedding themes, event themes, nature and environmental themes and eCommerce themes, and it appears in our free WordPress themes collection.
- Version: 1.3.4
- Last updated: 11 September 2026
- Tested up to: WordPress 7.0
- Requires: WordPress 6.4 or later · PHP 7.4 or later
- Active installations: 10,000+
- Rating: 4.6 out of 5 from 67 reviews on WordPress.org
- Total downloads: 1,516,522
- View on WordPress.org
= 1.3.4 =
- Fixed the Font Awesome webfonts returning 404. The stylesheets reference url(../webfonts/…), which resolves next to the stylesheet, and the fonts had been placed a directory too high — so no icon rendered at all.
- The bundled Font Awesome is now subsetted to the glyphs the theme renders, loaded by default, with the complete build still shipped for sites that need it: add_filter( ‘shapely_full_fontawesome’, ‘__return_true’ ). Measured on WordPress 7.1 and PHP 8.5, median of three Lighthouse runs: performance 72 to 91, First Contentful Paint 1.65s faster, font payload 297 KB to 44 KB.
= 1.3.3 =
- Updated Font Awesome from 6.4.2 to a self-hosted 7.3.1. The theme loaded all.min.css, which carries v4 and v5 compatibility @font-face blocks and shipped a fa-v4compatibility font to back them; no shim is wanted, since every class the theme renders is a native Font Awesome name. The stylesheets now load split by style — the core name map plus one file per family — and only the solid and brands faces are bundled, the two the theme renders.
- Only woff2 ships. The ttf copies beside it were never downloaded, because a browser takes the first format it supports from the @font-face src list.
- Removed a second, complete icon font: FontAwesome.otf and five fontawesome-webfont files, 724 KB of Font Awesome 4 left behind by the upgrade to 6 and referenced by no stylesheet in the theme. Bundled icon fonts drop from 2,092 KB to 332 KB.
- Bluesky has its own icon again. fa-bluesky arrived in Font Awesome 6.6 and the theme bundled 6.4.2, so bsky.app links deliberately fell through to the generic link glyph. All 30 mapped social networks were checked against the bundled build.
= 1.3.2 =
- Updated the bundled Bootstrap from 3.3.7 to 3.4.1, the final release of the 3.x line and the one that fixed CVE-2019-8331. Shapely enqueues only Bootstrap’s stylesheet and never its JavaScript, so the theme was not exposed to that defect, which is a JavaScript one — but there is no reason to keep the superseded build. Both stylesheets were stock 3.3.7, so this is a straight replacement.
- The Customizer preview wrote its AJAX response into a <style> element with jQuery’s .html(), which parses its argument as markup. The payload is CSS from the theme’s own nonce- and capability-checked endpoint, so this was not reachable as a vulnerability, but it is inserted with .text() now.
- parallax.js was enqueued with the theme’s version string instead of its own, so its URL changed on every theme release and gave no indication of which build was in use. It declares 1.5.0, matching the bundled file.
= 1.3.1 =
- Fixed link colours changing after the 1.3.0 update on sites that set a different colour for links and for buttons. Both were being written to the same internal colour slot, so whichever was saved last won and links took the button’s colour
- Fixed child themes that swap out the theme’s Bootstrap, FlexSlider or Owl Carousel. 1.3.0 renamed those asset handles, which silently turned `wp_dequeue_style( ‘bootstrap’ )` into a no-op — the parent’s stylesheet came back on top of the child’s replacement, with no error to explain it. The old handle names work again, while the rename that stopped plugins suppressing the theme’s own stylesheets stays in place
= 1.3.0 =
- Removed the vendored Epsilon customizer framework. It was 144 files and 1.3 MB — 52% of the theme — and provided 31 toggle controls, one slider, two customizer sections and the welcome screen. All of those are now built on core WordPress APIs. The download is roughly a third smaller and the theme ships 51 PHP files instead of 88
- Added theme.json, so the palette, type scale and layout widths have a single source of truth that the block editor reads. Colour options in the customizer still work exactly as before — each one now overrides the matching theme.json value rather than maintaining a second palette
- Fixed "Wide width" and "Full width" doing nothing on blocks. The theme has declared support for them since 2018 without ever shipping the CSS they need
- Fixed images in post content overflowing their column. Bootstrap 3 only makes images responsive via a class that block markup never carries
- Rebuilt the welcome screen and the demo importer on core APIs. The old AJAX endpoint accepted a class name and a method name from the request and called them; dismissals now run through a single handler with a nonce and a capability check
- Fixed 11 customizer controls that would have disappeared entirely if the framework had ever failed to load, because their fallback registrations were incomplete
- Renamed the bootstrap, flexslider, owl.carousel and owl.carousel.theme asset handles to be theme-specific. Generic handles can be claimed by a plugin first, which silently suppresses the theme’s own file — the same fault that blanked every icon on sites running Elementor in 1.2.20
- The block editor now offers the theme’s palette, and the editor canvas matches the front end
= 1.2.21 =
- Fixed the back-to-top arrow sitting off-centre in its button. The 36px button’s content box was 22px tall and 10px wide after border and padding, so a 18px glyph with a 27px line box could not centre on either axis; measured 2.8px right and 1.9px high before, sub-pixel after
- Fixed one-page section links in the menu, and the page-builder customizer, using site_url() where home_url() was meant. On installs with WordPress in its own subdirectory those pointed at /wp/ instead of the site address
- Added add_theme_support( ‘wp-block-styles’ ) and add_editor_style(), so core block styles apply on the front end and the editor canvas matches the theme’s typography
- Added three block styles (two button styles and a short rule) and two block patterns, built from the theme’s own button and colour values
- Removed two orphaned Font Awesome 5 stylesheets that nothing enqueued
- Fixed the arrow on submenu items that have a further submenu sitting well below its label, near the bottom edge of the row. It was centred with the 55px top menu bar’s line height rather than the submenu row’s, putting it 11.5px too low on desktop and 6px too high on mobile
- Fixed Font Awesome 6 loading its glyphs from a leftover Font Awesome 5.15.3 font directory. The bundled stylesheet asked for "../webfonts/", which resolves out of assets/css/fontawesome6/ and into the old assets/css/webfonts/, so every icon added after 5.15.3 rendered as a blank gap — the X (Twitter) icon in the footer social links being the visible one
- Removed the orphaned Font Awesome 5 font files, which nothing referenced once the path above was corrected. The release zip drops from 3.16 MB to 1.88 MB
- Fixed the theme’s Font Awesome 6 never loading on sites running Elementor or any other plugin that registers the generic "font-awesome" handle. WordPress keeps only the first registration of a handle, so the theme’s stylesheet was silently dropped and every fa-brands / fa-solid icon — the social links, the search button, the menu and pagination arrows — rendered as a blank box. It now uses its own "shapely-font-awesome" handle
- Fixed the customizer loading Font Awesome from …/shapely/inc/assets/css/…, a path that has never existed, so the customizer’s own icons 404’d
- Fixed related posts on portfolio items returning the wrong posts when the portfolio taxonomies are not registered: wp_get_object_terms() returns a WP_Error there, and it was being passed straight into the query
- Regenerated languages/shapely.pot, which had been built before the text domain unification and was missing 86 translatable strings
- …and 2 further changes
= 1.2.20 =
- PHP 8.5 compatibility: removed every runtime deprecation and warning raised by the theme
- Verified on WordPress 7.0.2 / PHP 8.5: zero PHP notices across all templates, the customizer, the welcome screen and the block editor
- Verified alongside the Shapely Companion plugin (1.2.10): homepage widget sections, parallax, features, call-to-action and contact all render with zero PHP notices
- Replaced the Grunt build with plain npm scripts (tools/*.mjs): eliminates all 39 npm audit findings (1 critical, 24 high), which came entirely from grunt-contrib-imagemin and grunt-contrib-compress
- Replaced JSHint and the deprecated JSCS with ESLint 10; added Stylelint 17 for CSS
- Fixed the release zip shipping developer files: CLAUDE.md, .scss sources, README.md, tsconfig.json, webpack.config.js and a nested package.json were all being published to users
- Fixed image optimisation never running: the Grunt task was pointed at assets/img/, which does not exist (the images are in assets/images/)
- languages/shapely.pot is now generated with WP-CLI and filtered to the shapely text domain, dropping 83 epsilon-framework strings that could never be translated through it and picking up 19 theme strings the old task missed
- Replaced the dead Travis CI config with GitHub Actions covering PHP 7.4 through 8.5
- package-lock.json and phpcs.ruleset.xml are now tracked instead of gitignored
- Fixed the "Requires at least" header reading "WordPress 6.4" instead of "6.4". The stray prefix made WordPress’ minimum-version check pass on every release, so the theme could be activated on WordPress 4.9 where it would fatal
- Added the missing "Domain Path: /languages" header
- …and 37 further changes
= 1.2.19 =
- Fixed Builder Page template functionality that wasn’t working properly
- Added proper initialization for the Shapely_Builder class
- Removed debug code and improved code quality
- Enhanced widget area registration for Builder Page templates
- Fixed issues with dynamic sidebar registration for Builder Pages
- Improved error handling in theme template files
= 1.2.18 =
- Fixed issue with "Import Demo Content" functionality
- Added proper null checks in contact form widget to prevent PHP warnings
- Improved error handling in demo content importer
- Enhanced AJAX response handling for better user feedback
- Fixed static frontpage setting during demo import
= 1.2.14 =
- Breadcrumbs Support For Rank Math Plugin Fix php 8.0 deprecation issue and more
= 1.2.13 =
- Bug fixed issue #271 updated font awesome to 5 Merged with wpChill
= 1.2.12 =
- Improves : Escaping
= 1.2.11 =
- Compatibility with jQuery 3.0
= 1.2.10 =
- Updated dependacies Tested with WP 5.6
== Changelog ==
= 1.2.17 =
* Added a new customizer setting to control placeholder images for posts without featured images
* Added an option to upload custom placeholder images
* Added a global setting to show/hide categories across all blog layouts
* Improved customizer UI with clearer section headings for blog hero image
* Fixed issue with WP_Customize_Control class loading
* Added custom CSS for better visual separation in customizer settings
* Fixed compatibility issues with WordPress 6.8
= 1.2.0 =
* Implemented milestone https://github.com/puikinsh/shapely/milestone/4
= 1.1.6 =
* Implemented milestone https://github.com/puikinsh/shapely/milestone/2
= 1.1.5 =
* Added French translation thanks to Michaël Crofte
= 1.1.0 =
* Major upgrade to comply with WordPress.org guidelines and best practices.
= 1.0.5 =
* Improved theme translation
= 1.0.4 =
* Removed deprecated tags
= 1.0.3 =
* Small bug fixes and improvements
= 1.0.2 =
* Fixed parse error for older version of PHP.
* Fixed error when mobile menu was appearing along regular menu between 990px – 991px.
= 1.0.1 =
* Renamed JavaScript file to get rid of not found error.
* Updated Smooth Scroll to 1.7.2
= 1.0.0 =
* Initial release
