{"id":4674,"date":"2026-02-24T09:53:39","date_gmt":"2026-02-24T15:53:39","guid":{"rendered":"https:\/\/racmanuel.dev\/?post_type=docs&#038;p=4674"},"modified":"2026-02-24T09:53:53","modified_gmt":"2026-02-24T15:53:53","password":"","slug":"action-button","status":"publish","type":"docs","link":"https:\/\/racmanuel.dev\/en\/docs\/custom-fields-booster\/action-button\/","title":{"rendered":"Action Button"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Renders a button that triggers a custom action handler.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The field does not store a value; it only provides a UI trigger with optional confirmation and lockout.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"use-cases\">Use Cases<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run a manual sync task from an edit screen<\/li>\n\n\n\n<li>Trigger a background job for a specific entry<\/li>\n\n\n\n<li>Launch a custom maintenance action<\/li>\n\n\n\n<li>Execute a one-off export for a post<\/li>\n\n\n\n<li>Perform a custom workflow step in admin<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"field-preview\">Field Preview<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A primary button with optional confirmation, plus a spinner and message area.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-use\">How to Use<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add the Action Button field to a Field Group.<\/li>\n\n\n\n<li>Set <strong>Button label<\/strong> and <strong>Action slug<\/strong>.<\/li>\n\n\n\n<li>(Optional) Enable confirmation and set the message.<\/li>\n\n\n\n<li>(Optional) Set a required capability.<\/li>\n\n\n\n<li>Set <strong>Lock seconds<\/strong> to prevent rapid repeats.<\/li>\n\n\n\n<li>Save the Field Group and use the button in the editor.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"field-settings\">Field Settings<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Setting<\/th><th>Description<\/th><th>Default<\/th><\/tr><tr><td>Button label<\/td><td>Text displayed on the button<\/td><td>Run action<\/td><\/tr><tr><td>Action slug<\/td><td>Unique identifier for the action<\/td><td>Empty<\/td><\/tr><tr><td>Enable confirmation<\/td><td>Show a confirmation prompt<\/td><td>0<\/td><\/tr><tr><td>Confirmation message<\/td><td>Message shown in the confirmation prompt<\/td><td>Are you sure?<\/td><\/tr><tr><td>Required capability<\/td><td>Optional capability check<\/td><td>Empty<\/td><\/tr><tr><td>Lock seconds<\/td><td>Prevents rapid repeated triggers<\/td><td>15<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"value-storage\">Value &amp; Storage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Saved as: Post meta (no value)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Storage type: null<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Return format: null<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">REST format: not specified<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important details:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This field does not store any value.<\/li>\n\n\n\n<li>Output from <code>get_field()<\/code> is always <code>null<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"output-examples\">Output Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"php\">PHP<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$value = get_field('my_action_button');\nif ($value === null) {\n    \/\/ No stored value for this field.\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"compatibility\">Compatibility<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Repeaters<\/li>\n\n\n\n<li>Flexible Content<\/li>\n\n\n\n<li>Options Pages<\/li>\n\n\n\n<li>Frontend forms (acf_form)<\/li>\n\n\n\n<li>REST API<\/li>\n\n\n\n<li>Multisite<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"hooks-developer\">Hooks (Developer)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hooks-summary\">Hooks Summary<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Hook<\/th><th>Type<\/th><th>Purpose<\/th><\/tr><tr><td>custom_fields_booster_button_action_defaults<\/td><td>Filter<\/td><td>Modify default settings.<\/td><\/tr><tr><td>custom_fields_booster_button_action_supports<\/td><td>Filter<\/td><td>Modify ACF support flags.<\/td><\/tr><tr><td>custom_fields_booster_button_action_before_settings<\/td><td>Action<\/td><td>Run logic before rendering settings UI.<\/td><\/tr><tr><td>custom_fields_booster_button_action_after_settings<\/td><td>Action<\/td><td>Run logic after rendering settings UI.<\/td><\/tr><tr><td>custom_fields_booster_button_action_before_enqueue<\/td><td>Action<\/td><td>Run logic before enqueuing assets.<\/td><\/tr><tr><td>custom_fields_booster_button_action_after_enqueue<\/td><td>Action<\/td><td>Run logic after enqueuing assets.<\/td><\/tr><tr><td>custom_fields_booster_button_action_before_render<\/td><td>Action<\/td><td>Run logic before rendering UI.<\/td><\/tr><tr><td>custom_fields_booster_button_action_after_render<\/td><td>Action<\/td><td>Run logic after rendering UI.<\/td><\/tr><tr><td>custom_fields_booster_button_action_update_value<\/td><td>Filter<\/td><td>Modify the value before saving.<\/td><\/tr><tr><td>custom_fields_booster_button_action_load_value<\/td><td>Filter<\/td><td>Modify the value after loading.<\/td><\/tr><tr><td>custom_fields_booster_button_action_validate_value<\/td><td>Filter<\/td><td>Modify validation result.<\/td><\/tr><tr><td>custom_fields_booster_button_action_format_value<\/td><td>Filter<\/td><td>Modify value returned by <code>get_field()<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"filters\">Filters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_defaults<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Override default settings.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: You want consistent defaults across all Action Button fields.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_defaults', function ($defaults) {\n    $defaults['lock_seconds'] = 30;\n    return $defaults;\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_supports<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Control ACF supports such as required or escaping behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: Your project needs different support flags.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_supports', function ($supports) {\n    $supports['required'] = false;\n    return $supports;\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_update_value<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Modify the value before saving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: You want to modify the stored output (always <code>null<\/code> by default).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_update_value', function ($value, $post_id, $field, $field_instance) {\n    return $value;\n}, 10, 4);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_load_value<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Modify the value after loading.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: You want to customize the returned value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_load_value', function ($value, $post_id, $field, $field_instance) {\n    return $value;\n}, 10, 4);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_validate_value<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Modify validation result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: You need custom validation logic.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_validate_value', function ($valid, $value, $field, $input, $field_instance) {\n    return $valid;\n}, 10, 5);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Filter:<\/strong> <code>custom_fields_booster_button_action_format_value<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Purpose: Modify value returned by <code>get_field()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When: You want to change the return value.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_filter('custom_fields_booster_button_action_format_value', function ($value, $post_id, $field, $field_instance) {\n    return $value;\n}, 10, 4);\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"actions\">Actions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Action:<\/strong> <code>custom_fields_booster_button_action_before_render<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Runs before rendering the field UI.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_action('custom_fields_booster_button_action_before_render', function ($field, $field_instance) {\n    \/\/ Pre-render logic.\n}, 10, 2);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Action:<\/strong> <code>custom_fields_booster_button_action_after_render<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Runs after rendering the field UI.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">add_action('custom_fields_booster_button_action_after_render', function ($field, $field_instance) {\n    \/\/ Post-render logic.\n}, 10, 2);\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"assets\">Assets<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This field enqueues scripts whenever the input is rendered (admin and frontend via <code>acf_form()<\/code>):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>admin\/js\/cfb-field-button-action.js<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rest-api\">REST API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Schema: not specified<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"rest-validation\">REST Validation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Standard ACF validation only.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"security-escaping\">Security &amp; Escaping<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Output escapes all attributes and the button label.<\/li>\n\n\n\n<li>No value is saved or formatted.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"notes-limitations\">Notes \/ Limitations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This field requires a custom handler for the action slug (client\/server).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"changelog\">Changelog<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1.0.0 \u2014 Initial release<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Renders a button that triggers a custom action handler. The field does not store a value; it only provides a UI trigger with optional confirmation and lockout. Use Cases Field Preview A primary button with optional confirmation, plus a spinner and message area. How to Use Field Settings Setting Description Default Button label Text displayed [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_gspb_post_css":"","_glsr_average":0,"_glsr_ranking":0,"_glsr_reviews":0,"footnotes":""},"doc_category":[96],"doc_tag":[102],"class_list":["post-4674","docs","type-docs","status-publish","hentry","doc_category-custom-fields-booster","doc_tag-free"],"blocksy_meta":[],"year_month":"2026-06","word_count":721,"total_views":0,"reactions":{"happy":0,"normal":0,"sad":0},"author_info":{"name":"racmanuel","author_nicename":"ra_cm","author_url":"https:\/\/racmanuel.dev\/en\/author\/ra_cm\/"},"doc_category_info":[{"term_name":"Custom Fields Booster","term_url":"https:\/\/racmanuel.dev\/en\/docs\/category\/custom-fields-booster\/"}],"doc_tag_info":[{"term_name":"Free","term_url":"https:\/\/racmanuel.dev\/en\/docs\/tag\/free\/"}],"acf":[],"_links":{"self":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/comments?post=4674"}],"version-history":[{"count":1,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4674\/revisions"}],"predecessor-version":[{"id":4675,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/docs\/4674\/revisions\/4675"}],"wp:attachment":[{"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/media?parent=4674"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/doc_category?post=4674"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/racmanuel.dev\/en\/wp-json\/wp\/v2\/doc_tag?post=4674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}