=== Ultivo Toolkit – Custom Fields, Forms, SEO & Enhancements ===
Contributors: royaar
Tags: custom fields, custom post types, enhancements, repeater, optimizations
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.2
Stable tag: 1.2.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

The WordPress developer toolkit: custom fields, forms, SEO and site utilities in one plugin, without external dependencies.

== Description ==

Every WordPress build starts the same way: a field plugin, a form plugin, an SEO plugin, and a handful of one-trick utilities for the things WordPress does not do. Ultivo Toolkit is those four, in one plugin that shares one interface, one set of conventions and one place to switch things on and off.

Every part is optional. Turn off what you do not need under Ultivo Toolkit → Settings and it registers nothing at all: no menus, no screens, no hooks, no queries. A plugin that does four things is only heavy if all four are running. Nothing you built disappears when you switch one off: the data stays put and comes back the moment you switch the feature on again.

Pro adds Blueprints, Flexible Content and the Clone field, and is available at [wpultimate.org](https://wpultimate.org). Launch offer: 10% off your first year with code `LAUNCH10`, until 30 September 2026.

Nothing is sent to us, ever. Two features do reach an outside service: spam protection, if you turn it on, and the map preview in the admin. Both are described under External services below.

**Custom fields**

Build field groups in a visual builder and attach them to anything with location rules.

* 33 field types: text, textarea, number, range, email, URL, password, phone, WYSIWYG, image, file, gallery, select, checkbox, radio, button group, true/false, link, post object, page link, relationship, taxonomy, user, map, date picker, date & time picker, time picker, color picker, message, tab, accordion, group and repeater
* Location rules with AND/OR groups: post type, page template, individual page, taxonomy, user role, options page or block
* Conditional logic per field, so a field only appears when another has the right value
* Validation rules (minimum and maximum length, or a regex pattern with your own message), enforced both in the browser and on the server
* Register post types, taxonomies and options pages from the admin, with a visual icon picker
* Local JSON: field groups are written to `uploads/ultivo-json/` and also read from `{theme}/ultivo-json/`, so they can travel through version control, with a Sync button when a file is newer than the database

**Forms**

* Drag-and-drop builder with a live canvas: drop a field, see what the visitor will see, or start from a ready-made contact, quote, application or booking form
* Text, email, phone, number, date, select, checkbox, radio, file upload, hidden fields, repeatable groups and free HTML, in one or more columns
* Submissions are stored in WordPress and readable per entry in the admin; a form can send several notifications, so the visitor gets a confirmation and you get the alert
* Send visitors to your own thank-you page after a submission, or keep them on the page with a message
* Spam protection with Google reCAPTCHA v2, reCAPTCHA v3 or Cloudflare Turnstile. Set the keys once, then decide per form
* Optional AJAX submit, so a form in a popup shows its confirmation instead of reloading the page underneath it
* Uploads are stored outside the media library and can only be downloaded by someone who may edit the entry
* Close a form by hand or after a maximum number of submissions, with your own message in its place
* Search your submissions by what people actually typed, and see per submission whether the notification was sent

**SEO**

Enough to launch a site with, and nothing more. No traffic lights, no scores.

* Title and meta description per post, page or archive, with variables such as `%title%` and `%sitename%`, and a live preview of the Google result
* Open Graph and Twitter tags, with an image per post falling back to the featured image and then to a site-wide default
* Canonical URL, noindex, and an XML sitemap that leaves noindexed content out
* Stays out of the way: with Yoast, Rank Math or All in One SEO active, Ultivo Toolkit prints no tags of its own

**Site enhancements**

Seventeen switches for the things you set up on every site: cleanup of the `<head>`, disabling comments, the classic editor, maintenance mode, SVG and AVIF uploads, login branding, duplicating posts, a custom login URL, manual content ordering, disabling components you do not use, limiting login attempts, revisions and Heartbeat, redirects with a 404 log, admin columns, SMTP and a full admin menu organiser. All off by default.

**For developers**

* Template functions: `ultivo_field( 'title' )` for one value (with an optional default), and `ultivo_rows( 'blocks' )` to loop over a repeater or flexible content. A whole flexible field renders in one line: `ultivo_rows( 'blocks' )->render( 'template-parts/blocks' )`
* Coming from ACF, the classic shapes work too: `ultivo_get_field()`, `ultivo_the_field()`, `ultivo_have_rows()`, `ultivo_the_row()`, `ultivo_get_sub_field()`, `ultivo_get_row_layout()`, `ultivo_update_field()`, `ultivo_add_row()`, `ultivo_add_options_page()`
* Field groups in code with `ultivo_add_local_field_group()`, or exported as PHP from the Tools page
* Values are stored in ordinary post meta as `field_name` plus a hidden `_field_name` pointing at the field key; repeater rows as `name_0_subname`. Nothing is serialised into a blob, so `WP_Query`, `get_post_meta()` and SQL all keep working.
* REST API support per field group
* Blocks can be registered in PHP with `ultivo_register_block_type()` and render through a template or callback. Registering is code-only for now, and the block sidebar handles the simple field types (text, number, select, radio, true/false and colour), while the rest is best edited in a field group.

**Coming from ACF?**

Ultivo Toolkit stores values in exactly the pattern ACF uses, and Tools → Migrate from ACF converts your field groups from the database and from the theme's `acf-json` folder. Field keys are preserved, so your existing content keeps working and your templates keep returning the same values. Migration is a feature here, not the point of the plugin. You are not buying a copy of something else.

== Installation ==

1. Upload the `ultivo` folder to `/wp-content/plugins/`, or install the plugin through Plugins → Add New.
2. Activate it through the Plugins menu.
3. A short setup wizard opens once, where you pick the features and enhancements you want. You can change every choice later under Ultivo Toolkit → Settings.

Ultivo Toolkit needs WordPress 6.0 or newer and PHP 8.2 or newer.

== External services ==

This plugin connects to two kinds of outside service, and both are listed in full below. Spam protection runs only when you pick a provider and enter its keys; the map preview runs only in the admin, on posts where you use a Map field. Nothing else leaves your site, and nothing is sent to us.

**Google reCAPTCHA (v2 and v3)**
Used to tell human visitors from bots when you enable it for your forms. On any page that shows a form with reCAPTCHA enabled, the reCAPTCHA script is loaded from Google. When a visitor submits that form, their reCAPTCHA token and IP address are sent to Google for verification.
Terms: https://policies.google.com/terms
Privacy: https://policies.google.com/privacy

**Cloudflare Turnstile**
An alternative to reCAPTCHA with the same purpose. On any page that shows a form with Turnstile enabled, the Turnstile script is loaded from Cloudflare. When a visitor submits that form, their Turnstile token and IP address are sent to Cloudflare for verification.
Terms: https://www.cloudflare.com/website-terms/
Privacy: https://www.cloudflare.com/privacypolicy/

**OpenStreetMap**
Used only by the Map field, and only in the WordPress admin. When you edit a post
that has a Map field, the plugin embeds a map preview from openstreetmap.org in an
iframe, with the coordinates you entered in its URL. Nothing is sent for visitors:
the Map field is not available in forms, so this never runs on your public pages.
Terms: https://osmfoundation.org/wiki/Terms_of_Use
Privacy: https://osmfoundation.org/wiki/Privacy_Policy

== Frequently Asked Questions ==

= Why one plugin instead of four? =

Because four plugins mean four interfaces, four update cycles and four places where something can break when WordPress changes. Ultivo Toolkit shares one set of conventions across fields, forms, SEO and the site utilities, and every part can be switched off if you would rather keep what you already have.

= Will four plugins in one slow my site down? =

Only the parts you switch on do anything. A disabled feature or module is not "loaded but idle": its code is never included, so it registers no hooks, adds no admin screens, enqueues no CSS or JavaScript and runs no queries. A site that only uses custom fields carries the custom fields code and nothing else.

On the front end, the parts that are on stay out of the way too. Field values are ordinary post meta, so reading them is a normal `get_post_meta()` call. The SEO part prints a handful of tags in `<head>`. A form loads its assets while it renders, and only the ones it needs: no form on the page means no CSS and no JavaScript, and a form without a date field does not load the date picker.

= Can I run it alongside my current plugins? =

Yes. Ultivo Toolkit never switches another plugin off. Its SEO part deliberately prints nothing while Yoast, Rank Math or All in One SEO is active, and where a feature overlaps with something you already have, the dashboard says so and lets you decide.

= What is not in the free version? =

Three things live in Pro: Blueprints, Flexible Content and the Clone field. Everything else on this page is in the version you are reading about, without a trial period, a row limit or a feature that stops after thirty days. There are no ads in the admin and nothing nags you to upgrade.

= Am I locked into this plugin? =

No, and that is a deliberate design decision rather than a promise. Values are stored in ordinary post meta as `field_name`, with a hidden `_field_name` recording which field wrote it, and repeater rows as separate keys like `name_0_subname`. Nothing is serialised into one blob, so `WP_Query`, `get_post_meta()` and plain SQL keep working on your content whether this plugin is installed or not. Which meta table is used depends on where the field group appears: post, user, term or options.

= Is it actively maintained? =

Yes. Ultivo Toolkit is developed in the open and the Pro version pays for that work, which is the honest answer to why it will still be here next year. Bugs are fixed in the free version too, not held back for a paid release.

= Can I migrate from ACF? =

Yes. Tools → Migrate from ACF converts field groups from the database and from the theme's `acf-json` folder. Field keys are preserved, so no content has to be migrated with them.

= What happens when I deactivate or delete the plugin? =

Deactivating stops everything immediately. No menus, no hooks, and a custom login URL goes back to `wp-login.php`, while your data stays untouched. Deleting the plugin also leaves your data in the database on purpose, so that reinstalling picks up exactly where you left off. If you want it gone for good, remove it yourself before deleting.

== Screenshots ==

1. The field group builder. Every field carries its name and type, and each one opens into settings for validation, presentation and conditional logic.
2. What your editors get: your fields on the post or page they belong to, grouped into tabs, in the order and layout you defined.
3. The form builder. Drag a field from the palette onto the canvas, and the preview is the same renderer that draws the form on your site.
4. The dashboard: recent submissions, what you edited last, and anything that still needs attention.
5. Site enhancements. Seventeen small modules you would otherwise install separate plugins for, each one off until you switch it on.
6. SEO on every post and page: title and description with a live Google and social preview, a canonical URL, and a switch to keep the page out of search results.

== Changelog ==

= 1.2.0 =

Forms:

* Start a new form from a ready-made one: Contact, Quote request, Application or Booking request. The empty canvas offers them, and they disappear as soon as you add a field yourself.
* A form can stop accepting submissions, either by hand or once it reaches a maximum you set. Visitors get your own message where the form used to be. Submissions in the trash do not count towards that maximum.
* You can see whether a notification actually went out. Sending can fail for reasons that have nothing to do with your form, and WordPress tells nobody: people end up believing a form gets no submissions while they are sitting in the list. There is now a column in the list, an explanation with the mail server's own error on the submission, and a warning on the dashboard.
* Notifications link to the submission they are about, so you can open it from the email instead of going to look for it. New placeholder `{entry_link}`.

Entries:

* Searching now searches what visitors typed, not just the title. The search term appears above the list as a chip you can click away, and it combines with the form filter.

Fixes:

* The search line above a list no longer floats loose under the tabs.
* Labels next to a checkbox line up with the text beside it.

= 1.1.0 =

Forms:

* A form can now send more than one notification, so the visitor gets a confirmation and you get the alert. Point the To field at a form field such as `{field:email}` to mail the person who submitted. The old on/off checkbox is gone: an empty list means no email is sent.
* New setting: Redirect URL. Send visitors to your own thank-you page after a submission instead of showing the message on the same page. Leave it empty and nothing changes. An address on another site works too.
* A notification whose recipient does not resolve to a valid email address is now skipped instead of handed to the mailer. This matters as soon as the recipient is a form field: visitors mistype, and leave fields empty.

Entries:

* The entry screen is about submissions again. An entry can no longer be edited, its date column no longer says "Published", Quick Edit is gone, and the links above the list no longer offer a status that every entry shares.
* You can see which form you are looking at. The forms with the most recent submissions appear above the list with their counts, and a dropdown filters by any form.

Fixes:

* The character counter and the live Google and social previews under an SEO title never updated. The field shared its id with the metabox heading WordPress generates, so the script found the heading instead of the field.
* With `WP_DEBUG` on, every request logged a notice about translations being loaded too early.
* The author name in the plugin list links to the site again.
* The variable button next to a field is square and lines up with the field beside it.
* The menu icon sat two pixels above the icons beside it when the admin menu is collapsed.

= 1.0.0 =
* First release.
* Note: the Ultivo Toolkit screens and everything behind them (field groups, forms and entries) require the `manage_options` capability. Editors and authors have no access, because all of these can change how the site behaves.
