/**
  * Initialization routine. Sets version, directory, url, adds WordPress hooks, includes includes, triggers index
  *
  * @uses  get_post_types to determine which post types are in use
  * @since 1.0
  */
 function init()
 {
     $this->version = SEARCHWP_VERSION;
     $this->dir = dirname(__FILE__);
     $this->url = plugin_dir_url(__FILE__);
     $this->pid = str_replace('.', '', uniqid('swppid', true));
     // includes
     include_once dirname(__FILE__) . '/includes/class.debug.php';
     include_once dirname(__FILE__) . '/includes/class.stemmer.php';
     include_once dirname(__FILE__) . '/includes/class.indexer.php';
     include_once dirname(__FILE__) . '/templates/tmpl.engine.config.php';
     include_once dirname(__FILE__) . '/templates/tmpl.supplemental.config.php';
     include_once dirname(__FILE__) . '/includes/class.search.php';
     include_once dirname(__FILE__) . '/includes/class.upgrade.php';
     include_once dirname(__FILE__) . '/admin/class.admin-settings.php';
     include_once dirname(__FILE__) . '/admin/class.extensions.php';
     include_once dirname(__FILE__) . '/admin/class.nags.php';
     if (is_admin()) {
         include_once dirname(__FILE__) . '/admin/class.conflicts.php';
         include_once dirname(__FILE__) . '/admin/class.notices.php';
         include_once dirname(__FILE__) . '/admin/class.dashboard.php';
         include_once dirname(__FILE__) . '/admin/class.systeminfo.php';
     }
     include_once dirname(__FILE__) . '/includes/class.swp-query.php';
     // instantiate nags
     $this->nags_utils = new SearchWP_Nags();
     $this->nags_utils->init();
     // grab our settings
     $this->settings = get_option(SEARCHWP_PREFIX . 'settings');
     $this->license = searchwp_get_license_key();
     $this->status = get_option(SEARCHWP_PREFIX . 'license_status');
     // append our indexer-specific settings since they're stored separately
     if ($indexer_settings = get_option(SEARCHWP_PREFIX . 'indexer')) {
         $this->settings = array_merge($this->settings, $indexer_settings);
     }
     // instantiate settings UI
     $this->settings_utils = new SearchWP_Admin_Settings();
     $this->settings_utils->init();
     // implement Advanced settings and License management
     include_once dirname(__FILE__) . '/admin/settings-impl-advanced.php';
     include_once dirname(__FILE__) . '/admin/settings-impl-license.php';
     // introduced in version 2.5.7 as per WordPress 4.2
     $this->settings['utf8mb4'] = get_option(SEARCHWP_PREFIX . 'utf8mb4');
     // hooks
     add_filter('block_local_requests', '__return_false');
     add_action('admin_menu', array($this, 'admin_menu'));
     add_action('admin_init', array($this, 'init_settings'));
     add_action('init', array($this, 'textdomain'));
     add_action('admin_notices', array($this, 'activation'));
     add_filter('cron_schedules', array($this, 'add_custom_cron_interval'));
     add_action('admin_init', array($this, 'schedule_maintenance'));
     add_action('swp_indexer', array($this, 'do_cron'));
     add_action('admin_enqueue_scripts', array($this, 'assets'));
     add_filter('heartbeat_received', array($this, 'heartbeat_received'), 10, 2);
     add_action('pre_get_posts', array($this, 'check_for_main_query'), 0);
     add_filter('the_posts', array($this, 'wp_search'), 0, 2);
     add_filter('posts_request', array($this, 'maybe_cancel_wp_query'));
     add_action('add_meta_boxes', array($this, 'document_content_meta_box'));
     add_action('edit_attachment', array($this, 'document_content_save'));
     add_action('wp_before_admin_bar_render', array($this, 'admin_bar_menu'));
     add_action('shutdown', array($this, 'shutdown'), 9999);
     add_action('wp_footer', array($this, 'maybe_output_debug'));
     add_action('wp_footer', array($this, 'admin_bar_entry_for_search'));
     add_action('wp_loaded', array($this, 'load'));
     add_action('init', array($this, 'prepare_endpoint'));
     add_filter('plugin_action_links_searchwp/searchwp.php', array($this, 'plugin_update_link'));
     // license maintenance (triggered by cron job)
     $license_utils = new SearchWP_Settings_Implementation_License();
     add_action('swp_maintenance', array($license_utils, 'do_maintenance'));
     // support WordPress Importer by auto-pausing during imports
     add_action('import_start', array($this, 'indexer_pause'));
     add_action('import_end', array($this, 'indexer_unpause'));
     add_action('wp_ajax_searchwp_alternate_indexer_trigger', array($this, 'handle_alternate_indexer_request'));
     // internal hooks
     add_filter('searchwp_results', array($this, 'maybe_append_weight_to_result_title'), 10, 2);
 }
 /**
  * Perform periodic maintenance
  *
  * @return bool
  * @since 1.0
  */
 function do_maintenance()
 {
     do_action('searchwp_log', 'do_maintenance()');
     $license = searchwp_get_license_key();
     $license = sanitize_text_field($license);
     $api_params = array('edd_action' => 'check_license', 'license' => $license, 'item_name' => urlencode(SEARCHWP_EDD_ITEM_NAME));
     $api_args = array('timeout' => 30, 'sslverify' => false, 'body' => $api_params);
     $response = wp_remote_post(SEARCHWP_EDD_STORE_URL, $api_args);
     if (is_wp_error($response)) {
         return false;
     }
     $license_data = json_decode(wp_remote_retrieve_body($response));
     if ('valid' != $license_data->license) {
         do_action('searchwp_log', 'License not valid');
         delete_option(SEARCHWP_PREFIX . 'license_status');
         delete_option(SEARCHWP_PREFIX . 'license_expiration');
     }
     return true;
 }