autoload ) === $wants_load ) { return new WP_Error( 'unchanged', __( 'The option already has this setting.', '360-orbit-database-cleaner' ) ); } // Erst sichern, dann aendern: Scheitert die Aenderung, bleibt hoechstens // ein harmloser Eintrag, der unten wieder entfernt wird. $before = self::backups(); update_option( Wp360_Database_Cleaner_Autoload_Backup::OPTION_KEY, Wp360_Database_Cleaner_Autoload_Backup::merge( $before, $row->option_name, $row->autoload, $target, time() ), false ); if ( ! wp_set_option_autoload( $row->option_name, $wants_load ) ) { update_option( Wp360_Database_Cleaner_Autoload_Backup::OPTION_KEY, $before, false ); return new WP_Error( 'failed', __( 'The option could not be changed.', '360-orbit-database-cleaner' ) ); } if ( $log ) { Wp360_Database_Cleaner_History::add( $wants_load ? 'autoload_on' : 'autoload_off', array( 'name' => $row->option_name, 'previous' => $row->autoload, ) ); } return array( 'name' => $row->option_name, 'previous' => $row->autoload, 'target' => $target, ); } /** * Nimmt eine Aenderung zurueck: stellt das urspruengliche Lade-Verhalten wieder her. * * @param string $name Optionsname. * @param bool $log Eintrag im Verlauf anlegen. * @return array{name: string}|WP_Error */ public static function undo( $name, $log = true ) { $backups = self::backups(); if ( ! isset( $backups[ $name ] ) ) { return new WP_Error( 'no_backup', __( 'There is no saved change for this option.', '360-orbit-database-cleaner' ) ); } $row = self::check( $name ); if ( is_wp_error( $row ) ) { // Die Option gibt es nicht mehr: der Eintrag ist wertlos. if ( 'missing' === $row->get_error_code() ) { update_option( Wp360_Database_Cleaner_Autoload_Backup::OPTION_KEY, Wp360_Database_Cleaner_Autoload_Backup::remove( $backups, $name ), false ); } return $row; } $should_load = Wp360_Database_Cleaner_Autoload_Classifier::loads( $backups[ $name ]['previous'] ); if ( Wp360_Database_Cleaner_Autoload_Classifier::loads( $row->autoload ) !== $should_load && ! wp_set_option_autoload( $row->option_name, $should_load ) ) { return new WP_Error( 'failed', __( 'The option could not be changed.', '360-orbit-database-cleaner' ) ); } update_option( Wp360_Database_Cleaner_Autoload_Backup::OPTION_KEY, Wp360_Database_Cleaner_Autoload_Backup::remove( $backups, $name ), false ); if ( $log ) { Wp360_Database_Cleaner_History::add( 'autoload_undo', array( 'name' => $row->option_name ) ); } return array( 'name' => $row->option_name ); } /** * Gesicherte Aenderungen (Optionsname => Ausgangswert, Ziel, Zeit). * * @return array */ public static function backups() { $backups = get_option( Wp360_Database_Cleaner_Autoload_Backup::OPTION_KEY, array() ); return is_array( $backups ) ? $backups : array(); } /** * Prueft Sperrliste und Vorhandensein und liefert die Zeile aus wp_options. * * @param string $name Optionsname. * @return object|WP_Error Zeile mit option_name und autoload. */ private static function check( $name ) { global $wpdb; $reason = Wp360_Database_Cleaner_Autoload_Guard::lock_reason( $name ); if ( null !== $reason ) { return new WP_Error( 'locked', self::lock_message( $reason ) ); } // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Lesen des Spaltenwerts autoload; kein Cache, der Wert ist die Grundlage der Aenderung. $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_name, autoload FROM {$wpdb->options} WHERE option_name = %s LIMIT 1", $name ) ); if ( ! $row ) { return new WP_Error( 'missing', __( 'This option does not exist.', '360-orbit-database-cleaner' ) ); } // Die Datenbank vergleicht ohne Beachtung der Schreibweise: der gespeicherte Name zaehlt. $stored_reason = Wp360_Database_Cleaner_Autoload_Guard::lock_reason( $row->option_name ); if ( null !== $stored_reason ) { return new WP_Error( 'locked', self::lock_message( $stored_reason ) ); } return $row; } /** * @param string $reason 'core', 'transient', 'self' oder 'invalid'. * @return string */ public static function lock_message( $reason ) { switch ( $reason ) { case 'transient': return __( 'Transients are handled under Clean up, not here.', '360-orbit-database-cleaner' ); case 'self': return __( 'This is a setting of this plugin and cannot be changed.', '360-orbit-database-cleaner' ); case 'invalid': return __( 'Invalid option name.', '360-orbit-database-cleaner' ); default: return __( 'This is a WordPress core option and cannot be changed.', '360-orbit-database-cleaner' ); } } }