soapKit
Supkit is a powerful WordPress plugin featuring 25+ Elementor widgets and seamless WooCommerce integration. Build clean, modern eCommerce websites with custom layouts, flexible configurations, and enhanced design options while maintaining a lightweight, performance-focused experience.
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/soaphyls/soapkits/archive/refs/heads/main.zipAn Elementor-powered toolkit for WooCommerce shops and hotel / single-room sites.
- Header & footer positioning with sticky-header offset compensation
- A native Elementor Theme Builder with chip-based display conditions
- A managed Elements page where every shipped widget can be toggled on/off
- A complete Single Room widget suite (16 widgets) for hotel / room CPTs
- 12 free WooCommerce / header widgets (cart, wishlist, mini-cart, product grid, etc.)
- 23 PRO placeholders for future upsell (visual only, no class loaded)
Requirements
- WordPress 6.3+ (uses the bundled
swiperscript for carousels) - PHP 7.4+
- Elementor 3.10+
- Advanced Custom Fields Pro 5.x+ — required to get the room UI in the post editor. The widgets still work without ACF (native post-meta fallback) but you'll have no admin screen for them.
- WooCommerce 7+ — only for the cart / wishlist / product widgets. Not required for the room widget suite.
Installation
- Copy this whole folder to
wp-content/plugins/(or upload the zip via Plugins → Add New → Upload). - Activate soapKits in Plugins.
- Open soapKits → Elements in the sidebar to confirm the plugin loaded.
Setup: import the ACF field group
This is the most important step for the room widgets.
- Install & activate Advanced Custom Fields Pro.
- In WP admin, go to Custom Fields → Field Groups (under "Custom Fields" in the sidebar).
- Click the "Import Field Groups" button in the top toolbar.
- Select the file
docs/acf-room-field-group.jsonfrom this plugin folder and import. - Open the imported field group (named "SoapKits — Room Widget Fields").
- In the Location Rules meta box, change
Post Type is equal to roomto your actual room CPT slug (e.g.hotel_room,soapkit_room, etc.). - Click Update.
You will now see 20 fields on every room post edit screen: Room Gallery, Room Price, Max Occupancy, Booking Link, Room Video, Room Location, Room Amenities (repeater), Room Features (repeater), Room Phone / WhatsApp / Email, Room Rating, Room Number / Floor / Type, Check-in / Check-out.
If you don't use ACF, every widget still works — it falls back to plain WordPress post meta using the same field keys. You just won't have a UI to edit them; use
update_post_meta()fromfunctions.phpor a custom plugin.
Setup: room custom post type
The plugin does not register the room CPT for you (every property uses different slug/taxonomies). Make sure your existing CPT:
- Has
supports => [ 'title', 'editor', 'thumbnail', 'comments', … ](comments are required for the Reviews widget) - Has a taxonomy registered (e.g.
room_typeorhotel_amenity). The Room Related Rooms widget uses the first taxonomy it finds that has terms on the current room. - Is publicly queryable.
The room-context detection in the plugin looks for any post type whose slug or labels contain the word "room" (hotel_room, room, soapkit_room, etc.), so you don't have to whitelist a specific slug.
Setup: header & footer
The plugin ships its own Template Handler that injects header and footer templates. The simplest path:
- In Elementor, open Templates → Theme Builder (or Templates → Saved Templates, depending on your Elementor version).
- Add two new templates:
- Header — design as you normally would, hit Publish.
- Footer — same, hit Publish.
- In the soapKits → Conditions meta box on each template, set where the template appears:
- Add conditions like
Entire Site,Singular: room,Singular: post,Singular: page, etc. - Use the "Display Across Entire Site" preset for a one-click global header/footer.
- Add conditions like
- Hit Save Conditions. The plugin will register the wrapper IDs (
soapkits-header,soapkits-footer), add the body classes (soapkits-has-header,soapkits-has-footer, plus the singular-{post-type}variants), and enqueue its tiny CSS/JS that hides the theme's default header/footer and compensates the page for the sticky-header height.
If your theme already supplies a header, add this CSS to silence it:
body.soapkits-has-header .site-header,
body.soapkits-has-header header#masthead { display: none !important; }
The plugin emits the same set of wrapper IDs and body classes in both spellings — soapkits-* and soapkit-* (singular) — so pick whichever your CSS targets.
Setup: enable / disable widgets
Go to soapKits → Elements in the sidebar. You'll see a card grid with every shipped widget, grouped by category (Header, WooCommerce, Products, Marketing, Single Room, …). Each card has an on/off toggle:
- Free widgets — toggle freely. State is stored in the
soapkits_widgets_enabledoption. - PRO widgets — visual only, badge is shown but the toggle is locked to off.
Use the Enable All / Disable All buttons at the top of any category to mass-toggle. The state is saved via AJAX when you flip a switch.
Single Room widgets (16)
All under the Elementor category "Single Room" (soapkits-room). Every widget:
- Detects whether it's rendered in a single-room context. Off-room, it shows a friendly notice in the editor and renders nothing on the front-end.
- Reads its field via
Room_Fields::get()— ACF first, thenget_post_meta()fallback. - Provides editor-only empty-state notices when the source field is empty.
| # | Widget | Reads | Notable controls |
|---|---|---|---|
| 1 | Room Title | post_title |
Tag, separator icon |
| 2 | Room Featured Image | get_post_thumbnail_id |
Image size, link-to, lightbox, hover-zoom |
| 3 | Room Gallery | room_gallery |
Carousel / Grid / Masonry, Elementor lightbox |
| 4 | Room Amenities | room_amenities (repeater) |
Icon library (22 SVGs), List / Grid / Icon-List, description + link |
| 5 | Room Description | post_content |
Tag, content length, read-more button |
| 6 | Room Price | room_price, room_old_price |
Old-price strikethrough, currency prefix/suffix |
| 7 | Room Size | room_size |
Label override, 4 icon choices |
| 8 | Room Occupancy | max_occupancy |
Singular/plural, 4 icons, 4 layouts |
| 9 | Room Features | room_features (repeater) |
Pills / List / Compact, 22-icon library |
| 10 | Room Booking Button | booking_link |
URL source (ACF/custom), 4 icons, hover colors |
| 11 | Room Video | room_video |
YouTube / Vimeo / MP4, inline or lightbox |
| 12 | Room Location | room_location |
Google Maps embed, zoom, map type, custom address/lat-lng |
| 13 | Room Contact | room_phone, room_whatsapp, room_email |
Inline / List / Grid, click-to-call / mailto / wa.me |
| 14 | Room Reviews | WP comments + room_rating / room_review_count |
Star form (saves to comment meta rating), summary, list, filter by min rating |
| 15 | Room Related Rooms | first taxonomy found on the room | Carousel (Swiper) or Grid, order by / order, image size |
| 16 | Room Meta | room_number, room_floor, room_type, check_in_time, check_out_time |
Rows / Stacked / Inline, per-field icon + label, dividers |
Icon library
Amenities, Features, and Meta widgets share an inline SVG library (no external icon font, no font Awesome). Icons resolve from a name like wifi, pool, ac, tv, parking, breakfast, coffee, bath, shower, bed, safe, pet, smoke, no-smoke, phone, restaurant, gym, spa, fire, plus generic check and star. Any icon can also be a full URL or inline <svg>…</svg> markup.
WooCommerce / header widgets (12 free)
| Widget | Purpose |
|---|---|
| Site Logo | Custom logo with retina support |
| Nav Menu | wp_nav_menu() wrapper with scoped class filters so your menu keeps your existing CSS |
| Cart Icon | Header cart icon with badge |
| Wishlist Icon | Header wishlist counter |
| Mini Cart | Off-canvas mini cart panel |
| Cart Drawer | Slide-in cart drawer with quantity controls |
| Sticky Add To Cart | Sticky bar on mobile product pages |
| Variation Swatches | Color/label swatches for variable products |
| Product Grid | WooCommerce product loop with filters |
| Product Quick View | Modal quick-view for shop archives |
| Single Product | All-in-one single product template |
| Flash Sale | Countdown timer + sale products grid |
Plugin structure
soapkits/
├── soapkits.php (plugin header)
├── includes/
│ ├── class-plugin.php (Elementor register hook, widget autoloader)
│ ├── class-assets.php (style/script registry)
│ ├── class-template-handler.php(header/footer injection + body classes)
│ ├── class-theme-builder.php (Conditions meta box, chip UI)
│ ├── class-conditions.php (token matcher + filter hook)
│ ├── class-widget-registry.php(Elements page widget list)
│ ├── class-admin-menu.php (Elements page UI + AJAX)
│ ├── class-nav-menu-widget.php(free widget)
│ ├── class-room-fields.php (single source of truth for room field access)
│ └── …
├── widgets/
│ ├── *-widget.php (free, non-room widgets)
│ └── room/
│ ├── class-room-base.php (abstract base)
│ ├── class-room-title-widget.php (16 room widgets)
│ └── …
├── assets/
│ ├── css/
│ │ ├── kit-global.css (page-level flex layout, header offset)
│ │ ├── admin.css (Elements page styles)
│ │ └── widgets/
│ │ ├── nav-menu.css
│ │ ├── room-featured-image.css
│ │ ├── room-gallery.css
│ │ └── …
│ └── js/
│ ├── kit-global.js (header height measurement)
│ ├── admin.js (Elements page toggle UI)
│ └── widgets/
│ ├── room-related.js (Swiper carousel)
│ └── room-gallery.js (Swiper carousel)
└── docs/
├── room-widgets-plan.md (full design plan for the room suite)
└── acf-room-field-group.json (20-field ACF export, ready to import)
Developer hooks
// Add your own widget to the "Single Room" category automatically:
add_action( 'soapkits_room_widgets_registered', function( $manager ) {
$manager->register( new \My\My_Room_Widget() );
});
// Override the room context detection (e.g. force-enable on a CPT):
add_filter( 'soapkits_is_room_context', function( $is_room, $post_type ) {
if ( $post_type === 'accommodation' ) {
return true;
}
return $is_room;
}, 10, 2 );
// Add your own conditions token:
add_filter( 'soapkits_conditions_known_tokens', function( $tokens ) {
$tokens['my-template'] = __( 'My Custom Template', 'soapkits' );
return $tokens;
} );
// Match the token at runtime:
add_filter( 'soapkits_conditions_token_match', function( $matched, $token, $value ) {
if ( $token === 'my-template' && is_page( 'special-offer' ) ) {
return true;
}
return $matched;
}, 10, 3 );
Troubleshooting
Widgets don't appear in Elementor.
- Go to soapKits → Elements and confirm the widget is toggled on.
- Deactivate other Elementor addons that might be registering widgets with the same name (rare).
- Check
wp-content/debug.logfor fatal errors.
Carousel arrows don't navigate.
- Make sure nothing on the page is calling
Swiper.destroy()or running multiple Swiper initializations. - The plugin uses the
swiperscript shipped with WordPress 6.3+ as a dependency. Older WP versions need Elementor ≥ 3.11 (which bundles its own Swiper).
ACF fields are not showing on the room edit screen.
- You forgot to change the Location Rule in the imported field group to match your real room CPT slug.
The room widget shows an editor notice like "This post type does not have comments enabled".
- Add
'supports' => [ …, 'comments' ]to yourregister_post_type()call.
Sticky header doesn't offset the page correctly.
- The plugin measures the header height via JS and writes it to a CSS custom property
--soapkits-header-height. Make sure the page has thesoapkits-has-headerbody class. Check the body classes in your browser dev tools.
License
GPL v2 or later.
Author
soapKits Team.