Make a New SiteOrigin Page from One You Already Have with AI
Copy a Page Builder page's design into a new draft and fill it with new text from a short brief.
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. Make a new page called [new page title] that uses the design of my page [existing page title], with new text for [what the new page is about: the service, location or offer, who it is for, and the facts to use]. Button links: [where each button should go]. Save it as a draft; do not publish it. 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. SOURCE_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). Do not change this page at any point. 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: they will not come across to the new page, because WordPress removes them from every widget when an AI saves a layout. Ask me whether to go on without them. 3. Rewrite every piece of text in LAYOUT for the new page. 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. Keep each one close to its old length and inside the same heading or paragraph tags. 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), keep the original's text out of the new page: list the slot and ask me for its text or whether to leave it out. 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 original text (first 60 characters) and the new text, and wait for my yes. If I say to leave something out, remove that item from its list inside the widget (a feature, a testimonial), or the whole widget from the widgets list; never remove a row. If that leaves a row with no widgets, tell me: it shows as an empty band until I delete the row in the editor. 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, in widgets and row backgrounds, for me to replace. 4. rest_api GET /wp/v2/pages/SOURCE_ID with _fields template, then rest_api_write POST /wp/v2/pages with title [new page title], status draft and that template. TARGET_ID is its id. 5. Write with siteorigin-panels/layout-update: post_id TARGET_ID, panels_data set to LAYOUT with only the fields named above changed. Send no block_index: the new page gets a classic layout. 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. 6. 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. Then compare the new layout with the original: no text from the original may remain in any text field, icon titles included, except what I agreed to keep (short generic labels such as Contact Us are fine). 7. Give me the preview link SITE_URL/?page_id=TARGET_ID&preview=true (it opens while I am logged in), list the slots still waiting on me, and tell me that the featured image and the theme's own page settings (such as a hidden title or sidebar) were not copied. Publish only when I say so, with rest_api_write POST /wp/v2/pages/TARGET_ID and status publish.
Skip pasting the full prompt. Drop this into your AI on a site that already has WPVibe:
Run the “Make a New SiteOrigin Page from One You Already Have with AI” recipe from the WPVibe cookbook on my connected site.
You have a Page Builder page that works, a service page or a location page, and you need another one like it. Cloning it in the editor gives you the design, then you retype every heading, feature and button by hand and hope you caught every leftover line from the original.
The AI copies the layout of the page you name into a new draft with the same page template, and rewrites its text from your brief: same rows, widgets and design, new words and links. It shows you the new text first, saves the new page as a draft and gives you the preview link.
Nothing is published until you say so, and the original page is never touched. Give it the facts for the new page; anything it has no facts for, such as testimonials or statistics, it lists for you rather than making up. It works from pages of up to 11 widgets. Embed code pasted into a widget (iframes, scripts, forms) does not come across, and neither do the featured image and the theme’s page settings; it tells you which.
Outcome
A new draft page with the original's design and your new text, ready to preview and publish.