Skip to content

ACF, Contact Form 7, WooCommerce, Rank Math: your plugin data after moving to Laravel ​

Moving posts and pages out of WordPress is a solved problem. What makes a real site hard to move is everything its plugins wrote: field groups and repeaters, form definitions and years of submissions, products with variations and orders in their own tables, SEO titles and redirect rules.

kitloom's approach is that a plugin's data is the module's data model. A module that replaces a plugin reads the plugin's tables, options and meta keys as the plugin left them, and writes them back in the same places. Nothing is imported, so nothing is lost in an importer.

Custom fields: ACF and Secure Custom Fields ​

kitloom/custom-fields reads ACF's field groups and fields as they are stored, as acf-field-group and acf-field posts, with their location rules. Values stay under the field's meta key with ACF's _{name} reference beside it, and options pages stay options_{name}. All of ACF's field types are covered, repeaters and flexible content included.

In code a value is $post->field('price'), and a theme gets the fields with the record. Post types and taxonomies made with ACF come along too, through kitloom/post-types, so their archives and single pages answer at the same addresses.

Forms: Contact Form 7 and Flamingo ​

kitloom/forms reads each Contact Form 7 form from its wpcf7_contact_form post: the form markup, both mails, the messages and the additional settings. A [contact-form-7 id="…"] shortcode in a page keeps working. Messages Flamingo kept are there as before, filed under the form they came from, and new ones are added the same way. Spam protection (a honeypot and Cloudflare Turnstile) is built in.

The shop: WooCommerce ​

kitloom/shop reads WooCommerce's products (simple and variable, with their categories, tags, attributes, prices, SKUs and stock) and its orders from the HPOS tables (wc_orders, wc_order_addresses, woocommerce_order_items and the rest), plus the woocommerce_* settings. A customer signs in with their password and sees their order history. The cart, checkout and My account are drawn by the theme from the shop's own parts.

We compare it with a real WooCommerce store on the same data: a suite of scenarios (coupons, taxes, shipping, stock) runs the same steps on a WooCommerce store and on kitloom over the same data and compares the totals.

SEO and redirects: Rank Math ​

kitloom/seo works on Rank Math's options and meta: title and description templates with their %title% %sep% %sitename% variables, each record's own title, description, robots and canonical, the primary category, breadcrumbs, sitemap settings and the verification codes. kitloom/redirects uses Rank Math's own redirection and 404-log tables, so every rule the site had keeps redirecting. How that keeps rankings intact is in a post of its own.

And the rest ​

  • Menus, widgets, page templates, synced patterns: WordPress's own storage, read by the core.
  • Slide Anything sliders, with their shortcodes: kitloom/slider.
  • Nextend Social Login: linked Google and GitHub accounts, kitloom/social-accounts.
  • Rank Math's link counter: kitloom/internal-links.
  • Analytics, tag manager, ad pixels, cookie consent (Site Kit, MonsterInsights, GTM4WP, PixelYourSite, Complianz, CookieYes and others): an Import button on the module's settings page takes their settings once.

The complete table, with every option and meta key, is on WordPress Compatibility.

Each module comes with tools for an AI agent ​

The plugins' data is not only kept, it can be worked from a chat. Every module above gives kitloom's MCP server tools of its own: custom fields (fields_get, fields_set), forms and their messages, the shop's products, orders, coupons and sales reports, SEO meta, redirects and the 404 log, sliders, menus and widgets. Claude, Cursor or your own agent uses them with the rights of the user whose key it holds, and every change is in the activity log. See Run your site from Claude or Cursor.

What a module does not cover ​

Honesty matters more here than anywhere:

  • A plugin without a module keeps only its data. Its tables stay in the database, its shortcodes reach the page as text. The comparison script lists every page where that happens, so you know before the switch.
  • Yoast SEO and the Redirection plugin are imported, not read in place. Rank Math's data is read as it is. Yoast's titles, descriptions, robots, canonicals and social meta, and Redirection's rules with their hits, are taken once into Rank Math's keys and tables, with a button in the admin or php artisan seo:import --from=yoast and php artisan redirects:import. The report names what had no place to go: Yoast's scores and Premium redirects, Redirection rules that ask more than the address.
  • Plugin code does not run. The data is read by kitloom's own code, rewritten from the data model, not copied from the plugin.

When a plugin you depend on has no module, you can write one: WordPress Compatibility shows how to study what the plugin stores, keep its tables and keys, read both serialized and JSON values, and test against rows exactly as the plugin wrote them. php artisan kitloom:make-module gives you the package, both admins and the tests to start from.

Last updated:

kitloom — modules and themes for Laravel.
Pricing · Services · License · Refunds · Privacy · Community · [email protected]