y_pop( $keys ); } return $values; } /** * Our options array has values (or defaults). * This method converts them to how we would store them * in the DB. * * @since 4.0.0 * * @param array $options The options array. * @return array The converted options array. */ public function convertOptionsToValues( $options, $optionKey = 'type' ) { foreach ( $options as $key => $value ) { if ( ! is_array( $value ) ) { continue; } if ( ! isset( $value[ $optionKey ] ) ) { $options[ $key ] = $this->convertOptionsToValues( $value, $optionKey ); continue; } $options[ $key ] = null; if ( isset( $value['value'] ) ) { $preserveHtml = ! empty( $value['preserveHtml'] ); if ( $preserveHtml ) { if ( is_array( $value['value'] ) ) { foreach ( $value['value'] as $k => $v ) { $value['value'][ $k ] = html_entity_decode( $v, ENT_NOQUOTES ); } } else { $value['value'] = html_entity_decode( $value['value'], ENT_NOQUOTES ); } } $options[ $key ] = $value['value']; continue; } if ( isset( $value['default'] ) ) { $options[ $key ] = $value['default']; } } return $options; } /** * This checks to see if the current array/option is really an option * and not just another parent with a subgroup. * * @since 4.0.0 * * @param string $key The current array key we are working with. * @param array $defaults The defaults array to check against. * @param array $keys The parent keys to loop through. * @return bool Whether or not this is an option. */ private function isAnOption( $key, $defaults, $keys ) { if ( ! empty( $keys ) ) { foreach ( $keys as $k ) { $defaults = isset( $defaults[ $k ] ) ? $defaults[ $k ] : []; } } if ( isset( $defaults[ $key ]['type'] ) ) { return $defaults[ $key ]; } return false; } /** * Refreshes the options from the database. * * We need this during the migration to update through clones. * * @since 4.0.0 * * @return void */ public function refresh() { // Reset DB options to clear the cache. aioseo()->core->optionsCache->resetDb(); $this->init(); } /** * Returns the DB options. * * @since 4.1.4 * * @param string $optionsName The options name. * @return array The options. */ public function getDbOptions( $optionsName ) { $cache = aioseo()->core->optionsCache->getDb( $optionsName ); if ( empty( $cache ) ) { $options = json_decode( get_option( $optionsName ), true ); $options = ! empty( $options ) ? $options : []; // Set the cache. aioseo()->core->optionsCache->setDb( $optionsName, $options ); } return aioseo()->core->optionsCache->getDb( $optionsName ); } /** * In order to not have a conflict, we need to return a clone. * * @since 4.0.0 * * @param bool $reInitialize Whether to reinitialize on the clone. * @return object The cloned Options object. */ public function noConflict( $reInitialize = false ) { $class = clone $this; $class->isClone = true; if ( $reInitialize ) { $class->init(); } return $class; } /** * Get original instance. Since this could be a cloned object, let's get the original instance. * * @since 4.1.4 * * @return self */ public function getOriginalInstance() { if ( ! $this->isClone ) { return $this; } $class = new \ReflectionClass( get_called_class() ); $optionName = aioseo()->helpers->toCamelCase( $class->getShortName() ); if ( isset( aioseo()->{ $optionName } ) ) { return aioseo()->{ $optionName }; } return $this; } }