Lets walk though the acf/validate_value filter logically...
I'm assuming both of your code snippets are the same snippet, and you are not executing them together (as @Buttered_Toast pointed out).
Here is your code (see my added comments)
code below is assuming your dfg_service_type
acf field is a number field...
/**
* @param mixed $valid Whether or not the value is valid (boolean) or a custom error message (string).
* @param mixed $value The field value.
* @param array $field The field array containing all settings.
* @param string $input_name The field DOM element name attribute.
* @return bool|string
*/
function dfg_acf_validate_value($valid, $value, $field, $input_name) {
// $valid true by default
// but if $field['required'] is true then
// valid is set to false if the value is empty, but allow 0 as a valid value
if( $valid !== true ) {
return $valid;
}
// set value if value is true and cast value to integer else set bool false
$value = $value ? (int)$value : false;
// here is your first snippet cleaned up...
// you are simply just checking if value is not 30 and not 360
// if anything but 30 or 360, the below condition will return __( 'Please choose a valid type!' );
// is this your intention?
if( $value && ( $value !== 30 && $value !== 360 )) {
return __( 'Please choose a valid type!' );
}
/**
// here is another option to check if $value is greater than or equal too 30 and less than or equal too 360...
if( $value && ( $value >= 30 && $value <= 360 )) {
return __( 'Please choose a valid type!' );
}
*/
// return valid and save value if above value conditions are not run
return $valid;
}
// init the filter perform custom validation on the field’s `$value` before it is saved into the database.
// for all acf fields with the name `dfg_service_type`
add_filter('acf/validate_value/name=dfg_service_type', 'dfg_acf_validate_value', 10, 4);
Update
Let try and debug this.
Add some debug functions to the top of your functions.php
which dumps then exits...
presuming your php version is 5.6+ so variable-length arg lists token works
<?php
/**
* functions.php
*/
// dump and exit function
function dd(...$args) {
dump(...$args);
exit;
}
// dump
function dump(...$args) {
foreach ($args as $dump) {
echo '<pre class="dd">' . print_r($dump, true) . '</pre>';
}
}
Then try this instead and save the field.
function dfg_acf_validate_value($valid, $value, $field, $input_name) {
// test this is getting hit
dd($valid, $value, $field, $input_name);
}
add_filter('acf/validate_value/name=dfg_service_type', 'dfg_acf_validate_value', 10, 4);
If this returns dd
results then the field validate value is getting hit.
Let me know how you get on and what is returned, and i'll try help some more.
acf/validate_value/key={$key}
, maybe that will trigger the filteracf/validate_value/
twice, should beacf/validate_value/key=field_61dd4304ab2c2