Skip to main content

Replace the Placeholder Text in a SiteOrigin Layout with AI

Swap a prebuilt layout's Lorem ipsum, sample headings and empty button links for your own copy, with the design left as it is.

Difficulty Beginner
Time ~10 min

Prerequisites

A site connected to WPVibe running Page Builder by SiteOrigin 2.38.0 or newer (tested on 2.38.0, free, with SiteOrigin Widgets Bundle 1.75.0) on WordPress 6.9 or newer, with an administrator account. Pages of up to 11 widgets, with no embed code pasted into a widget.

The prompt
My WordPress site uses Page Builder by SiteOrigin. My page [page title] was built from a prebuilt layout and still has its sample text. Replace the placeholder text with copy for my business. About my business: [name, what you do and for whom, where, phone, email, opening hours, and three to six services with one line each]. Button links: [where each button should go, for example Contact Us to my contact page].

1. Run rest_api GET /wp/v2/plugins with search siteorigin and find Page Builder by SiteOrigin (plugin siteorigin-panels). If it is not installed, tell me this recipe is for Page Builder by SiteOrigin, and stop. If it is not active, tell me to activate it, and stop. If its version is lower than 2.38.0 (compare the numbers part by part: 2.38.0 is newer than 2.9.0), tell me to update it first, and stop: older versions lack fixes these steps rely on. If the plugin list is refused (some multisite setups), ask me which version I have. Then run get_ability_info for siteorigin-panels/layout-get; if it is not found, tell me this recipe needs WordPress 6.9 or newer, and stop.
2. Find the page with rest_api GET /wp/v2/pages, search set to the title and status publish,draft,pending,private,future, with _fields id,title,status,link. If more than one matches, ask me which. PAGE_ID is its id and SITE_URL my site address. With POST_ID set to that page's id, read its layout with rest_api GET /siteorigin-panels/v1/layouts/POST_ID and max_length 100000 (Page Builder's own read-only route: it returns the same as siteorigin-panels/layout-get, which WPVibe cuts off at 50,000 characters on larger pages). If the result is cut off, stop and tell me the page is too large for this recipe. If source is none, this recipe cannot reach the page: it is not built with Page Builder, or its Layout Block sits inside another block. Tell me and stop, because writing a layout to it would replace its content. If the page has more than one layout (source mixed, or several Layout Blocks), list them with their first heading and ask me which one. LAYOUT is the panels_data object inside the chosen entry of layouts (widgets, grids and grid_cells are at its top level), and BLOCK_INDEX is that entry's block_index (null for the classic layout). Keep LAYOUT exactly as it came back: it is the before copy. Note the page's modified time (rest_api GET /wp/v2/pages/POST_ID with _fields modified). Count the widgets in LAYOUT, including widgets inside a Layout Builder widget. If there are more than 11, stop and tell me the page is too large for this recipe: every change sends the whole layout back, and it was tested on pages up to 11 widgets. Search the text values in LAYOUT for HTML tags, meaning a tag name right after an opening angle bracket inside a text value: iframe, script, style, form, input, select, svg, object, embed, canvas, noscript, source, picture, link, meta, template or param tags; also attributes inside such text that start with on (such as onclick), and links or images that start with javascript: or data:. Setting names (style, _sow_form_id, multiple_select, description) and contact form field types are not tags. If any are there, list each with its widget and stop: when an AI saves a Page Builder layout, WordPress removes all of these from every widget on the page, changed or not, so embedded videos, maps, booking widgets and custom code would disappear. Tell me to make this change in the editor instead.
3. List every placeholder in LAYOUT: Lorem ipsum and other filler, sample headings, names, testimonials, statistics, addresses, phone numbers and hours from the layout, and every button or link with an empty link or #. Look in every text field of every widget: text, title, headline and sub headline, button text and link, icon titles, image alt text and testimonial names, including lists inside a widget such as features, frames, testimonials and buttons, and layouts nested inside a Layout Builder widget. Leave contact form settings (recipient, sender and the field labels) alone. Skip design settings. Look up where my media library lives: rest_api GET /wp/v2/media with per_page 1 and _fields source_url; images on that host are mine, even on a storage or CDN address. List images that load from any other site (prebuilt layouts load theirs from layouts.siteorigin.com and demo.siteorigin.com), in widgets and in row backgrounds (the style of each entry in grids), by widget or row label, for me to replace in the editor.
4. Write new text for each placeholder from my details, close to the length of the text it replaces, inside the same heading or paragraph tags (a level-one heading stays a level-one heading). Never make up facts I did not give: testimonials, reviews, names, prices, awards, statistics and counts, years in business, addresses, phone numbers or hours. Where a slot needs facts I did not give (a testimonial, a statistic, a team member, a price), leave it as it is and list it for me. In a Google Maps widget, an address change goes in map_center: set address and name to the new address and set location to an empty string, because the map uses the stored coordinates before the address. If the old address is also in its markers or directions, list those for me to change in the editor. For each button link, check the page exists (rest_api GET /wp/v2/pages with search) and use its link; if it does not exist, ask me. Show me a table with the widget, the field, the text before (first 60 characters) and after, and wait for my yes.
5. If the page is not published, TARGET_ID is PAGE_ID: go to step 6. If it is published, ask me whether to work on a draft copy first (recommended) or change the live page; for the live page, TARGET_ID is PAGE_ID: go to step 6. For a draft copy (reuse COPY_ID if you already made one in this chat): rest_api GET /wp/v2/pages/PAGE_ID with _fields template, then rest_api_write POST /wp/v2/pages with title [page title] draft copy, status draft and that template. COPY_ID is its id. Write to it as step 6 says with TARGET_ID set to COPY_ID, without block_index and without the close check (the copy is new), then check it as step 7 says and give me the preview link SITE_URL/?page_id=COPY_ID&preview=true (it opens while I am logged in). When I say apply it: set TARGET_ID to PAGE_ID, do the close check in step 6, then send the same panels_data you sent to the copy, with BLOCK_INDEX when it is a number, and check it as step 7 says. Only after that, move the copy to the trash with rest_api_write DELETE /wp/v2/pages/COPY_ID. If I decide not to apply it, or say undo before it is applied, move the copy to the trash the same way.
6. Before you write to a page that already exists, ask me to close it if it is open in Page Builder or the WordPress editor, and wait for my yes: an editor left open saves its own copy of the layout over yours when someone clicks Update. Then read the page's modified time again; if it changed since you noted it, someone saved the page: read the layout again and start over from the table. Write with siteorigin-panels/layout-update: post_id TARGET_ID, panels_data set to LAYOUT with only the fields named above changed, and block_index BLOCK_INDEX when it is a number. panels_data is that object alone, never the whole response from the read. Before you send it, check it has the same number of widgets, grids and grid_cells as LAYOUT (fewer widgets only where I agreed to leave something out); if not, stop. Keep every panels_info value and every setting you are not changing. Keep shortcodes such as [buttons] where they are in the text, and use only plain formatting (paragraphs, headings, bold, italic, lists, links). If it answers updated false, nothing was saved: tell me its message and stop. If its message is Layout cleared, the layout was deleted: send LAYOUT back at once the same way and tell me.
7. Read the layout of TARGET_ID again the same way and confirm each change is there and the numbers of widgets and rows are as sent. Some settings come back in a slightly different form (1.3 becoming 1.3em, 85.0 becoming 85) because Page Builder re-saves every widget on the page, as an editor save does; that is expected. If the page is published, fetch it with get_page_html (selector #pl-TARGET_ID for a classic layout; for a Layout Block, the whole page). If the layout shows the change but the page does not, a page cache is serving the old copy: tell me to clear it, and do not write again. Note the page's modified time again after each write. Also check no Lorem ipsum is left outside the slots waiting on me. List each change, the slots still waiting on me and the images to replace.
8. If I say undo, first ask me to close the page in the editor and read its modified time; if it changed since your last write, someone edited the page after it: tell me and stop. Otherwise send the before copy (LAYOUT as you first read it) back with layout-update, with the same post_id and BLOCK_INDEX you wrote with. Tell me to undo in this chat, not from the page's Revisions screen: a revision saved by an AI change holds no Page Builder layout, and restoring it removes the layout from the page.
Already connected?

Skip pasting the full prompt. Drop this into your AI on a site that already has WPVibe:

Run the “Replace the Placeholder Text in a SiteOrigin Layout with AI” recipe from the WPVibe cookbook on my connected site.

Page Builder’s prebuilt layouts look finished, but they arrive full of Lorem ipsum, sample headings, made-up testimonials and statistics, and buttons that link nowhere. Swapping them out means opening every widget’s settings one at a time, and a stray sample line is easy to miss until a visitor finds it.

The AI reads the page’s layout, lists every piece of placeholder text and every empty button link, and writes your copy from your details into the same widgets, at the same length and in the same headings. Your rows, colors and settings stay as they are. You see a before and after table and say yes before anything is saved, and on a published page it works on a draft copy first unless you say otherwise.

Give it the facts: what you do, who for, where, how to reach you and the services you offer. It never invents testimonials, statistics or names; slots you have no facts for are listed for you to fill or remove in the editor, and so are sample images. It works on pages of up to 11 widgets, and stops on pages with embed code pasted into a widget (iframes, scripts, forms), because an AI save would remove it; map and video widgets are fine. Undo in the same chat if you change your mind.

Outcome

Your page with your own words and working button links in place of the layout's sample content, design unchanged.