base_prefix . 'options'; } /** * @param string $name Option name. * @param mixed $default Returned when missing. * @return mixed */ public static function get( $name, $default = null ) { global $wpdb; $table = self::table(); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $raw = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM %i WHERE option_name = %s LIMIT 1", $table, $name ) ); if ( null === $raw ) { return $default; } return maybe_unserialize( $raw ); } /** * Upsert. Returns false when the database refused the write. * * @param string $name Option name. * @param mixed $value Value (serialized when needed). * @return bool */ public static function set( $name, $value ) { global $wpdb; $table = self::table(); $data = maybe_serialize( $value ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $ok = $wpdb->query( $wpdb->prepare( "INSERT INTO %i (option_name, option_value, autoload) VALUES (%s, %s, 'no') ON DUPLICATE KEY UPDATE option_value = VALUES(option_value)", $table, $name, $data ) ); self::forget( $name ); return false !== $ok; } /** * Insert only if absent. True when this call created the row (atomic). * * @param string $name Option name. * @param mixed $value Value. * @return bool */ public static function add( $name, $value ) { global $wpdb; $table = self::table(); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO %i (option_name, option_value, autoload) VALUES (%s, %s, 'no')", $table, $name, maybe_serialize( $value ) ) ); self::forget( $name ); return 1 === (int) $wpdb->rows_affected; } /** * Compare-and-swap. True when exactly one row changed from $old to $new. * * @param string $name Option name. * @param string $old Expected current raw value. * @param string $new New raw value. * @return bool */ public static function swap( $name, $old, $new ) { global $wpdb; $table = self::table(); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( "UPDATE %i SET option_value = %s WHERE option_name = %s AND option_value = %s", $table, $new, $name, $old ) ); self::forget( $name ); return 1 === (int) $wpdb->rows_affected; } /** * Delete; with $only_if, only when the stored raw value matches. * * @param string $name Option name. * @param string|null $only_if Expected raw value. */ public static function delete( $name, $only_if = null ) { global $wpdb; $table = self::table(); if ( null === $only_if ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( "DELETE FROM %i WHERE option_name = %s", $table, $name ) ); } else { // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( "DELETE FROM %i WHERE option_name = %s AND option_value = %s", $table, $name, $only_if ) ); } self::forget( $name ); } /** * Delete every dbmg_* option (uninstall / delete-all). */ public static function delete_all() { global $wpdb; $table = self::table(); // phpcs:ignore WordPress.DB.DirectDatabaseQuery $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE option_name LIKE %s', $table, $wpdb->esc_like( 'dbmg_' ) . '%' ) ); wp_cache_delete( 'alloptions', 'options' ); } /** * Keep WordPress's own option cache honest after a direct write. * * @param string $name Option name. */ private static function forget( $name ) { wp_cache_delete( $name, 'options' ); } }