File "Update.php"
Full Path: /home/flipjqml/onlinebetsolution.com/wp-content/plugins/buttonizer-multifunctional-button/app/Legacy/Utils/Update.php
File size: 50.62 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/*
* SOFTWARE LICENSE INFORMATION
*
* Copyright (c) 2017 Buttonizer, all rights reserved.
*
* This file is part of Buttonizer
*
* For detailed information regarding to the licensing of
* this software, please review the license.txt or visit:
* https://buttonizer.pro/license/
*/
namespace Buttonizer\Legacy\Utils;
use Buttonizer\Legacy\Utils\Maintain;
/**
* Class Update Buttonizer to version 2.0 (or more)
*
* This PHP class contains NO premium code
*
* Thank you for updating Buttonizer and keeping Buttonizer UP TO DATE!
*
* By the way, not many people will ever see this comment after all...
* If you read this, email jasper@buttonizer.pro and say something nice referring to this comment!
*
* @package Buttonizer\Legacy\Utils
*/
class Update
{
private $initialized = false;
private $removedAnything = false;
private $backupSettings = [];
private $backupButtons = [];
private $backupSchedule = [];
private $backupRules = [];
private $timeScheduleId = null;
public function __construct()
{
$this->timeScheduleId = time();
}
/**
* Run update to 2.0
*/
public function run()
{
try {
$this->registerSettings();
// If there's no Buttonizer data, new install
if (!$this->backupButtons && !$this->backupSchedule && !$this->backupRules) {
$this->cleanup(true);
return; // all OK, new installation :)
}
$this->convertButtons();
$this->convertTimeSchedules();
if ($this->backupRules) {
$this->convertPageRules();
}
$this->cleanup();
} catch (\Exception $e) {
$this->beforeCrashRevert();
header('Content-Type: application/javascript');
echo json_encode([
"status" => "error",
"message" => "Something went wrong while trying to migrate settings from version 1.5 to version 2.0. Please contact Buttonizer Support or go to the <a href=\"https://community.buttonizer.pro/\" target=\"_blank\">Buttonizer Community</a> and let us know the following message: " . $e->getMessage()
]);
exit;
}
}
/**
* Selfmigrate
* @since 2.2
*/
public function selfMigrate($currentVersion)
{
switch ($currentVersion) {
case "2.0":
$this->update20to21();
break;
case "2.1":
$this->update216to217();
break;
case "2.2":
$this->migration4();
break;
case "4":
$this->migration5();
break;
case "5":
$this->migration6();
break;
case "6":
$this->migrationTo7();
break;
default:
// No migration for this. Set to current migration version otherwise we're going into a loop
$this->registerSettings();
$buttonizerSettings = get_option('buttonizer_settings');
$buttonizerSettings["migration_version"] = BUTTONIZER_LAST_MIGRATION;
update_option('buttonizer_settings', $buttonizerSettings);
break;
}
// Make sure there is nothing to check anymore
$this->checkMigration();
}
/**
* Recheck migrate, otherwise run next migration
*/
private function checkMigration()
{
$this->registerSettings();
$buttonizerSettings = get_option('buttonizer_settings');
// Run next migration
if ($buttonizerSettings['migration_version'] !== BUTTONIZER_LAST_MIGRATION) {
$this->selfMigrate($buttonizerSettings['migration_version']);
}
}
/**
* Register settings
*/
private function registerSettings()
{
// Backup settings
register_setting("buttonizer", "buttonizer_buttons_backup");
register_setting("buttonizer", "buttonizer_opening_settings_backup");
register_setting("buttonizer", "buttonizer_page_categories_backup");
register_setting("buttonizer", "buttonizer_general_settings_backup");
// Get buttons
register_setting("buttonizer", "buttonizer_buttons");
register_setting("buttonizer", "buttonizer_opening_settings");
register_setting("buttonizer", "buttonizer_page_categories");
// Buttonizer 2.0 setting groups
register_setting("buttonizer", "buttonizer_buttons");
register_setting("buttonizer", "buttonizer_buttons_published");
register_setting("buttonizer", "buttonizer_settings");
register_setting("buttonizer", "buttonizer_schedules");
register_setting("buttonizer", "buttonizer_rules");
// Load buttons
$this->backupButtons = get_option('buttonizer_buttons');
$this->backupSettings = get_option('buttonizer_general_settings');
$this->backupSchedule = get_option('buttonizer_opening_settings');
$this->backupRules = get_option('buttonizer_page_categories');
$this->initialized = true;
}
/**
* Woah! Something went wrong :'(
*/
private function beforeCrashRevert()
{
// Check if anything got removed
if (!$this->initialized || !$this->removedAnything) return;
// Delete created options
delete_option('buttonizer_general_settings_backup');
delete_option("buttonizer_buttons_backup");
delete_option("buttonizer_opening_settings_backup");
delete_option("buttonizer_page_categories_backup");
delete_option("buttonizer_general_settings_backup");
// Make sure that the old values are still there
update_option('buttonizer_general_settings', $this->backupSettings);
update_option('buttonizer_buttons', $this->backupButtons);
update_option('buttonizer_opening_settings', $this->backupSchedule);
update_option('buttonizer_page_categories', $this->backupRules);
}
/**
* Convert
*/
private function convertButtons()
{
// Make backup
update_option('buttonizer_buttons_backup', $this->backupButtons);
$buttons = [];
$defaultButtonColor = $this->get15GeneralSettings('button_unpushed', '#ba54ff');
$defaultButtonColorHover = $this->get15GeneralSettings('button_pushed', '#ba54ff');
foreach ($this->backupButtons['buttonorder'] as $buttonId) {
// Skip the placeholder button
if ($buttonId == -1) continue;
$hasStyleChanges = false;
// Get action type and action
$actionType = $this->get15buttonValue($buttonId, 'action', '');
$action = $this->get15buttonValue($buttonId, 'url', '');
// Make sure social sharing actions get migrated
if ($actionType == 'socialsharing') {
$action = $this->get15buttonValue($buttonId, 'social', 'facebook');
} else if ($actionType == 'javascript') {
$actionType = 'javascript_pro';
}
// Make sure label gets migrated correctly
$showLabel = ($this->get15buttonValue($buttonId, 'show_label_on_hover', 'always') === 'default' ? 'always' : $this->get15buttonValue($buttonId, 'show_label_on_hover', 'always'));
// Hover on desktop, show on mobile
if ($showLabel === 'showOnHover') {
$showLabelDesktop = 'hover';
$showLabelMobile = 'always';
}
// Hover on desktop, hide on mobile
else if ($showLabel === 'showOnHoverDesktop') {
$showLabelDesktop = 'hover';
$showLabelMobile = 'hide';
}
// Hide on desktop, show on mobile
else if ($showLabel === 'showOnHoverMobile') {
$showLabelDesktop = 'hide';
$showLabelMobile = 'always';
}
// Always show label
else {
$showLabelDesktop = 'always';
$showLabelMobile = 'always';
}
$button = [
// Name
"name" => $this->get15buttonValue($buttonId, 'title', 'Button ' . count($buttons)),
"icon" => 'fa ' . $this->get15buttonValue($buttonId, 'icon', 'fa-lightbulb'),
// When do we show this button?
"show_desktop" => $this->get15buttonValue($buttonId, 'show_on_desktop', 0) == 1 ? 'true' : 'false',
"show_mobile" => $this->get15buttonValue($buttonId, 'show_on_phone', 0) == 1 ? 'true' : 'false',
// Button actions
"type" => $actionType,
"action" => $action,
"action_new_tab" => $this->get15buttonValue($buttonId, 'url_newtab', 0) == 1 ? 'true' : 'false',
// Button label
"label" => $this->get15buttonValue($buttonId, 'text', 'Button label'),
"show_label_desktop" => $showLabelDesktop,
"show_label_mobile" => $showLabelMobile
];
// Custom colors
if ($this->get15buttonValue($buttonId, 'using_custom_colors', 0) == 1) {
// Button background color
if ($this->get15buttonValue($buttonId, 'colors_button', '#ba54ff') !== '#ba54ff' && $this->get15buttonValue($buttonId, 'colors_button', '#ba54ff') !== $defaultButtonColor) {
$hasStyleChanges = true;
$button['background_color'] = $this->fixColor($this->get15buttonValue($buttonId, 'colors_button', '#ba54ff'));
}
// Button background hover color
if ($this->get15buttonValue($buttonId, 'colors_pushed', '#8d1acc') !== '#8d1acc' && $this->get15buttonValue($buttonId, 'colors_pushed', '#8d1acc') !== $defaultButtonColorHover) {
$hasStyleChanges = true;
$button['background_color_interaction'] = $this->fixColor($this->get15buttonValue($buttonId, 'colors_pushed', '#8d1acc'));
}
// Button icon color
if ($this->fixColor($this->get15buttonValue($buttonId, 'colors_icon', '#FFFFFF')) !== '#FFFFFF' && $this->get15buttonValue($buttonId, 'colors_icon', '#FFFFFF') != $this->get15GeneralSettings('icon_color', '#FFFFFF')) {
$hasStyleChanges = true;
$button['icon_color'] = $this->fixColor($this->get15buttonValue($buttonId, 'colors_icon', '#FFFFFF'));
$button['icon_color_interaction'] = $this->fixColor($this->get15buttonValue($buttonId, 'colors_icon', '#FFFFFF'));
}
}
// Does it have a background image?
if ($this->get15buttonValue($buttonId, 'image', '') !== '') {
if ($this->get15buttonValue($buttonId, 'image_background', 0) == 1) {
$button['background_image'] = $this->get15buttonValue($buttonId, 'image', '');
// Empty icon
$button['icon'] = '';
$hasStyleChanges = true;
} else {
// is icon!
$button['icon_is_image'] = 'true';
$button['icon_image'] = $this->get15buttonValue($buttonId, 'image', '');
}
}
// Did it have a custom class
if ($this->get15buttonValue($buttonId, 'custom_class', '') !== '') {
$button['custom_class'] = $this->get15buttonValue($buttonId, 'custom_class', '');
}
// Time schedule
if ($this->get15buttonValue($buttonId, 'show_when_opened', 0) !== 0) {
$button['selected_schedule'] = $this->timeScheduleId;
}
// Page rule
if ($this->get15buttonValue($buttonId, 'show_on_pages', -1) >= 0) {
$button['selected_page_rule'] = $this->get15buttonValue($buttonId, 'show_on_pages', '');
}
// Using main button style
$button['use_main_button_style'] = $hasStyleChanges ? 'false' : 'true';
// Add button
$buttons[] = $button;
}
$menuStyle = $this->get15GeneralSettings('buttons_animation', 'default');
// Update to new style name
if ($menuStyle === 'circle') {
$menuStyle = 'corner-circle';
} else if ($menuStyle === 'fade-left-to-right') {
$menuStyle = 'faded';
}
// Group label
$showGroupLabel = $this->get15GeneralSettings('buttons_label_show_on_hover', 'always');
// Hover on desktop, show on mobile
if ($showGroupLabel === 'showOnHover') {
$showGroupLabelDesktop = 'hover';
$showGroupLabelMobile = 'always';
}
// Hover on desktop, hide on mobile
else if ($showGroupLabel === 'showOnHoverDesktop') {
$showGroupLabelDesktop = 'hover';
$showGroupLabelMobile = 'hide';
}
// Hide on desktop, show on mobile
else if ($showGroupLabel === 'showOnHoverMobile') {
$showGroupLabelDesktop = 'hide';
$showGroupLabelMobile = 'always';
}
// Always show label
else {
$showGroupLabelDesktop = 'always';
$showGroupLabelMobile = 'always';
}
$groups = [];
$groups[] = [
'data' => [
'name' => 'Buttonizer',
// Show on mobile and desktop
'show_desktop' => 'true',
'show_mobile' => 'true',
// Icon
'icon_is_image' => 'false',
'icon' => 'fa ' . $this->get15GeneralSettings('icon_icon', 'fa-plus'),
'icon_color' => $this->fixColor($this->get15GeneralSettings('icon_color', '#ffffff')),
'icon_color_interaction' => $this->fixColor($this->get15GeneralSettings('icon_color', '#ffffff')),
// Button background
'background_color' => $defaultButtonColor,
'background_color_interaction' => $defaultButtonColorHover,
// Position
'horizontal' => $this->get15GeneralSettings('position_horizontal', 5),
'vertical' => $this->get15GeneralSettings('position_bottom', 5),
'position' => (($this->get15GeneralSettings('position_horizontal', 5) != 5 || $this->get15GeneralSettings('position_vertical', 5) != 5) ? 'advanced' : 'bottomright'),
// Menu style & animation
'menu_style' => $menuStyle,
'menu_animation' => $this->get15GeneralSettings('attention_animation', 'none'),
// Label
'label' => $this->get15GeneralSettings('icon_label', ''),
'label_color' => $this->get15GeneralSettings('label_text_color', ''),
'label_background_color' => $this->get15GeneralSettings('label_color', ''),
// Show label
'show_label_desktop' => $showGroupLabelDesktop,
'show_label_mobile' => $showGroupLabelMobile,
'advanced_scroll' => $this->get15GeneralSettings('procent_to_scroll', ''),
'advanced_timeout' => $this->get15GeneralSettings('time_to_timeout', ''),
'advanced_exit_intent' => $this->get15GeneralSettings('enable_exit_intent', '')
],
'buttons' => $buttons
];
// Save new buttons and publish them
update_option('buttonizer_buttons', $groups);
update_option('buttonizer_buttons_published', $groups);
// Make backup from general settings and delete
update_option('buttonizer_general_settings_backup', $this->backupSettings);
delete_option('buttonizer_general_settings');
$this->removedAnything = true;
}
private function fixColor($hex)
{
if (strtoupper($hex) === '#FFFFF') {
return '#FFFFFF';
}
return $hex;
}
/**
* Convert 'opening hours' to time schedules
*/
private function convertTimeSchedules()
{
$days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
$newSchedule = [
'name' => 'First time schedule',
'id' => $this->timeScheduleId,
'weekdays' => [],
'custom' => [],
'dates' => [],
];
// Loop through all days
foreach ($days as $day) {
$opened = isset($this->backupSchedule['buttonizer_' . $day . '_opened']) && $this->backupSchedule['buttonizer_' . $day . '_opened'] == '1' ? 'true' : 'false';
$openingFrom = isset($this->backupSchedule['buttonizer_' . $day . '_opened_from']) ? $this->backupSchedule['buttonizer_' . $day . '_opened_from'] : '10:00';
$closingOn = isset($this->backupSchedule['buttonizer_' . $day . '_closing_on']) ? $this->backupSchedule['buttonizer_' . $day . '_closing_on'] : '17:00';
$newSchedule['weekdays'][] = [
'opened' => $opened,
'open' => $openingFrom,
'close' => $closingOn,
'weekday' => $day
];
}
// Save time schedule
update_option('buttonizer_schedules', [$newSchedule]);
// Make backup and delete old one
update_option('buttonizer_opening_settings_backup', $this->backupSchedule);
delete_option('buttonizer_opening_settings');
}
/**
* Convert page rules, not many changes though
*/
private function convertPageRules()
{
$pageRules = [];
// Full page rule
foreach ($this->backupRules as $pageRule) {
$container = [
'id' => $pageRule['id'],
'name' => $pageRule['title'],
'filter_role' => $pageRule['filter_role'],
'type' => $pageRule['andor'],
'rules' => []
];
$rules = [];
foreach ($pageRule['rules'] as $rule) {
$rules[] = [
'type' => $rule['type'],
'value' => $rule['value']
];
}
$container['rules'] = $rules;
$pageRules[] = $container;
}
// Save page rule
update_option('buttonizer_rules', $pageRules);
update_option('buttonizer_rules_published', $pageRules);
// Make backup and delete old one
update_option('buttonizer_page_categories_backup', $this->backupRules);
delete_option('buttonizer_page_categories');
}
/**
* Let's get the old Buttonizer values
*
* @param $id
* @param $option
* @param string $default
* @return mixed|string
*/
private function get15buttonValue($id, $option, $default = '')
{
$optionName = 'button_' . $id . '_' . $option;
// Option does not exists OR has no value
if (!isset($this->backupButtons[$optionName])) return $default;
return $this->backupButtons[$optionName];
}
/**
* Let's get the old Buttonizer values
*
* @param $option
* @param string $default
* @return mixed|string
*/
private function get15GeneralSettings($option, $default = '')
{
// Option does not exists OR has no value
if (!isset($this->backupSettings[$option])) return $default;
return $this->backupSettings[$option];
}
/**
* Cleanup
* @param bool $newInstall
*/
private function cleanup($newInstall = false)
{
$settings = [];
$settings['migration_version'] = BUTTONIZER_LAST_MIGRATION;
$settings['import_icon_library'] = true;
if ($newInstall === false) {
$settings['google_analytics'] = $this->get15GeneralSettings('google_analytics', '');
$settings['icon_library'] = 'fontawesome';
$settings['icon_library_version'] = '4.7.0';
} else {
$settings['google_analytics'] = '';
$settings['no_ajax'] = true;
$settings['icon_library'] = 'fontawesome';
$settings['icon_library_version'] = '5.free';
$settings['welcome'] = true;
}
update_option('buttonizer_settings', $settings);
}
/**
* Run update 2.0 to 2.1
*/
public function update20to21()
{
$this->registerSettings();
$groups = $this->convertButtons20to21($this->backupButtons);
$settings = get_option('buttonizer_settings');
//backup 2.0.x settings
update_option('buttonizer_buttons_backup_20', $this->backupButtons);
update_option('buttonizer_buttons_published_20', get_option('buttonizer_buttons_published'));
update_option('buttonizer_has_changes_20', get_option('buttonizer_has_changes'));
update_option('buttonizer_rules_20', get_option('buttonizer_rules'));
update_option('buttonizer_rules_published_20', get_option('buttonizer_rules_published'));
update_option('buttonizer_schedules_20', get_option('buttonizer_schedules'));
update_option('buttonizer_schedules_published_20', get_option('buttonizer_schedules_published'));
update_option('buttonizer_settings_20', get_option('buttonizer_settings'));
// Set migration version to 2.1
$settings["migration_version"] = "2.1";
update_option('buttonizer_settings', $settings);
// Overwrite new settings
update_option('buttonizer_buttons', $groups);
// If buttonizer was already published, update published.
if (get_option('buttonizer_buttons_published')) {
$published = $this->convertButtons20to21(get_option('buttonizer_buttons_published'));
update_option('buttonizer_buttons_published', $published);
}
// If buttonizer has timeschedules, convert booleans.
if (get_option('buttonizer_schedules')) {
$schedules = $this->convertSchedules20to21(get_option('buttonizer_schedules'));
update_option('buttonizer_schedules', $schedules);
}
// If buttonizer has timeschedules published, convert booleans.
if (get_option('buttonizer_schedules_published')) {
$schedules_published = $this->convertSchedules20to21(get_option('buttonizer_schedules_published'));
update_option('buttonizer_schedules_published', $schedules_published);
}
}
/**
* Return converted 2.0 schedule settings to 2.1
*/
private function convertSchedules20to21($array)
{
$schedules = [];
foreach ($array as $scheduleID) {
$scheduleID['end_date'] = date("d-m-Y", strtotime($scheduleID['end_date']));
$scheduleID['start_date'] = date("d-m-Y", strtotime($scheduleID['start_date']));
$weekdays = [];
foreach ($scheduleID["weekdays"] as $days) {
$days['opened'] = filter_var($days['opened'], FILTER_VALIDATE_BOOLEAN);
$weekdays[] = $days;
}
$dates = [];
foreach ($scheduleID["dates"] as $days) {
$days['opened'] = filter_var($days['opened'], FILTER_VALIDATE_BOOLEAN);
$days['date'] = date("d-m-Y", strtotime($days['date']));
$dates[] = $days;
}
$scheduleID['weekdays'] = $weekdays;
$scheduleID['dates'] = $dates;
$schedules[] = $scheduleID;
}
return $schedules;
}
/**
* Return converted 2.0 button settings to 2.1
*/
private function convertButtons20to21($array)
{
$groups = [];
foreach ($array as $group) {
// // if it has a background image, set background_is_image to true
if (!empty($group["data"]["background_image"])) {
$group["data"]["background_is_image"] = true;
}
// If icon is image and image size is not set, max width
if (!empty($group["data"]["icon_image"]) && empty($group["data"]["icon_image_size"])) {
$group["data"]["icon_image_size"] = "100";
$group["data"]["icon_size"] = "100";
}
$buttons = [];
foreach ($group["buttons"] as $button) {
// // if it has a background image, set background_is_image to true
if (!empty($button["background_image"])) {
$button["background_is_image"] = true;
}
// If icon is image and image size is not set, max width
if (!empty($button["icon_image"]) && empty($button["icon_image_size"])) {
$button["icon_image_size"] = "100";
$button["icon_size"] = "100";
}
// change all true values to boolean true
foreach (array_keys($button, "true", true) as $keys) {
$button[$keys] = true;
}
// change all false values to boolean false
foreach (array_keys($button, "false", true) as $keys) {
$button[$keys] = false;
}
$buttons[] = $button;
}
// change all true values to boolean true
foreach (array_keys($group["data"], "true", true) as $keys) {
$group["data"][$keys] = true;
}
// change all false values to boolean false
foreach (array_keys($group["data"], "false", true) as $keys) {
$group["data"][$keys] = false;
}
// Since we change how enabling of Exit Intent works on 2.1. Disable if exit intent is disabled
if ($group["data"]["exit_intent"] === false) {
$group["data"]["exit_intent_trigger_leaving_window"] = false;
$group["data"]["exit_intent_trigger_inactive"] = false;
}
$group["buttons"] = $buttons;
$groups[] = $group;
}
return $groups;
}
/**
* Run update 2.1.6 to 2.1.7
*/
public function update216to217()
{
$this->registerSettings();
$groups = $this->convertButtons21to22($this->backupButtons);
// If buttonizer was already published, update published.
if (get_option('buttonizer_buttons_published')) {
$published = $this->convertButtons21to22(get_option('buttonizer_buttons_published'));
update_option('buttonizer_buttons_published', $published);
}
// Get all current settings first
$settings = get_option('buttonizer_settings');
// Set migration version to 2.2
$settings["migration_version"] = "2.2";
update_option('buttonizer_settings', $settings);
// Overwrite new settings
update_option('buttonizer_buttons', $groups);
}
/**
* Convert buttons
*/
private function convertButtons21to22($array)
{
$groups = [];
foreach ($array as $group) {
// Convert position parameters
if (!empty($group["data"]["vertical"])) {
if ($group["data"]["vertical"] <= 50) $group["data"]["vertical"] = "bottom:" . $group['data']['vertical'] . '%;';
if ($group["data"]["vertical"] > 50) $group["data"]["vertical"] = "top:" . (100 - $group['data']['vertical']) . '%;';
}
if (!empty($group["data"]["horizontal"])) {
if ($group["data"]["horizontal"] <= 50) $group["data"]["horizontal"] = "right:" . $group['data']['horizontal'] . '%;';
if ($group["data"]["horizontal"] > 50) $group["data"]["horizontal"] = "left:" . (100 - $group['data']['horizontal']) . '%;';
}
$groups[] = $group;
}
return $groups;
}
/**
* Run update 2.1.9 to 2.2.0
*/
public function migration4()
{
$this->registerSettings();
$groups = $this->migration4UpdateData($this->backupButtons);
// If buttonizer was already published, update published.
if (get_option('buttonizer_buttons_published')) {
$published = $this->migration4UpdateData(get_option('buttonizer_buttons_published'));
update_option('buttonizer_buttons_published', $published);
}
// Get all current settings first
$settings = get_option('buttonizer_settings');
// Set migration version to 2.2, we're moving to numbers
$settings["migration_version"] = 4;
update_option('buttonizer_settings', $settings);
// Overwrite new settings
update_option('buttonizer_buttons', $groups);
}
/**
* Convert buttons
*/
private function migration4UpdateData($array)
{
$groups = [];
// Loop through the groups
foreach ($array as $group) {
//---------------- MIGRATE GROUP ----------------//
$group['data'] = $this->migration4UpdateColors($group['data']);
$group['data']['close_on_click_outside'] = false;
// migrate fonts
if (isset($group['data']['label_font_family'])) {
$fonts = "";
// combine the fonts
foreach ($group['data']['label_font_family'] as $font) {
$fonts .= ($fonts !== "" ? "," : "") . $font['title'];
}
$group['data']['label_font_family'] = $fonts;
}
if (isset($group["data"]["horizontal"])) {
preg_match_all('/^(right|left):\s*(\d+)(%|px);$/x', $group["data"]["horizontal"], $matches, PREG_SET_ORDER, 0);
// If results in (bottom/top): (number)(%/px);
$group["data"]["horizontal"] = is_numeric($matches[0][2]) ? $group["data"]["horizontal"] : "right: 5%;";
}
if (isset($group["data"]["vertical"])) {
preg_match_all('/^(bottom|top):\s*(\d+)(%|px);$/x', $group["data"]["vertical"], $matches, PREG_SET_ORDER, 0);
// If results in (bottom/top): (number)(%/px);
$group["data"]["vertical"] = is_numeric($matches[0][2]) ? $group["data"]["vertical"] : "bottom: 5%;";
}
//---------------- MIGRATE BUTTON ----------------//
// Update parameters
foreach ($group['buttons'] as $buttonKey => $button) {
// Loop through the items
$group['buttons'][$buttonKey] = $this->migration4UpdateColors($group['buttons'][$buttonKey]);
// Migrate button data
$group['buttons'][$buttonKey] = $this->migrate4Button($group['buttons'][$buttonKey], $group);
}
// Change opening animation
switch (isset($group['data']['menu_style']) ? $group['data']['menu_style'] : 'default') {
// Corner circle
case "faded":
case "corner-circle":
case "building-up":
case "pop":
$group['data']['menu_opening_animation'] = $group['data']['menu_style'];
// They all use the default menu style
unset($group['data']['menu_style']);
break;
// Square
case "square":
$group['data']['is_menu'] = false;
$group['data']['show_label_desktop'] = 'hover';
$group['data']['show_label_mobile'] = 'hide';
foreach ($group['buttons'] as $buttonKey => $button) {
// unset all buttons' label visibility
unset($group['buttons'][$buttonKey]['show_label_desktop']);
unset($group['buttons'][$buttonKey]['show_label_mobile']);
}
break;
// Rectangle
case "rectangle":
$group['data']['is_menu'] = false;
$group['data']['show_label_desktop'] = 'always';
$group['data']['show_label_mobile'] = 'always';
foreach ($group['buttons'] as $buttonKey => $button) {
// unset all buttons' label visibility
unset($group['buttons'][$buttonKey]['show_label_desktop']);
unset($group['buttons'][$buttonKey]['show_label_mobile']);
}
break;
// Text buttons aren't a menu by default
case "text":
case "text-icon":
$group['data']['is_menu'] = false;
break;
default:
// We don't need menu_style by default
// it will fallback to the buttonizer default values
unset($group['data']['menu_style']);
break;
}
$groups[] = $group;
}
return $groups;
}
private function migration4UpdateColors($data)
{
$mergedData = [
// Background color
[
"background_color" => "#48A4DC",
"background_color_interaction" => "#F08419"
],
// Icon color
[
"icon_color" => "#FFFFFF",
"icon_color_interaction" => "#FFFFFF"
],
// Label text color
[
"label_color" => "#FFFFFF",
"label_color_interaction" => "#FFFFFF"
],
// Label background color
[
"label_background_color" => "#333333",
"label_background_color_interaction" => "#333333"
]
];
// Loop through the items
foreach ($mergedData as $migrateGroup) {
$migrateData = "";
// Loop through the group defaults
foreach ($migrateGroup as $migrateGroupKey => $migrateGroupDefault) {
// Set if it DID change
if (isset($data[$migrateGroupKey]) && $data[$migrateGroupKey] != $migrateGroupDefault) {
$migrateData .= ($migrateData !== "" || strpos($migrateGroupKey, '_interaction') !== false ? ";" : '') . $data[$migrateGroupKey];
}
// Set if it DIDN'T change
if (!isset($data[$migrateGroupKey]) || isset($data[$migrateGroupKey]) && $data[$migrateGroupKey] == $migrateGroupDefault) {
$migrateData .= ($migrateData !== "" || strpos($migrateGroupKey, '_interaction') !== false ? ";" : '') . $data[$migrateGroupKey] = $migrateGroupDefault;
}
// Unset key if it exists
if (strpos($migrateData, ';') !== false) {
unset($data[$migrateGroupKey]);
}
}
// Remove data
if ($migrateData !== "") {
$data[key($migrateGroup)] = $migrateData;
} else if (isset($data[key($migrateGroup)])) {
unset($data[key($migrateGroup)]);
}
}
return $data;
}
private function migrate4Button($data, $group)
{
// Remove data if it used the group styling
if (!isset($data['use_main_button_style']) || (isset($data['use_main_button_style']) && $data['use_main_button_style'] == true)) {
unset($data['background_color']);
unset($data['background_is_image']);
unset($data['border_radius']);
unset($data['icon_color']);
unset($data['label_color']);
unset($data['label_background_color']);
unset($data['label_font_size']);
unset($data['label_font_family']);
unset($data['label_border_radius']);
unset($data['label_margin']);
unset($data['label_padding']);
}
// migrate fonts
if (isset($data['label_font_family'])) {
$fonts = "";
// combine the fonts
foreach ($data['label_font_family'] as $font) {
$fonts .= ($fonts !== "" ? "," : "") . $font['title'];
}
$data['label_font_family'] = $fonts;
}
// Since 2.2 now uses 42px buttons instead of transforming a 56px button into a 40px, sizes are a bit different.
if (!in_array($group['data']['menu_style'], ["square", "rectangle"], true)) {
if (isset($data['icon_size']) && is_numeric($data['icon_size'])) {
$data['icon_size'] = round((int)$data['icon_size'] / 56 * 42);
}
if (isset($data['icon_image_size']) && is_numeric($data['icon_image_size'])) {
$data['icon_image_size'] = round((int)$data['icon_image_size'] / 56 * 42);
}
if (isset($data['border_radius'])) {
preg_match_all('/(\d+)(px|%)/', $data['border_radius'], $sides, PREG_SET_ORDER, 0);
$newBorderRadius = '';
foreach ($sides as $side) {
$newBorderRadius .= ($newBorderRadius === '' ? "" : " ") . round($side[1] / 56 * 42) . $side[2];
}
$data['border_radius'] = $newBorderRadius;
} else if (isset($group['data']['border_radius']) && (!isset($data['use_main_button_style']) || (isset($data['use_main_button_style']) && $data['use_main_button_style'] == true))) {
preg_match_all('/(\d+)(px|%)/', $group['data']['border_radius'], $sides, PREG_SET_ORDER, 0);
$newBorderRadius = '';
foreach ($sides as $side) {
$newBorderRadius .= ($newBorderRadius === '' ? "" : " ") . round($side[1] / 56 * 42) . $side[2];
}
$data['border_radius'] = $newBorderRadius;
};
}
// Set label to always show if not set
if (!isset($data['show_label_desktop'])) $data['show_label_desktop'] = "always";
if (!isset($data['show_label_mobile'])) $data['show_label_mobile'] = "always";
// Add old default values if it isn't using group styling AND it wasn't set
if (isset($data['use_main_button_style']) && $data['use_main_button_style'] == false) {
if (!isset($data['background_is_image'])) $data['background_is_image'] = false;
if (!isset($data['border_radius'])) $data['border_radius'] = "50% 50% 50% 50%";
if (!isset($data['icon_image_border_radius'])) $data['icon_image_border_radius'] = 0;
if (!isset($data['label_font_size'])) $data['label_font_size'] = "12";
if (!isset($data['label_border_radius'])) $data['label_border_radius'] = "3px 3px 3px 3px";
if (!isset($data['label_margin'])) $data['label_margin'] = "0px 0px 0px 0px";
if (!isset($data['label_padding'])) $data['label_padding'] = "5px 15px 5px 15px";
}
unset($data['use_main_button_style']);
return $data;
}
/**
* Run update 2.5.3 to 2.5.4
*/
public function migration5()
{
$this->registerSettings();
$groups = $this->migration5UpdateData($this->backupButtons);
// var_dump($groups);
// If buttonizer was already published, update published.
if (get_option('buttonizer_buttons_published')) {
$published = $this->migration5UpdateData(get_option('buttonizer_buttons_published'));
update_option('buttonizer_buttons_published', $published);
}
// Get all current settings first
$settings = get_option('buttonizer_settings');
// Set migration version to 5
$settings["migration_version"] = 5;
update_option('buttonizer_settings', $settings);
// Overwrite new settings
update_option('buttonizer_buttons', $groups);
}
/**
* Convert buttons
*/
public function migration5UpdateData($array)
{
$groups = [];
// Loop through the groups
foreach ($array as $group) {
//---------------- MIGRATE GROUP ----------------//
// Remove data from certain meu styles
switch (isset($group['data']['menu_style']) ? $group['data']['menu_style'] : 'default') {
case "rectangle":
case "square":
unset($group['data']['border_radius']);
unset($group['data']['label_margin']);
unset($group['data']['label_padding']);
unset($group['data']['label_border_radius']);
foreach ($group['buttons'] as $buttonKey => $button) {
unset($group['buttons'][$buttonKey]['label_margin']);
unset($group['buttons'][$buttonKey]['label_padding']);
unset($group['buttons'][$buttonKey]['label_border_radius']);
}
break;
case "text":
unset($group['data']['label_background_color']);
unset($group['data']['label_border_radius']);
unset($group['data']['label_margin']);
unset($group['data']['label_padding']);
unset($group['data']['icon_is_image']);
foreach ($group['buttons'] as $buttonKey => $button) {
unset($group['buttons'][$buttonKey]['label_background_color']);
unset($group['buttons'][$buttonKey]['label_border_radius']);
unset($group['buttons'][$buttonKey]['label_margin']);
unset($group['buttons'][$buttonKey]['label_padding']);
unset($group['buttons'][$buttonKey]['icon_is_image']);
}
break;
case "text-icon":
unset($group['data']['label_background_color']);
unset($group['data']['label_border_radius']);
unset($group['data']['label_margin']);
unset($group['data']['label_padding']);
foreach ($group['buttons'] as $buttonKey => $button) {
unset($group['buttons'][$buttonKey]['label_background_color']);
unset($group['buttons'][$buttonKey]['label_border_radius']);
unset($group['buttons'][$buttonKey]['label_margin']);
unset($group['buttons'][$buttonKey]['label_padding']);
}
break;
}
// Replace icon_is_image with icon_type
if (isset($group['data']['icon_is_image'])) {
$group['data']['icon_type'] = $group['data']['icon_is_image'] === true ? "image" : "icon";
unset($group['data']['icon_is_image']);
}
foreach ($group['buttons'] as $buttonKey => $button) {
if (isset($group['buttons'][$buttonKey]['icon_is_image'])) {
$group['buttons'][$buttonKey]['icon_type'] = $group['buttons'][$buttonKey]['icon_is_image'] === true ? "image" : "icon";
unset($group['buttons'][$buttonKey]['icon_is_image']);
}
}
$groups[] = $group;
}
return $groups;
}
/**
* Run update 2.6.2
*/
public function migration6()
{
// $this->registerSettings();
// Back it up
update_option('buttonizer_rules_backup_6', get_option('buttonizer_rules'));
$rules = $this->migration6UpdateData(get_option('buttonizer_rules'));
// If buttonizer was already published, update published.
if (get_option('buttonizer_rules_published')) {
// Back it up
update_option('buttonizer_rules_published_backup_6', get_option('buttonizer_rules_published'));
$published = $this->migration6UpdateData(get_option('buttonizer_rules_published'));
update_option('buttonizer_rules_published', $published);
}
// Get all current settings first
$settings = get_option('buttonizer_settings');
// Set migration version to 6
$settings["migration_version"] = 6;
update_option('buttonizer_settings', $settings);
// Overwrite new settings
update_option('buttonizer_rules', $rules);
}
/**
* Convert rules
*/
public function migration6UpdateData($array)
{
$rules = [];
// Loop through the groups
foreach ($array as $rule) {
$conditions = [];
if (isset($rule["rules"])) {
foreach ($rule["rules"] as $condition) {
switch ($condition["type"]) {
case "page_title":
case "blog_title":
$condition["operator"] = "contains";
break;
case "url_match":
$condition["type"] = "path";
$condition["operator"] = "match";
break;
case "url_match_exact":
$condition["type"] = "path_query";
$condition["operator"] = "match";
break;
case "url_contains":
$condition["type"] = "url";
$condition["operator"] = "contains";
break;
case "url_starts":
$condition["type"] = "path";
$condition["operator"] = "begins_with";
$condition["value"] = (substr($condition['value'], 0, 1) !== '/' ? '/' : '') . $condition["value"];
break;
case "url_ends":
$condition["type"] = "path";
$condition["operator"] = "ends_with";
$condition["value"] = $condition["value"] . (substr($condition["value"], -1) !== '/' ? '/' : '');
break;
case "url_regex":
$condition["type"] = "url";
$condition["operator"] = "match_regex";
break;
case "page":
case "blog":
case "category":
case "user_roles":
// Add array operator to array types
$condition["operator"] = "is_any";
break;
}
$conditions[] = $condition;
}
}
// Add the type to condition group and conditions
$rule["groups"][0]["rules"] = $conditions;
$rule["groups"][0]["type"] = $rule["type"];
// Replace rule type with default "AND" and remove rules
$rule["type"] = "and";
unset($rule["rules"]);
$rules[] = $rule;
}
return $rules;
}
/**
* Run update menu button
*/
public function migrationTo7()
{
// Get all current settings first
$settings = get_option('buttonizer_settings');
// Set migration version to 7
$settings["migration_version"] = 7;
update_option('buttonizer_settings', $settings);
// Back it up
$groups = $this->migrationTo7UpdateData(get_option('buttonizer_buttons'));
// Overwrite new settings
update_option('buttonizer_buttons', $groups);
// If buttonizer was already published, update published.
if (get_option('buttonizer_buttons_published')) {
$published = $this->migrationTo7UpdateData(get_option('buttonizer_buttons_published'));
update_option('buttonizer_buttons_published', $published);
}
}
/**
* Move settings to menu button
*/
public function migrationTo7UpdateData($array)
{
$groups = [];
// Loop through the groups
foreach ($array as $group) {
//---------------- MIGRATE GROUP ----------------//
// Move all icon stuffs to menu button
if (isset($group['data']['icon'])) {
$group['menu_button']['icon'] = $group['data']['icon'];
unset($group['data']['icon']);
}
if (isset($group['data']['icon_type'])) {
$group['menu_button']['icon_type'] = $group['data']['icon_type'];
unset($group['data']['icon_type']);
}
if (isset($group['data']['icon_image'])) {
$group['menu_button']['icon_image'] = $group['data']['icon_image'];
unset($group['data']['icon_image']);
}
if (isset($group['data']['icon_size'])) {
$group['menu_button']['icon_size'] = $group['data']['icon_size'];
unset($group['data']['icon_size']);
}
if (isset($group['data']['icon_image_size'])) {
$group['menu_button']['icon_image_size'] = $group['data']['icon_image_size'];
unset($group['data']['icon_image_size']);
}
// If is menu is disabled, don't show menu button
if (isset($group['data']['is_menu']) && $group['data']['is_menu'] === false) {
$group['menu_button']['show_mobile'] = false;
$group['menu_button']['show_desktop'] = false;
unset($group['data']['is_menu']);
}
if (isset($group['data']['label'])) {
$group['menu_button']['label'] = $group['data']['label'];
unset($group['data']['label']);
}
// Move all menu stuffs to menu button
if (isset($group['data']['menu_opening_animation'])) {
$group['menu_button']['menu_opening_animation'] = $group['data']['menu_opening_animation'];
unset($group['data']['menu_opening_animation']);
}
if (isset($group['data']['start_opened'])) {
$group['menu_button']['start_opened'] = $group['data']['start_opened'];
unset($group['data']['start_opened']);
}
if (isset($group['data']['close_on_click_outside'])) {
$group['menu_button']['close_on_click_outside'] = $group['data']['close_on_click_outside'];
unset($group['data']['close_on_click_outside']);
}
if (isset($group['data']['close_on_click_inside'])) {
$group['menu_button']['close_on_click_inside'] = $group['data']['close_on_click_inside'];
unset($group['data']['close_on_click_inside']);
}
if (isset($group['data']['open_on_mouseover'])) {
$group['menu_button']['open_on_mouseover'] = $group['data']['open_on_mouseover'];
unset($group['data']['open_on_mouseover']);
}
if (isset($group['data']['close_on_mouseleave'])) {
$group['menu_button']['close_on_mouseleave'] = $group['data']['close_on_mouseleave'];
unset($group['data']['close_on_mouseleave']);
}
$groups[] = $group;
}
return $groups;
}
}