Lightweight WordPress plugin for local business websites. Stores business data (branding, contact info, social media, integrations) in wp_options with zero external dependencies. Supports CSV import/export, full Google Local Business schema compliance, and three custom post types for Services, FAQs, and HowTos.
Lite version of: https://github.com/sitebuilderone/wp-sitebuilderone
This repo separates implementation instructions from client-specific strategy:
AGENTS.mdcontains repo, architecture, testing, and coding guidance.CLIENT.mdpoints to the active client brief for the current site.client-briefs/_template.mdis the reusable onboarding questionnaire.- For a new client, copy
client-briefs/_template.mdtoclient-briefs/client-name.md, fill it in, then updateCLIENT.mdso future content, SEO, service, FAQ, and page work uses the right business context. - In WordPress, SiteBuilderOne > Client Brief stores the same kind of client-specific onboarding context in the separate
sbo_client_briefoption, so it does not collide with live site settings insbo_options. - The Client Brief screen can import/export Markdown files that use the template's section headings and field labels, making it possible to move notes between files, client calls, AI drafts, and WordPress.
- The Client Brief screen can also fill missing live site fields from mapped brief values while preserving existing
sbo_optionsvalues.
- ✅ Admin Settings Page — Single-page UI under Settings > SiteBuilderOne
- ✅ Client Brief Admin Page — Stores onboarding, SEO, content, and strategy notes under
sbo_client_brief - ✅ Shortcode Support —
[sbo_field name="one_business_name"]for templates - ✅ PHP Helper —
sbo_get('field_key')for direct use in code - ✅ CSV Import/Export — Bulk data management
- ✅ Google Local Business Schema — 36 fields for rich snippets
- ✅ Services CPT —
servicepost type with tags, custom meta fields, REST fields, Schema.org markup, and[sb1_services]shortcode - ✅ FAQ CPT —
faqpost type with answer meta, related-service linking, FAQ schema, and[sb1_faq]shortcode - ✅ HowTo CPT —
howtopost type with steps, supplies, total time, HowTo schema, and[sb1_howto]shortcode - ✅ Copy-Friendly Shortcodes — Reference panel with copy-to-clipboard in admin
- ✅ LiveCanvas Compatible — Works with LiveCanvas page builder
- ✅ Zero Dependencies — No ACF, no external plugins required
- Activate the plugin in WP Admin
- Go to Settings > SiteBuilderOne
- Fill in your business information
- Use shortcodes in pages/posts:
[sbo_field name="one_business_name"] - Or use PHP in templates:
echo sbo_get('one_business_name');
For detailed development instructions, see AGENTS.md.
- Branding (5 fields) — Logo, name, description, keywords, banner
- Marketing (3 fields) — Headline, support copy, marketing image
- Business Information (4 fields) — Name, phone, email
- Physical Address (9 fields) — Street, city, state, ZIP, country, lat/long, Google Maps
- Social Media (7 fields) — Facebook, LinkedIn, YouTube, Twitter/X, WordPress, Yelp, GitHub
- Business Schema Details (2 fields) — Price range, opening hours
- Integrations (6 fields) — Meta tags, Google Analytics, Search Console, Looker Studio, Bing Webmaster
Total: 36 fields
- Settings > Media: Turn 'off' Organize my uploads into month- and year-based folders
Services are managed under SiteBuilderOne > Services.
Each service supports:
- Featured image
- Short Description — displayed in the grid card
- Icon — image URL or CSS class (e.g.
fa-solid fa-gear) - CTA Button URL — optional call-to-action link
- Service Type — used in Schema.org markup (e.g.
Web Design) - Area Served — used in Schema.org markup (e.g.
Nationwide) - Service Tags — taxonomy for filtering
Single service pages use /services/{slug}. The /services path remains free for a custom landing page.
[sb1_services]
All parameters are optional:
| Parameter | Default | Description |
|---|---|---|
count |
-1 |
Number of services to show (-1 = all) |
columns |
3 |
Grid column count |
tag |
(all) | Filter by service tag slug |
orderby |
menu_order |
WP_Query orderby value |
order |
ASC |
ASC or DESC |
Examples:
[sb1_services]
[sb1_services columns="2" tag="featured"]
[sb1_services count="6" columns="3" orderby="date" order="DESC"]
$services = new WP_Query([
'post_type' => 'service',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
]);
while ( $services->have_posts() ) : $services->the_post();
$short_desc = get_post_meta( get_the_ID(), '_sb1_short_description', true );
$icon = get_post_meta( get_the_ID(), '_sb1_icon', true );
$cta_url = get_post_meta( get_the_ID(), '_sb1_cta_url', true );
$type = get_post_meta( get_the_ID(), '_sb1_service_type', true );
$area = get_post_meta( get_the_ID(), '_sb1_service_area', true );
endwhile;
wp_reset_postdata();Copy the plugin template to your theme to customise the markup:
{theme}/sb1-services/services-grid.php
FAQs are managed under SiteBuilderOne > FAQs. Each FAQ has a Question (post title), a plain-text Answer, and an optional link to a Related Service. FAQPage schema is injected automatically when the shortcode is used.
The URL base can be changed under SiteBuilderOne > FAQ & HowTo.
[sb1_faq]
All parameters are optional:
| Parameter | Default | Description |
|---|---|---|
count |
-1 |
Number of FAQs to show (-1 = all) |
service |
(all) | Filter by service slug or post ID |
orderby |
menu_order |
WP_Query orderby value |
order |
ASC |
ASC or DESC |
Examples:
[sb1_faq]
[sb1_faq service="web-design"]
[sb1_faq service="42" count="5" orderby="date" order="DESC"]
$faqs = new WP_Query([
'post_type' => 'faq',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
]);
while ( $faqs->have_posts() ) : $faqs->the_post();
$answer = get_post_meta( get_the_ID(), '_sb1_faq_answer', true );
$related_service = get_post_meta( get_the_ID(), '_sb1_faq_related_service', true ); // post ID
endwhile;
wp_reset_postdata();{theme}/sb1-faq/faq-list.php
HowTos are managed under SiteBuilderOne > HowTos. Each HowTo supports a description, total time (ISO 8601), supplies list, and up to 10 numbered steps (name, instructions, image URL, optional URL). HowTo schema is injected automatically when the shortcode is used.
The URL base can be changed under SiteBuilderOne > FAQ & HowTo.
[sb1_howto]
All parameters are optional:
| Parameter | Default | Description |
|---|---|---|
count |
-1 |
Number of HowTos to show (-1 = all) |
tag |
(all) | Filter by WordPress tag slug or ID (comma-separated for multiple) |
orderby |
menu_order |
WP_Query orderby value |
order |
ASC |
ASC or DESC |
Examples:
[sb1_howto]
[sb1_howto tag="smart-thermostats"]
[sb1_howto tag="hvac,installation" count="3" orderby="date" order="DESC"]
$howtos = new WP_Query([
'post_type' => 'howto',
'posts_per_page' => -1,
'orderby' => 'menu_order',
'order' => 'ASC',
]);
while ( $howtos->have_posts() ) : $howtos->the_post();
$description = get_post_meta( get_the_ID(), '_sb1_howto_description', true );
$total_time = get_post_meta( get_the_ID(), '_sb1_howto_total_time', true ); // ISO 8601, e.g. PT30M
$supplies = get_post_meta( get_the_ID(), '_sb1_howto_supplies', true ); // newline-delimited string
$steps = get_post_meta( get_the_ID(), '_sb1_howto_steps', true ); // array of ['name','text','image','url']
endwhile;
wp_reset_postdata();{theme}/sb1-faq/howto-list.php
Output any stored business field.
[sbo_field name="one_business_name"]
[sbo_field name="one_business_phone" default="Call us"]
[sbo_field name="one_google_map_embed" raw="true"]
Output a field value as an escaped URL.
[sbo_url name="one_home_url"]
[sbo_link name="one_home_url"]Visit our website[/sbo_link]
[sbo_social_facebook]
[sbo_social_linkedin width="32" height="32"]
Social icon shortcodes render nothing if the corresponding URL field is empty.