exit_uninstaller(); } // If testing, do not do anything automatically if ( defined( 'EP_UNIT_TESTS' ) && EP_UNIT_TESTS ) { return; } // EP_MANUAL_SETTINGS_RESET is used by the `settings-reset` WP-CLI command. if ( ! defined( 'EP_MANUAL_SETTINGS_RESET' ) || ! EP_MANUAL_SETTINGS_RESET ) { // Not uninstalling. if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) || ! WP_UNINSTALL_PLUGIN ) { $this->exit_uninstaller(); } // Not uninstalling this plugin. if ( dirname( WP_UNINSTALL_PLUGIN ) !== dirname( plugin_basename( __FILE__ ) ) ) { $this->exit_uninstaller(); } } // Uninstall ElasticPress. $this->clean_options_and_transients(); $this->clean_site_meta(); $this->remove_elasticpress_capability(); } /** * Delete all the options in a single site context. */ protected function delete_options() { foreach ( $this->options as $option ) { delete_option( $option ); } } /** * Delete all the transients in a single site context. */ protected function delete_transients() { foreach ( $this->transients as $transient ) { delete_transient( $transient ); } } /** * Delete remaining transients by their option names. * * @since 4.7.0 */ protected function delete_transients_by_option_name() { global $wpdb; $transients = $wpdb->get_col( // phpcs:ignore WordPress.DB.DirectDatabaseQuery "SELECT option_name FROM {$wpdb->prefix}options WHERE option_name LIKE '_transient_ep_index_settings_%' OR option_name LIKE '_transient_ep_related_posts_%' " ); foreach ( $transients as $transient ) { $transient_name = str_replace( '_transient_', '', $transient ); delete_site_transient( $transient_name ); delete_transient( $transient_name ); } } /** * DEPRECATED. Delete all transients of the Related Posts feature. */ protected function delete_related_posts_transients() { _deprecated_function( __METHOD__, '4.7.0', '\EP_Uninstaller::delete_transients_by_name()' ); } /** * DEPRECATED. Delete all transients of the total fields limit. */ protected function delete_total_fields_limit_transients() { _deprecated_function( __METHOD__, '4.7.0', '\EP_Uninstaller::delete_transients_by_name()' ); } /** * Cleanup options and transients * * Deletes ElasticPress options and transients. * * @since 4.2.0 */ protected function clean_options_and_transients() { if ( is_multisite() ) { foreach ( $this->options as $option ) { delete_site_option( $option ); } foreach ( $this->transients as $transient ) { delete_site_transient( $transient ); } $sites = \get_sites(); foreach ( $sites as $site ) { switch_to_blog( $site->blog_id ); $this->delete_options(); $this->delete_transients(); $this->delete_transients_by_option_name(); restore_current_blog(); } } else { $this->delete_options(); $this->delete_transients(); $this->delete_transients_by_option_name(); } } /** * Delete all site meta * * @since 4.7.0 */ protected function clean_site_meta() { if ( ! is_multisite() ) { return; } $sites = Utils\get_sites(); foreach ( $sites as $site ) { delete_site_meta( $site['blog_id'], 'ep_indexable' ); } } /** * Remove the ElasticPress' capability * * @since 4.5.0 */ protected function remove_elasticpress_capability() { $role = get_role( 'administrator' ); $role->remove_cap( Utils\get_capability() ); } /** * Cleanup options (deprecated, kept for documenting reasons.) * * @since 1.7 * @return void * @see clean_options_and_transients */ protected static function clean_options() { _deprecated_function( __FUNCTION__, '4.2.0', '\EP_Uninstaller->clean_options_and_transients()' ); } /** * Exit uninstaller * * Gracefully exit the uninstaller if we should not be here * * @since 1.7 * @return void */ protected function exit_uninstaller() { status_header( 404 ); exit; } } new EP_Uninstaller();