wenpai.org/wp-content/plugins/elasticpress/uninstall.php
2024-06-21 23:57:39 +08:00

256 lines
5.7 KiB
PHP

<?php
/**
* ElasticPress uninstaller
*
* Used when clicking "Delete" from inside of WordPress's plugins page.
*
* @package elasticpress
* @since 1.7
*/
use ElasticPress\Utils;
defined( 'ABSPATH' ) || exit;
require_once __DIR__ . '/includes/utils.php';
/**
* Class EP_Uninstaller
*/
class EP_Uninstaller {
/**
* List of option keys that need to be deleted when uninstalling the plugin.
*
* @var array
*/
protected $options = [
'ep_host',
'ep_index_meta',
'ep_feature_settings',
'ep_feature_settings_draft',
'ep_version',
'ep_intro_shown',
'ep_last_sync',
'ep_need_upgrade_sync',
'ep_feature_requirement_statuses',
'ep_feature_auto_activated_sync',
'ep_hide_intro_shown_notice',
'ep_skip_install',
'ep_last_cli_index',
'ep_credentials',
'ep_prefix',
'ep_language',
'ep_bulk_setting',
'ep_sync_history',
'elasticpress_weighting',
// Admin notices options
'ep_hide_host_error_notice',
'ep_hide_es_below_compat_notice',
'ep_hide_es_above_compat_notice',
'ep_hide_need_setup_notice',
'ep_hide_no_sync_notice',
'ep_hide_upgrade_sync_notice',
'ep_hide_auto_activate_sync_notice',
'ep_hide_using_autosuggest_defaults_notice',
'ep_hide_yellow_health_notice',
];
/**
* List of transient keys that need to be deleted when uninstalling the plugin.
*
* @var array
*/
protected $transients = [
'ep_autosuggest_query_request_cache',
'ep_elasticpress_io_messages',
'ep_es_info',
'ep_es_info_response_code',
'ep_es_info_response_error',
'ep_meta_field_keys',
'ep_wpcli_sync',
'ep_wpcli_sync_interrupted',
'logging_ep_es_info',
];
/**
* Initialize uninstaller
*
* Perform some checks to make sure plugin can/should be uninstalled
*
* @since 1.7
*/
public function __construct() {
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
$this->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();