Update Contact Details on a SiteOrigin Page with AI
Find every place an old phone number, email, address or opening hours appear on a Page Builder page, check them with you, and change only those.
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.
My WordPress site uses Page Builder by SiteOrigin. On my page [page title, or a short list of pages], change [the old detail, for example our phone number 843-555-0100] to [the new detail]. [Also change: any other old and new details.] 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. Then do steps 2 to 6 for one page at a time, each with its own table and my yes. 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. TARGET_ID is its id. With POST_ID set to TARGET_ID, 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. Find every place each old detail appears in LAYOUT, in the ways people write it: for a phone number, with or without spaces, dashes, dots, brackets or a country code, and in tel: links; for an email, in mailto: links too; for an address, with street words written short or long (St or Street); for hours, the same days and times written another way (9am, 9 am, 9:00). 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. 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. If the old detail is a contact form\'s recipient or sender address, list it for me to change in the editor, and leave it out of the write and of the check in step 5. Show me a table with the widget, the field and the text around each match before and after, and list anything close that you did not count as a match. Wait for my yes. 4. 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. 5. 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. Check the old detail no longer appears in the layout in any of the ways you searched for (anything in the site header, footer or menus is not part of this page's layout: report it separately). 6. 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.
Skip pasting the full prompt. Drop this into your AI on a site that already has WPVibe:
Run the “Update Contact Details on a SiteOrigin Page with AI” recipe from the WPVibe cookbook on my connected site.
A new phone number, a new address or new opening hours means hunting through a Page Builder page for every place the old one appears: the hero, a feature box, a headline, the map, a button that dials the number. Miss one and visitors call the old line.
The AI reads the page’s layout and looks for the old detail in the ways people write it (555-0100, (843) 555-0100, a tel: link), shows you every match and anything close that it left alone, and after your yes changes only those. Rows, widgets and design settings stay as they were, and it reads the page back to confirm each change.
It works on the pages you name, one at a time, each with its own yes, never across the whole site in one go. Close the page in the editor before you run it. 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 needed.
Outcome
The page shows the new details everywhere the old ones were found, with nothing else changed.