isAdmin()) { // Turn on maintenance mode before running the update. // In case the maintenance mode was already active, then // an error message will be thrown. static::setMaintenance(true); // process the update (we don't need to raise an error) VikBookingUpdateManager::update($version); // update cached plugin version update_option('vikbooking_software_version', VIKBOOKING_SOFTWARE_VERSION); // deactivate the maintenance mode on update completion static::setMaintenance(false); /** * Check if pro version, but attempt to re-download the Pro settings * within the current loading flow rather than redirecting. In case * something goes wrong, fallback to the old "get pro" redirect method. * * @since 1.5.11 */ if (VikBookingLicense::isPro()) { // load license model $model = JModel::getInstance('vikbooking', 'license', 'admin'); // download PRO version hoping that all will go fine $result = $model->download(VikBookingLicense::getKey()); if ($result === false) { // an error occurred, retrieve it as exception $error = $model->getError(null, $toString = true); // display exception error $app->enqueueMessage($error, 'error'); // fallback to the pro-package download page (old method) $app->redirect('index.php?option=com_vikbooking&view=getpro&version=' . $version); $app->close(); } } } } // check if the current instance is a new blog of a network else if (is_null($version)) { /** * The version is NULL, vikbooking_software_version doesn't * exist as an option of this blog. * We need to launch the installation manually. * * @see activate() * * @since 1.0.6 */ // Use FALSE to ignore the activation message static::activate(false); } } /** * Callback used to complete the update of the plugin * made after a scheduled event. * * @param array $results The results of all attempted updates. * * @return void * * @since 1.3.12 */ public static function automaticUpdate($results) { // create log trace $trace = '### VikBooking Automatic Update | ' . JHtml::fetch('date', new JDate(), 'Y-m-d H:i:s') . "\n\n"; $trace .= "```json\n" . json_encode($results, JSON_PRETTY_PRINT) . "\n```\n\n"; if (empty($results['plugin'])) { $results['plugin'] = []; } // iterate all plugins foreach ($results['plugin'] as $plugin) { if (!empty($plugin->item->slug)) { // register check trace $trace .= "Does `{$plugin->item->slug}` match `vikbooking`?\n\n"; // make sure the plugin slug matches this one if ($plugin->item->slug == 'vikbooking') { // register status trace $trace .= "Did WP complete the update without errors? [" . ($plugin->result ? 'Y' : 'N') . "]\n\n"; // plugin found, make sure the update was successful if ($plugin->result) { try { // register version trace $trace .= sprintf("Updating from [%s] to [%s]...\n\n", VIKBOOKING_SOFTWARE_VERSION, $plugin->item->new_version); // complete the update in background static::backgroundUpdate($plugin->item->new_version); // update completed without errors $trace .= "Background update completed\n\n"; } catch (Exception $e) { // something went wrong, register error within the trace $trace .= sprintf( "An error occurred while trying to finalize the update (%d):\n> %s\n\n", $e->getCode(), $e->getMessage() ); /** * @todo An error occurred while trying to download the PRO version, * evaluate to send an e-mail to the administrator. */ } } } } } // register debug trace within a log file JLoader::import('adapter.filesystem.file'); JFile::write(VIKBOOKING_BASE . DIRECTORY_SEPARATOR . 'au-log.md', $trace . "---\n\n"); } /** * Same as update task, but all made in background. * * @param string $new_version The new version of the plugin. * * @return void * * @since 1.3.12 */ protected static function backgroundUpdate($new_version) { // get installed software version $version = get_option('vikbooking_software_version', null); // DO NOT use shouldUpdate method because, since we are always within // the same flow, the version constant is still referring to the previous // version. So, always assume to proceed with the update of the plugin. // Turn on maintenance mode before running the update. // In case the maintenance mode was already active, then // an error message will be thrown. static::setMaintenance(true); // process the update (we don't need to raise an error) VikBookingUpdateManager::update($version); // update cached plugin version update_option('vikbooking_software_version', $new_version); // deactivate the maintenance mode on update completion static::setMaintenance(false); // check if pro version if (VikBookingLicense::isPro()) { // load license model $model = JModel::getInstance('vikbooking', 'license', 'admin'); // download PRO version hoping that all will go fine $result = $model->download(VikBookingLicense::getKey()); if ($result === false) { // an error occurred, retrieve it as exception $error = $model->getError(null, $toString = false); // propagate exception throw $error; } } } /** * Checks whether the automatic updates should be turned off. * This is useful to prevent auto-updates for those customers * that are running an expired PRO version. This will avoid * losing the files after an unexpected update. * * @param boolean $update The current auto-update choice. * @param object $item The plugin offer. * * @return mixed Null to let WP decides, false to always deny it. * * @since 1.3.12 */ public static function useAutoUpdate($update, $item) { // make sure we are fetching VikBooking if (!empty($item->slug) && $item->slug == 'vikbooking') { // plugin found, lets check whether the user is // not running the PRO version if (!VikBookingLicense::isPro()) { // not a PRO version, check whether a license // key was registered if (VikBookingLicense::getKey()) { // The plugin registered a key; the customer // chose to let the license expires... // We need to prevent auto-updates. $update = false; } } } return $update; } /** * Toggle maintenance mode for the site. * Creates/deletes the maintenance file to enable/disable maintenance mode. * * @param boolean $enable True to enable maintenance mode, false to disable. * * @return void * * @since 1.4.4 * @since 1.4.7 the maintenance mode also relies on database options, not only on a file. * we also allow to turn off/skip maintenance mode by passing a value in query string. */ protected static function setMaintenance($enable) { $maintenance_file_path = VIKBOOKING_BASE . '/maintenance.txt'; $maintenance_db_option = 'vikbooking_maintenance'; if ($enable) { // check if we are in maintenance mode if (JFile::exists($maintenance_file_path) && get_option($maintenance_db_option, null) !== null) { // allow to skip maintenance mode via query string if (JFactory::getApplication()->input->getInt('skip_maintenance', 0)) { // turn off maintenance mode return static::setMaintenance(false); } // raise error message in case the update process is currently running $skip_maintenance_url = JUri::current(); $skip_maintenance_url .= (strpos($skip_maintenance_url, '?') === false ? '?' : '&') . 'skip_maintenance=1'; wp_die( // message to be displayed '

Maintenance

' . '

VikBooking is in maintenance mode. Please wait a minute for the update to complete.

', // page title to set 'Maintenance', // arguments to control behavior array( // set link for the message to be displayed 'link_url' => $skip_maintenance_url, 'link_text' => 'Skip Maintenance', // HTTP error code "locked" 'code' => 423, ) ); } // make sure no time limits will impact the process to restore the necessary files set_time_limit(0); // enter maintenance mode for the current version JFile::write($maintenance_file_path, VIKBOOKING_SOFTWARE_VERSION); update_option($maintenance_db_option, VIKBOOKING_SOFTWARE_VERSION); } else { // turn off maintenance mode JFile::delete($maintenance_file_path); delete_option($maintenance_db_option); } } /** * In case of an expired PRO version, prompts a message informing * the user that it is going to lose the PRO features. * * @param array $data An array of plugin metadata. * @param array $response An array of metadata about the available plugin update. * * @return void * * @since 1.3.12 */ public static function getUpdateMessage($data, $response) { // check whether the user is not running the PRO version if (!VikBookingLicense::isPro()) { // not a PRO version, check whether a license // key was registered if (VikBookingLicense::getKey()) { // The plugin registered a key; the customer // chose to let the license expires... // We need to display an alert. add_action('admin_footer', function() use ($data, $response) { // display layout echo JLayoutHelper::render( 'html.license.update', array($data, $response), null, array('component' => 'com_vikbooking') ); }); } } } /** * Method used to check for any installation message to show. * * @return void */ public static function handleMessage() { $app = JFactory::getApplication(); // if we are in the admin section and the plugin has been activated if ($app->isAdmin() && get_option('vikbooking_onactivate') == 1) { // delete the activation flag to avoid displaying the message more than once delete_option('vikbooking_onactivate'); ?>

Thanks for activating our plugin! https://vikwp.com

input->cookie->getInt('vbo_update_warning_hide', 0)) { ?>