{"id":2138,"date":"2024-08-09T16:47:05","date_gmt":"2024-08-09T20:47:05","guid":{"rendered":"https:\/\/docs.gravityflow.io\/?p=2138"},"modified":"2025-05-16T10:53:26","modified_gmt":"2025-05-16T14:53:26","slug":"gravityflow_validation_user_input","status":"publish","type":"post","link":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/","title":{"rendered":"gravityflow_validation_user_input"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-description\">Description<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The filter <strong>gravityflow_validation_user_input<\/strong> is used to validate whether the user input step form is valid. You might use it when you require an equivalent to <a href=\"https:\/\/docs.gravityforms.com\/gform_validation\/\">gform_validation<\/a>. Note that <a href=\"https:\/\/docs.gravityforms.com\/gform_field_validation\/\">gform_field_validation<\/a> does fire for user input steps, and is generally the better filter to hook your custom logic to.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-parameters\">Parameters<\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Parameter<\/th><th>Type<\/th><th>Details<\/th><\/tr><\/thead><tbody><tr><td>$validation_result<\/td><td><a href=\"https:\/\/docs.gravityforms.com\/array\">Array<\/a> <\/td><td>The validation result and form currently being processed<\/td><\/tr><tr><td>$step<\/td><td><a href=\"https:\/\/docs.gravityflow.io\/step-class\/\">Step<\/a><\/td><td>The current user input step<\/td><\/tr><tr><td>$new_status<\/td><td><a href=\"https:\/\/docs.gravityforms.com\/string\">String<\/a><\/td><td>The new status for the current step<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-examples\">Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-prevent-users-with-specific-meta-data-from-completing-a-user-input\"><strong>Prevent users with specific meta data from completing a user input<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_filter( &#039;gravityflow_validation_user_input&#039;, &#039;sh_custom_user_input_validation&#039;, 10,3 );\n\nfunction sh_custom_user_input_validation( $validation_result, $step, $new_status ) {\n\n    $current_user = wp_get_current_user();\n    if ( 0 !== $current_user-&gt;ID ) {\n        $level = get_user_meta( $current_user-&gt;ID, &#039;employee_level&#039;, true );\n        if ( isset( $level ) &amp;&amp; (int) $level &lt; 5 ) {\n            return new WP_Error( &#039;validation_result&#039;, esc_html__( &#039;Only Level 5+ employees can complete this step&#039;, &#039;gravityflow&#039; ), $validation_result );\n        }\n    }\n\n    return $validation_result;\n}\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-prevent-all-validation-from-failing-on-a-particular-user-input-step\"><strong>Prevent all validation from failing on a particular user input step<br><\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_filter( &#039;gravityflow_validation_user_input&#039;, &#039;sh_custom_user_input_validation&#039;, 10,3 );\n\nfunction sh_custom_user_input_validation( $validation_result, $step, $new_status ) {\n    if ( $step-&gt;get_id() == &#039;223&#039; ) {\n        $validation_result&#x5B;&#039;is_valid&#039;] = false;\n    }\n    return $validation_result;\n}\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-validate-for-a-field-to-be-required-only-on-a-specific-step\"><strong>Validate for a field to be required only on a specific step<br><\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Setting a field to be required via the form editor will validate that it is not blank on every step. This example shows how you could leave the required field setting off and still validate that it is required on a specific step. It could easily be customized in the opposite way to allow a field set as required on all steps be excluded on a single step as well.<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_filter( &#039;gravityflow_validation_user_input&#039;, &#039;jo_custom_user_input_validation&#039;, 10, 3 );\nfunction jo_custom_user_input_validation( $validation_result, $step, $new_status ) {\n\tif ( $step-&gt;get_id() == &#039;229&#039; ) {\n\n\t\tif ( empty( rgpost( &#039;input_1&#039; ) ) ) {\n\t\t\t\/\/ set the form validation to false\n\t\t\t$validation_result&#x5B;&#039;is_valid&#039;] = false;\n\n\t\t\t\/\/finding Field with ID of 1 and marking it as failed validation\n\t\t\t$form = $validation_result&#x5B;&#039;form&#039;];\n\t\t\tforeach( $form&#x5B;&#039;fields&#039;] as &amp;$field ) {\n\n\t\t\t\t\/\/NOTE: replace 1 with the field you would like to validate\n\t\t\t\tif ( $field-&gt;id == &#039;1&#039; ) {\n\t\t\t\t\t$field-&gt;failed_validation = true;\n\t\t\t\t\t$field-&gt;validation_message = &#039;Fill in the required field for this step&#039;;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new WP_Error( &lt;br&gt;\t\t\t\t&#039;validation_result&#039;, \n\t\t\t\tesc_html__( &#039;Required field(s) for this step are incomplete.&#039;, &#039;gravityflow&#039; ), \n\t\t\t\t$validation_result\n\t\t\t);\n\t\t}\n\t}\n\treturn $validation_result;\n}\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-prevent-the-entry-creator-from-completing-a-user-input-step\"><strong>Prevent the entry creator from completing a user input step<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_filter( &#039;gravityflow_validation_user_input&#039;, &#039;validate_entry_creator_conflict&#039;, 10, 2 );\nfunction validate_entry_creator_conflict( $validation_result, $step ) {\n\n\t\/\/ Only check for a specific step ID\n\tif ( $step-&gt;get_id() != 443 ) {\n\t\treturn $validation_result;\n\t}\n\t\/\/Only apply for logged in  user\n\t$current_user = wp_get_current_user();\n\tif ( 0 == $current_user-&gt;ID ) {\n\t\treturn $validation_result;\n\t}\n\n\t$entry = $step-&gt;get_entry();\n\t$created_by_user_id = $entry&#x5B;&#039;created_by&#039;];\n\t$error = new WP_Error( &#039;validation_result&#039;, esc_html__( &#039;You cannot action a step for an entry that you submit.&#039;, &#039;gravityflow&#039; ), $validation_result );\n\t\/\/ if current user is the entry creator\n\tif ( $created_by_user_id == $current_user-&gt;ID ) {\n\t\t$assignees = $step-&gt;get_assignees();\n\n\t\t$matched = false;\n\t\t\/\/ loop through all assignees\n\t\tforeach ( $assignees as $assignee ) {\n\t\t\tswitch ( $assignee-&gt;get_type() ) {\n\t\t\t\tcase &#039;user_id&#039;:\n\t\t\t\t\t\/\/ remove when user id match\n\t\t\t\t\treturn $error;\n\t\t\t\t\tbreak;\n\t\t\t\tcase &#039;role&#039;:\n\t\t\t\t\t\/\/ remove when user role match\n\t\t\t\t\t$assignee_role = $assignee-&gt;get_id();\n\t\t\t\t\tif ( in_array( $assignee_role, $current_user-&gt;roles ) ) {\n\t\t\t\t\t\treturn $error;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase &#039;email&#039;:\n\t\t\t\t\t\/\/ remove when user email match\n\t\t\t\t\t$assignee_email = $assignee-&gt;get_id();\n\t\t\t\t\tif ( $assignee_email == $current_user-&gt;user_email ) {\n\t\t\t\t\t\treturn $error;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn $validation_result;\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-placement\">Placement<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This code can be used in the <a href=\"https:\/\/developer.wordpress.org\/themes\/basics\/theme-functions\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">functions.php<\/a> file of the active theme, a custom functions plugin, a custom add-on, or with a code snippets plugin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See also the PHP section in this article: <a href=\"https:\/\/docs.gravityflow.io\/where-do-i-put-this-code\/\" target=\"_blank\" rel=\"noreferrer noopener\">Where Do I Put This Code?<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"The filter gravityflow_validation_user_input is used to validate whether the user input step form is valid. You might use it when you require an equivalent to gform_validation.","protected":false},"author":15,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_autodraft_ids":[],"_sb_is_suggestion_mode":false,"_sb_show_suggestion_boards":false,"_sb_show_comment_boards":false,"_sb_suggestion_history":"","_sb_update_block_changes":"","_is_real_time_mode":false,"_realtime_collaborators":"","footnotes":"","cf_checklist_status":[]},"categories":[17],"tags":[78],"class_list":["post-2138","post","type-post","status-publish","format-standard","hentry","category-gravityflow_actions_filters","tag-developer-docs","wpautop"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.4 (Yoast SEO v27.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>gravityflow_validation_user_input - Gravity Flow Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"gravityflow_validation_user_input\" \/>\n<meta property=\"og:description\" content=\"Description The filter gravityflow_validation_user_input is used to validate whether the user input step form is valid. You might use it when you require an equivalent to gform_validation. Note that gform_field_validation does fire for user input steps, and is generally the better filter to hook your custom logic to. Parameters Parameter Type Details $validation_result Array The [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/\" \/>\n<meta property=\"og:site_name\" content=\"Gravity Flow Documentation\" \/>\n<meta property=\"article:published_time\" content=\"2024-08-09T20:47:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-16T14:53:26+00:00\" \/>\n<meta name=\"author\" content=\"subrato\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"subrato\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/\"},\"author\":{\"name\":\"subrato\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/#\\\/schema\\\/person\\\/89d1fe9718d100260c8ecb16c1d51fec\"},\"headline\":\"gravityflow_validation_user_input\",\"datePublished\":\"2024-08-09T20:47:05+00:00\",\"dateModified\":\"2025-05-16T14:53:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/\"},\"wordCount\":205,\"commentCount\":0,\"keywords\":[\"developer docs\"],\"articleSection\":[\"Gravity Flow Actions and Filters\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/\",\"url\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/\",\"name\":\"gravityflow_validation_user_input - Gravity Flow Documentation\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/#website\"},\"datePublished\":\"2024-08-09T20:47:05+00:00\",\"dateModified\":\"2025-05-16T14:53:26+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/#\\\/schema\\\/person\\\/89d1fe9718d100260c8ecb16c1d51fec\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/gravityflow_validation_user_input\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/docs.gravityflow.io\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"gravityflow_validation_user_input\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/#website\",\"url\":\"https:\\\/\\\/docs.gravityflow.io\\\/\",\"name\":\"Gravity Flow Documentation\",\"description\":\"Gravity Flow Documentation\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/docs.gravityflow.io\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/docs.gravityflow.io\\\/#\\\/schema\\\/person\\\/89d1fe9718d100260c8ecb16c1d51fec\",\"name\":\"subrato\",\"url\":\"https:\\\/\\\/docs.gravityflow.io\\\/author\\\/subrato\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"gravityflow_validation_user_input - Gravity Flow Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/","og_locale":"en_US","og_type":"article","og_title":"gravityflow_validation_user_input","og_description":"Description The filter gravityflow_validation_user_input is used to validate whether the user input step form is valid. You might use it when you require an equivalent to gform_validation. Note that gform_field_validation does fire for user input steps, and is generally the better filter to hook your custom logic to. Parameters Parameter Type Details $validation_result Array The [&hellip;]","og_url":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/","og_site_name":"Gravity Flow Documentation","article_published_time":"2024-08-09T20:47:05+00:00","article_modified_time":"2025-05-16T14:53:26+00:00","author":"subrato","twitter_card":"summary_large_image","twitter_misc":{"Written by":"subrato","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/#article","isPartOf":{"@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/"},"author":{"name":"subrato","@id":"https:\/\/docs.gravityflow.io\/#\/schema\/person\/89d1fe9718d100260c8ecb16c1d51fec"},"headline":"gravityflow_validation_user_input","datePublished":"2024-08-09T20:47:05+00:00","dateModified":"2025-05-16T14:53:26+00:00","mainEntityOfPage":{"@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/"},"wordCount":205,"commentCount":0,"keywords":["developer docs"],"articleSection":["Gravity Flow Actions and Filters"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/","url":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/","name":"gravityflow_validation_user_input - Gravity Flow Documentation","isPartOf":{"@id":"https:\/\/docs.gravityflow.io\/#website"},"datePublished":"2024-08-09T20:47:05+00:00","dateModified":"2025-05-16T14:53:26+00:00","author":{"@id":"https:\/\/docs.gravityflow.io\/#\/schema\/person\/89d1fe9718d100260c8ecb16c1d51fec"},"breadcrumb":{"@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/docs.gravityflow.io\/gravityflow_validation_user_input\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/docs.gravityflow.io\/"},{"@type":"ListItem","position":2,"name":"gravityflow_validation_user_input"}]},{"@type":"WebSite","@id":"https:\/\/docs.gravityflow.io\/#website","url":"https:\/\/docs.gravityflow.io\/","name":"Gravity Flow Documentation","description":"Gravity Flow Documentation","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/docs.gravityflow.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/docs.gravityflow.io\/#\/schema\/person\/89d1fe9718d100260c8ecb16c1d51fec","name":"subrato","url":"https:\/\/docs.gravityflow.io\/author\/subrato\/"}]}},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/posts\/2138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/comments?post=2138"}],"version-history":[{"count":6,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/posts\/2138\/revisions"}],"predecessor-version":[{"id":4184,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/posts\/2138\/revisions\/4184"}],"wp:attachment":[{"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/media?parent=2138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/categories?post=2138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.gravityflow.io\/wp-json\/wp\/v2\/tags?post=2138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}