1. Home
  2. Blog
  3. Search Engine Optimization (SEO)

Mark Up WordPress Local Business Hours and Locations for Local SEO

A customer Googles your clinic name plus “hours.” The Knowledge Panel shows yesterday’s schedule, or no hours at all. Your Contact page has the right times in a nice table. Google never saw them as structured data. Multi-location brands have it worse: one NAP block in the footer, three real addresses, and schema that pretends there is only a headquarters.

Local SEO is not another title tag. It is machine-readable identity: who you are, where you are, when you are open, and how those entities connect to the rest of the site graph. Rankify Pro’s Local SEO ships LocalBusiness, opening hours, and multiple locations for that job.

Rankify is the DaftPlug SEO plugin. This post stays on Local SEO only: LocalBusiness, opening hours, and multiple locations (Pro). Not title templates, not OG or X cards, not AI crawler control, not the 404 monitor, not content analysis grades, not llms.txt, not auto-redirect on slug change, not FAQ answer blocks, not IndexNow as the main story. Product schema is a different surface. For how Organization, WebSite, and WebPage sit in one connected @graph, keep WordPress connected schema graph (Organization and WebPage) nearby and treat the wider graph as the foundation Local SEO should extend.

What Rankify actually ships here

Stay inside the real feature set:

  • Local SEO (Pro): LocalBusiness, opening hours, and multiple locations
  • Local entity markup that can sit with Rankify’s broader schema story instead of a pasted orphan JSON-LD blob
  • Brief adjacent note OK: Product schema is another Rankify surface (live store data), not the hero of this post

This post does not invent automatic Google Business Profile syncing Rankify does not publish, review-star widgets as Local SEO, undocumented “local pack rank guarantees,” or a claim that schema alone ranks you for “plumber near me.” LocalBusiness, opening hours, and multiple locations are the product promise. Stay there. Titles, social cards, AI crawlers, 404 logs, content grades, llms.txt, slug auto-redirects, FAQ blocks, and IndexNow are parallel tools, not this article’s job.

Why LocalBusiness markup beats a pretty hours table

Humans read your Contact page. Crawlers prefer explicit types. LocalBusiness (and subtypes) tell Google you are a real-world business with an address and a category, not only a blog that happens to mention a city.

Opening hours belong in the entity. Hours in a paragraph that changes every holiday without a markup update are how Knowledge Panels go stale. Structured hours you update in one Rankify screen beat three page-builder modules edited by whoever remembered.

Multiple locations need multiple entities. If you run three studios, schema should not invent a fourth fictional HQ or hide two of them. One mashed NAP string in the footer is not a multi-location graph.

A connected graph matters. Local markup that cannot point at your Organization is easier to ignore or mis-merge. Rankify’s wider schema story is one connected @graph. Local SEO should extend that world, not fight a blank Organization node. Use the related schema graph guide to sanity-check the foundation first.

Hours drift is a trust killer. Nothing erodes local pack confidence like “Open now” when the door is locked. Markup that lies is worse than no markup.

Agencies feel this on client handoffs. The designer updated the hours module. Nobody touched schema. Six months later the client blames “SEO” because Google still shows Saturday mornings they no longer staff. Rankify’s Local SEO screen is the place that update should have happened once.

How to set Local SEO up in wp-admin

Assume Rankify is installed. Local SEO is a Pro feature. Run one SEO plugin at a time so you do not emit duplicate LocalBusiness graphs.

1. Confirm the sitewide Organization graph is sane

Open Rankify’s schema / organization settings first. Set legal name, logo, sameAs profiles, and primary URL the way they appear on Google Business Profile. LocalBusiness should extend a coherent organization story, not fight a blank or wrong Organization node. If you migrated from another SEO plugin, still verify Organization visually in the graph output. The related connected schema graph post is the deeper walkthrough.

2. Open Rankify Local SEO (Pro)

In wp-admin, open Rankify. Find Local SEO controls for LocalBusiness, opening hours, and multiple locations. You should be filling business fields, not pasting raw JSON into a theme file. Leave title templates, social cards, AI crawler lists, 404 monitor, content grades, llms.txt, slug auto-redirects, FAQ blocks, and IndexNow alone until this path is verified.

3. Define each location as real data

For every location enter:

  1. Name as customers know it (not only the corporate entity string)
  2. Street address, locality, region, postal code, country
  3. Phone in a consistent format
  4. Correct LocalBusiness subtype when it matters (as Rankify exposes)
  5. Map or URL fields if the UI offers them and they match GBP

For a single-location business, one complete entity beats three half-filled ones. For multi-location, add each site you want eligible for local visibility. Do not invent locations you cannot staff.

4. Set opening hours you will actually maintain

Enter weekly opening hours in Rankify. Match Google Business Profile. When you close for a holiday, update Rankify the same day you update GBP. Write the ownership rule in the runbook: who updates hours in Rankify when the front desk changes Saturday staffing.

5. Smoke-test the JSON-LD output

  1. Open a public page that should expose local entity data.
  2. View source or use a structured data tester and confirm LocalBusiness (or the subtype you set) appears with address and hours.
  3. Confirm multiple locations do not collapse into one wrong address.
  4. Confirm you are not outputting a second LocalBusiness graph from another SEO plugin.
  5. Spot-check that Organization references still make sense with the wider graph.
  6. Compare hours and NAP against GBP character for character.

If markup is missing, confirm Local SEO (Pro) is actually enabled, confirm you are on a URL the feature applies to, and confirm a conflicting SEO plugin is not stripping or overriding the graph. Do not invent undocumented Rankify “push to GBP” buttons that are not on the product page.

6. Document the enablement for the next teammate

Write one line in your internal runbook: “Rankify Local SEO (Pro) configured on [date]. Locations: [list]. Hours owner: [role]. Organization graph verified. Product schema and redirects are separate. Re-test after address or holiday changes.” Local schema gets blamed when GBP changes and nobody updates Rankify.

Who this is for

Local service businesses (clinics, studios, agencies with a real office) whose hours and address must match search surfaces.

Multi-location brands that need each site represented, not one headquarters fiction.

WooCommerce stores with pickup or showrooms where LocalBusiness and store schema are different jobs (keep product schema as a sibling).

Franchise and multi-city WordPress sites that cannot maintain hours in three page-builder modules forever.

Agencies handing off SEO to clients who will change Saturday hours without touching JSON-LD by hand.

This is less urgent for pure online brands with no address, or for blogs that never want a local pack. Even then, if you later add a meetup space or pickup desk, Local SEO is the clean place to add it.

What good looks like

  • LocalBusiness (or the right subtype) appears with accurate NAP and opening hours.
  • Multiple locations are each represented without inventing staff you do not have.
  • Hours match Google Business Profile on ordinary weeks and get updated on holidays.
  • Local SEO is configured without requiring title template redesigns, crawler rules, or redirect work in the same hour.
  • The wider Organization graph remains coherent (see the related schema graph guide).
  • You did not invent GBP sync buttons or claim schema alone ranks local pack results.
  • Support stops getting “Google shows the wrong hours” for the locations you maintain in Rankify.

If rich results never reflect a change, remember schema is not instant and GBP still matters. Confirm your markup is correct first, then give crawlers time, and keep GBP as the other source of truth you update in parallel.

Pitfalls (the ones that bite)

Pretty hours tables without structured data. Humans see the update. Crawlers may not.

One NAP string for three locations. Multi-location needs multiple entities, not a footer mashup.

Duplicate LocalBusiness from a second SEO plugin. One graph. Disable the conflict.

Lying hours. Stale “Open now” destroys trust faster than missing markup.

Skipping Organization sanity checks. Local entities that cannot sit in a coherent graph are easier to mis-merge.

Enabling every Rankify toggle with Local SEO. If local markup, title templates, and crawler rules all land together, you cannot tell which change moved Search Console noise. Enable Local SEO, verify, then add the next piece.

Forgetting holiday updates. The runbook needs an owner, not a hope.

Expecting Local SEO to replace product schema. Store product markup is a sibling Rankify surface. Keep it separate.

Practical checklist before you call it done

  1. Confirm Rankify Pro is installed and only one SEO plugin emits schema.
  2. Sanity-check Organization, logo, and sameAs in the connected graph.
  3. In Rankify, open Local SEO (Pro) only for this pass.
  4. Leave titles, social cards, AI crawlers, 404 monitor, content grades, llms.txt, slug auto-redirects, FAQ blocks, and IndexNow alone if they are not already stable.
  5. Enter each real location with consistent NAP and phone.
  6. Enter weekly opening hours that match GBP.
  7. Validate LocalBusiness JSON-LD on a public URL.
  8. Confirm no duplicate local graph from another plugin.
  9. Assign a human owner for holiday and hours updates.
  10. Re-test after address changes or GBP edits.
  11. Write the enablement date and location list in the team runbook.
  12. Only then consider other Rankify schema surfaces such as product markup.

Takeaway

People search for hours and locations. Contact tables that never become structured data leave Knowledge Panels guessing. Rankify Pro’s Local SEO marks up LocalBusiness, opening hours, and multiple locations so local identity can sit in a machine-readable graph. It is not title templates, not AI crawler control, and not a local pack ranking guarantee. It is the quiet schema fix for a very ordinary WordPress local trust failure.

Rankify handles Local SEO alongside the rest of the SEO stack, without asking you to paste orphan JSON-LD into the theme. Configure it once. Keep hours honest. Keep sibling SEO features as separate enablement work. For the Organization and WebPage foundation the local entities should extend, use the related connected schema graph guide when the sitewide graph still needs a sanity check.

One Pro membership unlocks Rankify plus Progressify, Lightify, Generatify, and Snapshotify. New Pro plugins join existing memberships. Plans differ by site count only (Pro $37.99 for 1 site, Pro Plus $74.99 for 5, Pro Max $138.99 for 100), with a 14-day money-back guarantee. See pricing when local hours and locations should be markup, not only a Contact page table.

Turn Local SEO on. Match GBP. When the structured hours match the door, local search finally has something solid to trust.