272 lines
5.3 KiB
PHP
272 lines
5.3 KiB
PHP
<?php
|
|
|
|
if (! function_exists('blocksy_validate_color')) {
|
|
function blocksy_validate_color($color) {
|
|
/**
|
|
* Allow hex colors
|
|
*/
|
|
if (sanitize_hex_color($color)) {
|
|
return $color;
|
|
}
|
|
|
|
/**
|
|
* Allow rgb* colors
|
|
*/
|
|
if (strpos($color, 'rgb') !== false) {
|
|
return $color;
|
|
}
|
|
|
|
/**
|
|
* Allow var(--global) values
|
|
*/
|
|
if (strlen($color) > 2 && substr($color, 0, 6) === "var(--") {
|
|
return $color;
|
|
}
|
|
|
|
// Allow CT_CSS_SKIP_RULE values
|
|
if (strpos($color, 'CT_CSS_SKIP_RULE') !== false) {
|
|
return $color;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
if (! function_exists('blocksy_validate_single_slider')) {
|
|
function blocksy_validate_single_slider($value) {
|
|
if (! intval($value) && intval($value) !== 0) {
|
|
return null;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function blocksy_sanitize_builder_value($option, $input) {
|
|
if (! isset($input['sections'])) {
|
|
return $input;
|
|
}
|
|
|
|
foreach ($input['sections'] as $key => $section) {
|
|
if (! isset($section['items'])) {
|
|
continue;
|
|
}
|
|
|
|
$html_fields = [
|
|
'text' => ['header_text'],
|
|
'copyright_text' => ['copyright_text']
|
|
];
|
|
|
|
foreach ($section['items'] as $item_key => $item) {
|
|
if (! isset($item['id'])) {
|
|
continue;
|
|
}
|
|
|
|
if (
|
|
! isset($html_fields[$item['id']])
|
|
||
|
|
! isset($item['values'])
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
foreach ($html_fields[$item['id']] as $html_field) {
|
|
if (! isset($item['values'][$html_field])) {
|
|
continue;
|
|
}
|
|
|
|
$item['values'][$html_field] = blocksy_sanitize_user_html(
|
|
$item['values'][$html_field]
|
|
);
|
|
}
|
|
|
|
$input['sections'][$key]['items'][$item_key] = $item;
|
|
}
|
|
}
|
|
|
|
return $input;
|
|
}
|
|
|
|
if (! function_exists('blocksy_validate_for')) {
|
|
function blocksy_validate_for($option, $input) {
|
|
if (
|
|
$option['type'] === 'ct-header-builder'
|
|
||
|
|
$option['type'] === 'ct-footer-builder'
|
|
) {
|
|
return blocksy_sanitize_builder_value($option, $input);
|
|
}
|
|
|
|
if (
|
|
$option['type'] === 'ct-switch'
|
|
||
|
|
$option['type'] === 'ct-panel'
|
|
) {
|
|
$allowed_values = ['yes', 'no'];
|
|
|
|
if (isset($option['behavior']) && $option['behavior'] === 'bool') {
|
|
$allowed_values = [true, false];
|
|
}
|
|
|
|
if (in_array($input, $allowed_values, true)) {
|
|
return $input;
|
|
}
|
|
|
|
return $option['value'];
|
|
}
|
|
|
|
if ($option['type'] === 'text' || $option['type'] === 'textarea') {
|
|
return wp_kses_post($input);
|
|
}
|
|
|
|
if ($option['type'] === 'ct-color-picker') {
|
|
if (! is_array($input)) {
|
|
return $option['value'];
|
|
}
|
|
|
|
foreach ($input as $single_color) {
|
|
if (! isset($single_color['color'])) {
|
|
return $option['value'];
|
|
}
|
|
|
|
if (! blocksy_validate_color($single_color['color'])) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (
|
|
$option['type'] === 'ct-select'
|
|
||
|
|
$option['type'] === 'ct-image-picker'
|
|
||
|
|
$option['type'] === 'ct-radio'
|
|
) {
|
|
if (! in_array(
|
|
$input,
|
|
array_reduce(
|
|
blocksy_ordered_keys($option['choices']),
|
|
function ($current, $item) {
|
|
return array_merge($current, [$item['key']]);
|
|
},
|
|
[]
|
|
),
|
|
true
|
|
)) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
|
|
if (
|
|
$option['type'] === 'ct-checkboxes'
|
|
||
|
|
$option['type'] === 'ct-visibility'
|
|
) {
|
|
foreach ($input as $key => $value) {
|
|
if (
|
|
! is_bool($value)
|
|
||
|
|
! in_array(
|
|
$key,
|
|
array_reduce(
|
|
blocksy_ordered_keys($option['choices']),
|
|
function ($current, $item) {
|
|
return array_merge($current, [$item['key']]);
|
|
},
|
|
[]
|
|
),
|
|
true
|
|
)
|
|
) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($option['type'] === 'ct-number') {
|
|
if (isset($option['responsive']) && $option['responsive']) {
|
|
$values_to_validate = ['desktop', 'tablet', 'mobile'];
|
|
|
|
foreach (blocksy_expand_responsive_value($input) as $single_key => $single_value) {
|
|
if (! in_array($single_key, $values_to_validate)) {
|
|
continue;
|
|
}
|
|
|
|
if (! is_numeric($single_value)) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
|
|
return $input;
|
|
}
|
|
|
|
if (! is_numeric($input)) {
|
|
return $option['value'];
|
|
}
|
|
|
|
return max(
|
|
intval($option['min']),
|
|
min(intval($option['max']), intval($input))
|
|
);
|
|
}
|
|
|
|
if ($option['type'] === 'ct-slider') {
|
|
if (isset($option['responsive']) && $option['responsive']) {
|
|
$values_to_validate = ['desktop', 'tablet', 'mobile'];
|
|
|
|
foreach (blocksy_expand_responsive_value($input) as $single_key => $single_value) {
|
|
if (! in_array($single_key, $values_to_validate)) {
|
|
continue;
|
|
}
|
|
|
|
if (! blocksy_validate_single_slider($single_value)) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
|
|
return $input;
|
|
}
|
|
|
|
if (
|
|
is_array($input)
|
|
||
|
|
! blocksy_validate_single_slider($input)
|
|
) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
|
|
if ($option['type'] === 'ct-image-uploader') {
|
|
if (
|
|
!is_array($input)
|
|
||
|
|
! isset($input['attachment_id'])
|
|
||
|
|
! wp_attachment_is_image($input['attachment_id'])
|
|
) {
|
|
return $option['value'];
|
|
}
|
|
}
|
|
|
|
return $input;
|
|
}
|
|
}
|
|
|
|
if (! function_exists('blocksy_include_sanitizer')) {
|
|
function blocksy_include_sanitizer($option) {
|
|
if (! isset($option['setting'])) {
|
|
return $option;
|
|
}
|
|
|
|
if (isset($option['setting']['sanitize_callback'])) {
|
|
return $option;
|
|
}
|
|
|
|
$option['setting']['sanitize_callback'] = function ($input, $setting) use ($option) {
|
|
return blocksy_validate_for($option, $input);
|
|
};
|
|
|
|
return $option;
|
|
}
|
|
}
|