Current path: home/webdevt/www/cryptoimpot.fr/wp-content/themes/blocksy/inc/classes/db-versioning/utils/
?? Go up: /home/webdevt/www/cryptoimpot.fr/wp-content/themes/blocksy/inc/classes/db-versioning
<?php
namespace Blocksy\DbVersioning;
class DefaultValuesCleaner {
public function clean_whole_customizer() {
$all_mods = get_theme_mods();
$ignored_mods = [
'header_placements',
'footer_placements'
];
foreach ($all_mods as $mod_name => $mod_value) {
if (in_array($mod_name, $ignored_mods)) {
continue;
}
if (isset($mod_value['desktop'])) {
$cleaned_value = $this->clean_responsive_value($mod_value);
if ($cleaned_value['changed']) {
set_theme_mod($mod_name, $cleaned_value['value']);
}
}
}
blocksy_manager()->db->wipe_cache();
}
public function clean_whole_customizer_recursively() {
$all_mods = get_theme_mods();
$theme_slug = get_option('stylesheet');
$option_name = "theme_mods_$theme_slug";
$mods = get_option($option_name, '__empty__');
if ($mods === '__empty__' || ! is_array($mods)) {
return;
}
$new_mods = [];
$change_count = 0;
foreach ($mods as $mod_name => $mod_value) {
$cleaned_value = $this->clean_value_recursively($mod_value);
if ($cleaned_value['changed']) {
$new_mods[$mod_name] = $cleaned_value['value'];
$change_count++;
} else {
$new_mods[$mod_name] = $mod_value;
}
}
if ($change_count > 0) {
update_option($option_name, $new_mods);
}
}
public function clean_value_recursively($value) {
if (! is_array($value)) {
return [
'value' => $value,
'changed' => false
];
}
if ($this->is_responsive_value($value)) {
return $this->clean_responsive_value($value);
}
$result = [];
$changed = false;
foreach ($value as $key => $mod_value) {
if ($this->is_responsive_value($mod_value)) {
$clean_result = $this->clean_responsive_value($mod_value);
if ($clean_result['changed']) {
$changed = true;
}
$result[$key] = $clean_result['value'];
continue;
}
$clean_result = $this->clean_value_recursively($mod_value);
$result[$key] = $clean_result['value'];
if ($clean_result['changed']) {
$changed = true;
}
}
return [
'value' => $result,
'changed' => $changed
];
}
public function clean_header() {
$header_placements = blocksy_get_theme_mod(
'header_placements',
'__empty__'
);
if ($header_placements === '__empty__') {
return;
}
$has_changed = false;
$new_header_placements = $header_placements;
foreach ($header_placements['sections'] as $section_index => $section) {
if (empty($section['items'])) {
continue;
}
foreach ($section['items'] as $item_index => $item) {
if (empty($item['id']) || empty($item['values'])) {
continue;
}
$cleaned_item_payload = $this->cleanup_item($item);
if (! $cleaned_item_payload['item_changed']) {
continue;
}
$has_changed = true;
$new_header_placements['sections'][$section_index]['items'][
$item_index
]['values'] = $cleaned_item_payload['new_item'];
}
}
if ($has_changed) {
set_theme_mod('header_placements', $new_header_placements);
}
}
public function clean_footer() {
$footer_placements = blocksy_get_theme_mod(
'footer_placements',
'__empty__'
);
if ($footer_placements === '__empty__') {
return;
}
$has_changed = false;
$new_footer_placements = $footer_placements;
foreach ($footer_placements['sections'] as $section_index => $section) {
if (empty($section['items'])) {
continue;
}
foreach ($section['items'] as $item_index => $item) {
if (empty($item['id']) || empty($item['values'])) {
continue;
}
$cleaned_item_payload = $this->cleanup_item($item, 'footer');
if (! $cleaned_item_payload['item_changed']) {
continue;
}
$has_changed = true;
$new_footer_placements['sections'][$section_index]['items'][
$item_index
]['values'] = $cleaned_item_payload['new_item'];
}
}
if ($has_changed) {
set_theme_mod('footer_placements', $new_footer_placements);
}
}
// new_item = []
// item_changed = false
public function cleanup_item($item, $panel_type = 'header') {
$item_changed = false;
$registered_items = blocksy_manager()->builder->get_registered_items_by(
$panel_type
);
$item_data = null;
foreach ($registered_items as $registered_item) {
if ($registered_item['id'] === $item['id']) {
$item_data = $registered_item;
break;
}
}
if (! $item_data) {
return [
'item_changed' => false
];
}
$options = blocksy_manager()->builder->get_options_for(
$panel_type,
$item_data
);
$collected = [];
blocksy_collect_options(
$collected,
$options,
[
'limit_option_types' => false,
'limit_level' => 0,
'include_container_types' => false,
'info_wrapper' => false,
]
);
$new_item = [];
foreach ($item['values'] as $item_key => $item_value) {
if (! isset($collected[$item_key])) {
continue;
}
if ($item_value != $collected[$item_key]['value']) {
$clean_result = $this->clean_responsive_value($item_value);
if ($clean_result['changed']) {
$item_changed = true;
}
$new_item[$item_key] = $clean_result['value'];
}
}
if (count($new_item) === 0) {
return [
'item_changed' => true,
'new_item' => []
];
}
return [
'item_changed' => $item_changed,
'new_item' => $new_item
];
}
private function clean_responsive_value($value) {
if (! is_array($value) || ! isset($value['desktop'])) {
return [
'value' => $value,
'changed' => false
];
}
$device_keys = [
'desktop',
'tablet',
'mobile'
];
$allowed_keys = array_merge($device_keys, ['__changed']);
$new_value = [];
foreach ($allowed_keys as $device) {
if (isset($value[$device])) {
$new_value[$device] = $value[$device];
}
}
$equal_to_all = false;
if (isset($new_value['tablet']) && isset($new_value['mobile'])) {
$equal_to_all = $this->deep_compare(
$new_value['desktop'],
$new_value['tablet']
);
$equal_to_all = $this->deep_compare(
$new_value['desktop'],
$new_value['mobile']
);
}
if ($equal_to_all) {
return [
'value' => $new_value['desktop'],
'changed' => true
];
}
return [
'value' => $new_value,
'changed' => ! $this->deep_compare($new_value, $value)
];
}
private function is_responsive_value($value) {
return (
isset($value['desktop'])
&&
// Header placements also has a `desktop` key but is not a
// responsive value, so it should be skipped.
(
! isset($value['mode'])
||
$value['mode'] !== 'placements'
)
);
}
private function deep_compare($a, $b) {
return $a == $b;
}
}