id ) { return false; } return true; } /** * Checks if another version of WPMDB(Pro) is active and deactivates it. * To be hooked on `activated_plugin` so other plugin is deactivated when current plugin is activated. * * @param string $plugin * */ public static function deactivate_other_instances( $plugin ) { if ( ! in_array( basename( $plugin ), array( 'wp-migrate-db-pro.php', 'wp-migrate-db.php' ) ) ) { return; } $plugin_to_deactivate = 'wp-migrate-db.php'; $deactivated_notice_id = '1'; if ( basename( $plugin ) == $plugin_to_deactivate ) { $plugin_to_deactivate = 'wp-migrate-db-pro.php'; $deactivated_notice_id = '2'; } if ( is_multisite() ) { $active_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); $active_plugins = array_keys( $active_plugins ); } else { $active_plugins = (array) get_option( 'active_plugins', array() ); } foreach ( $active_plugins as $basename ) { if ( false !== strpos( $basename, $plugin_to_deactivate ) ) { set_transient( 'wp_migrate_db_deactivated_notice_id', $deactivated_notice_id, 1 * HOUR_IN_SECONDS ); deactivate_plugins( $basename ); return; } } } /** * Return unserialized object or array * * @param string $serialized_string Serialized string. * @param string $method The name of the caller method. * * @return mixed, false on failure */ public static function unserialize( $serialized_string, $method = '' ) { if ( ! is_serialized( $serialized_string ) ) { return false; } $serialized_string = trim( $serialized_string ); $unserialized_string = @unserialize( $serialized_string ); if ( false === $unserialized_string && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) { $scope = $method ? sprintf( __( 'Scope: %s().', 'wp-migrate-db' ), $method ) : false; $error = sprintf( __( 'WPMDB Error: Data cannot be unserialized. %s', 'wp-migrate-db' ), $scope ); error_log( $error ); } return $unserialized_string; } /** * Use wp_unslash if available, otherwise fall back to stripslashes_deep * * @param string|array $arg * * @return string|array */ public static function safe_wp_unslash( $arg ) { if ( function_exists( 'wp_unslash' ) ) { return wp_unslash( $arg ); } else { return stripslashes_deep( $arg ); } } /** * Use gzdecode if available, otherwise fall back to gzinflate * * @param string $data * * @return string|bool */ public static function gzdecode( $data ) { if ( ! function_exists( 'gzdecode' ) ) { return @gzinflate( substr( $data, 10, - 8 ) ); } return @gzdecode( $data ); } /** * Require wpmdb-wpdb and create new instance * * @return WPMDB_WPDB */ public static function make_wpmdb_wpdb_instance() { if ( ! class_exists( 'WPMDB_WPDB' ) ) { require_once dirname( __FILE__ ) . '/wpmdb-wpdb.php'; } return new WPMDB_WPDB(); } /** * Wrapper for replacing first instance of string * * @return string */ public static function str_replace_first( $search, $replace, $string ) { $pos = strpos( $string, $search ); if ( false !== $pos ) { $string = substr_replace( $string, $replace, $pos, strlen( $search ) ); } return $string; } /** * Runs WPs create nonce with all filters removed * * @param string|int $action Scalar value to add context to the nonce. * * @return string The Token */ public static function create_nonce( $action = - 1 ) { global $wp_filter; $filter_backup = $wp_filter; WPMDB_Utils::filter_nonce_filters(); $return = wp_create_nonce( $action ); $wp_filter = $filter_backup; return $return; } /** * Runs WPs check ajax_referer [sic] with all filters removed * * @param int|string $action Action nonce. * @param false|string $query_arg Optional. Key to check for the nonce in `$_REQUEST` (since 2.5). If false, * `$_REQUEST` values will be evaluated for '_ajax_nonce', and '_wpnonce' * (in that order). Default false. * @param bool $die Optional. Whether to die early when the nonce cannot be verified. * Default true. * * @return false|int False if the nonce is invalid, 1 if the nonce is valid and generated between * 0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago. */ public static function check_ajax_referer( $action = - 1, $query_arg = false, $die = true ) { global $wp_filter; $filter_backup = $wp_filter; WPMDB_Utils::filter_nonce_filters(); $return = check_ajax_referer( $action, $query_arg, $die ); $wp_filter = $filter_backup; return $return; } /** * Removes filters from $wp_filter that might interfere with wpmdb nonce generation/checking */ private static function filter_nonce_filters() { global $wp_filter; $filtered_filters = apply_filters( 'wpmdb_filtered_filters', array( 'nonce_life', ) ); foreach ( $filtered_filters as $filter ) { unset( $wp_filter[ $filter ] ); } } /** * * Checks if the current request is a WPMDB request * * @return bool */ public static function is_wpmdb_ajax_call() { if ( ( defined( 'DOING_AJAX' ) && DOING_AJAX ) && ( isset( $_POST['action'] ) && false !== strpos( $_POST['action'], 'wpmdb' ) ) ) { return true; } return false; } /** * * Sets 'Expect' header to an empty string which some server/host setups require * * Called from the `http_request_args` filter * * @param $r * @param $url * * @return mixed */ public static function preempt_expect_header( $r, $url ) { if ( self::is_wpmdb_ajax_call() ) { $r['headers']['Expect'] = ''; } return $r; } /* * Patch wp_parse_url if it doesn't exist * for compatibility with WP < 4.4 */ public static function parse_url( $url ) { if ( function_exists( 'wp_parse_url' ) ) { return wp_parse_url( $url ); } $parts = @parse_url( $url ); if ( ! $parts ) { // < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path if ( '/' == $url[0] && false !== strpos( $url, '://' ) ) { // Since we know it's a relative path, prefix with a scheme/host placeholder and try again if ( ! $parts = @parse_url( 'placeholder://placeholder' . $url ) ) { return $parts; } // Remove the placeholder values unset( $parts['scheme'], $parts['host'] ); } else { return $parts; } } // < PHP 5.4.7 compat, doesn't detect schemeless URL's host field if ( '//' == substr( $url, 0, 2 ) && ! isset( $parts['host'] ) ) { $path_parts = explode( '/', substr( $parts['path'], 2 ), 2 ); $parts['host'] = $path_parts[0]; if ( isset( $path_parts[1] ) ) { $parts['path'] = '/' . $path_parts[1]; } else { unset( $parts['path'] ); } } return $parts; } }