Tag: WordPress Schema

  • Job Posting Schema for Restoration Shops: How Google Reads a Vacancy

    Job Posting Schema for Restoration Shops: How Google Reads a Vacancy

    Last verified: October 2, 2026 against Google’s Job posting structured data (docs last updated September 8, 2026) and AIOSEO’s 4.9.9 announcement.

    Direct answer: JobPosting schema is structured data that labels a single open role — title, employer, work location, description, posted date — so Google can treat the page as a vacancy instead of a brochure. Done correctly, the listing becomes eligible for Google for Jobs. Eligibility is not placement. Google still decides. The markup must match what a candidate can read on the page.

    Tech documenting a water loss on a tablet
    A careers page on your domain is the object Google can attach JobPosting schema to. The board is optional.

    Trigger for this desk: All in One SEO emailed Tygart Media on September 25, 2026 that Job Posting schema (and Event schema) now ships on every paid AIOSEO plan starting with Basic, as of AIOSEO 4.9.9. That is a product-access change, not a ranking promise. tygartmedia.com runs Rank Math. The schema type is the same either way. The plugin is a generator. Google’s Job posting structured data spec (docs last updated September 8, 2026) is the rulebook.

    Why a restoration shop should care

    Related: Schema Markup for AI Search: The New Meta Description · Your Google Profile Is Your New Front Door

    Most restoration companies hire the way they market: on someone else’s board. Indeed, Facebook, a text to a former tech. That works until storm season, and then the shop needs a water tech in Everett, a project manager in Lynnwood, or an estimator who already knows Snohomish County adjusters. If the only public copy of the role lives on a job board, Google indexes the board. Your domain does not own the vacancy.

    A careers page on your site is the durable object. JobPosting schema is the label on that object. Answer engines and Google for Jobs both prefer a page that states the role in plain sentences and then repeats the same facts in JSON-LD. That is AEO and GEO in one hang: the page answers “who is hiring water mitigation technicians in Everett, WA,” and the markup gives the city, employer, and dates without forcing the model to guess.

    What Google requires

    Google’s required JobPosting properties, from Search Central:

    • title — the job title only. “Water Mitigation Technician,” not “Water Mitigation Technician — $28/hr — Everett — Apply Now!!!”
    • description — the full description in HTML. Duties, qualifications, hours, education, experience. A teaser fails.
    • hiringOrganization — the company, not the branch nickname. Name plus a sameAs URL to the official site.
    • jobLocation — where the person reports. PostalAddress with addressCountry. For a 100% remote role, use jobLocationType TELECOMMUTE plus applicantLocationRequirements instead.
    • datePosted — original post date in ISO 8601. Do not refresh it to fake newness.

    Recommended properties that matter for a restoration hire: validThrough (when the listing dies), employmentType (FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, PER_DIEM), baseSalary as a MonetaryAmount with currency and unit (HOUR / YEAR), and identifier so you do not duplicate the same role across reprints.

    AIOSEO’s walkthrough (updated August 21, 2026) maps those fields into a Schema Generator: title, description, employment type, location, hiring organization, salary, requirements, publish date, expiration date. Rank Math exposes the same JobPosting type. Fill the fields from the visible page. Do not invent a salary in schema that is missing on the page.

    GEO: mark the city the truck leaves from

    Local service hiring is geographic. A candidate searching “water damage technician jobs Everett WA” or “IICRC tech hiring Lynnwood” is not looking at a national career hub. Put the reporting city in the visible copy and in jobLocation.addressLocality / addressRegion / postalCode / addressCountry.

    Worked example for a shop that stages out of Everett and runs the Lynnwood–Mukilteo–Mill Creek pack:

    • Title on the page and in schema: Water Mitigation Technician
    • hiringOrganization.name: the legal company name, not “Everett Crew”
    • jobLocation: Everett, WA, United States, with the real street if that is where they report
    • description: names the pack — Everett, Lynnwood, Mukilteo, Mill Creek — as service area, not as four fake job locations
    • employmentType: FULL_TIME or PER_DIEM, whichever is true
    • validThrough: a real close date, then take the page down or set the date in the past when the seat is filled

    Do not stamp four JobPosting graphs on one page for four cities unless there are four distinct open seats. Google wants one job per leaf URL. A list page of “all openings” is the wrong surface.

    AEO: write the vacancy so an engine can quote it

    Schema does not rescue thin copy. Open the careers page with the answer a model can lift:

    We are hiring a full-time water mitigation technician based in Everett, Washington. The role reports to our Everett shop and runs losses across Snohomish County. Pay is listed on this page. Apply on this page.

    Then the body: first-day duties, IICRC or in-house training, on-call expectations, what “storm mode” means, whether the truck is assigned. That paragraph is the description field. If ChatGPT or Gemini is asked “who is hiring restoration technicians near Everett,” the engine needs a quotable sentence plus an organization it can attach to a maps entity. JobPosting is the attachment point. The sentence still has to exist in public HTML.

    How to hang it in WordPress

    1. Create one WordPress post or page per open seat. Slug like /careers/water-mitigation-technician-everett/.
    2. Write the full vacancy on the page first. Salary, city, dates, how to apply.
    3. In Rank Math (this site) or AIOSEO Schema Generator (if that is the client stack), add schema type JobPosting. Map every field to visible text.
    4. Validate with Google’s Rich Results Test. Fix errors before you call it done.
    5. When the seat fills: set validThrough to a past date, or 404/410 the URL. Do not leave a live JobPosting on a closed role.

    AIOSEO 4.9.9 made that generator available on Basic instead of reserving it for higher tiers. If a client already pays for AIOSEO, they do not need an upgrade to mark up jobs. If they are on Rank Math, they already had the type. Do not switch plugins to chase a newsletter.

    What gets a listing dropped

    • Markup on a jobs index that lists many roles
    • Title or salary in schema that the page does not show
    • Expired jobs still marked active
    • No way to apply on the page
    • jobLocation missing addressCountry, or a “remote” job that is not actually remote
    • Keyword stuffing in the title (“#1 BEST WATER TECH JOBS SEATTLE EVERETT TACOMA”)

    Google can issue a manual action for job spam. Fake seats used as lead magnets are not a grey area. If you are not hiring, do not hang JobPosting.

    The line to remember

    A careers page without JobPosting is a flyer. JobPosting without a real, dated, city-true vacancy is spam. Host the seat on your domain, mark the five required fields, expire it when the truck is staffed, and let Google decide whether it belongs in the job experience.

    FAQ

    Q: Does JobPosting schema guarantee a listing in Google for Jobs?
    A: No. It makes a qualifying page eligible. Google still applies content and spam policies. The official spec is explicit on that point.

    Q: We only hire on Indeed. Should we still put jobs on our site?
    A: If you want the vacancy attached to your entity — maps profile, site, AI answers — yes. The board can stay as an apply path. The leaf page on your domain is what you can mark up.

    Q: Can one page cover Everett, Tacoma, and Belfair?
    A: One page can describe a service area. Schema jobLocation should be the report-to city. Separate open seats in separate cities need separate URLs.

    Q: Is this an AIOSEO-only feature?
    A: No. AIOSEO expanded plan access in 4.9.9 (announced July 13, 2026). Rank Math and hand-written JSON-LD can emit the same type. Use the generator you already pay for.

    Q: What if we do not publish pay?
    A: baseSalary is recommended, not required. Do not invent a number in JSON-LD. Leave it out until the page states pay.

  • WordPress Schema Injection Sprint: JSON-LD for 20 Posts

    WordPress Schema Injection Sprint: JSON-LD for 20 Posts

    Tygart Media / Content Strategy
    The Practitioner JournalField Notes
    By Will Tygart
    · Practitioner-grade
    · From the workbench

    What Is a Schema Injection Sprint?
    A schema injection sprint is a concentrated pass across 20 WordPress posts — identifying the right JSON-LD structured data types for each post, generating valid schema markup, injecting it via WordPress REST API, and validating every post with Google’s Rich Results Test. In one sprint, 20 posts become eligible for rich result placements they weren’t eligible for before.

    Schema markup is one of the highest-leverage, most consistently skipped SEO tasks on WordPress sites. It’s not that operators don’t know it matters — it’s that doing it right on 20 posts manually takes hours, and most schema plugins produce bloated or invalid output that fails the Rich Results Test anyway.

    We inject schema programmatically. Every post gets the right schema type for its content — not a one-size-fits-all Article block — and every result is validated before we move on.

    Who This Is For

    WordPress sites with existing published content that aren’t appearing in rich result placements (FAQ accordions, HowTo steps, review stars) despite having the content to qualify. If your posts have FAQ sections but no FAQPage schema, you’re invisible to the placement Google is actively filling.

    Schema Types We Inject

    • FAQPage — For any post with a Q&A section. Produces FAQ accordion in Google results.
    • Article — Standard news/blog schema with author, publisher, datePublished, dateModified.
    • HowTo — For step-by-step content. Produces visual step display in rich results.
    • Service — For service landing pages. Signals service type, provider, and area served.
    • LocalBusiness — For location-specific content. Reinforces NAP data and service area.
    • BreadcrumbList — Site navigation schema. Applied to all posts in the sprint.
    • Speakable — Marks key paragraphs for voice search and AI synthesis.

    What We Deliver

    Item Included
    Schema type selection for all 20 posts ✅
    JSON-LD generation (valid, not plugin-bloated) ✅
    REST API injection to all 20 posts ✅
    Google Rich Results Test validation on every post ✅
    Validation report with pass/fail per post ✅
    Fix pass for any validation failures ✅

    Ready to Make Your Content Rich-Result Eligible?

    Share your site URL and we’ll identify your 20 best candidates for schema injection based on content type and current ranking proximity.

    → will@tygartmedia.com

    Email only. No sales call required.

    Frequently Asked Questions

    Will this conflict with my existing SEO plugin (Yoast, RankMath)?

    We inject schema as a separate JSON-LD block in the post content — it doesn’t touch plugin settings or plugin-generated schema. In most cases, the two coexist cleanly. If there’s duplication, we identify and resolve it during the validation pass.

    How quickly will rich results appear after injection?

    Google typically processes schema changes within 2–4 weeks for established sites. Rich result eligibility appears in Google Search Console after the next crawl cycle.

    Can you do more than 20 posts?

    Yes. We can run additional sprints of 20 posts or scope a full-site schema pass. Contact us with your post count and we’ll quote accordingly.


    Last updated: April 2026