$val ) { if ( is_null( $val ) ) { continue; } if ( is_array( $val ) ) { $result[ $key ] = avc_ais_filter_null_option_values( $val ); } else { $result[ $key ] = $val; } } return $result; } // Register null filters for all plugin options at the earliest point. add_filter( 'option_avc_ais_options', 'avc_ais_filter_null_option_values', 1 ); add_filter( 'option_avc_ais_settings', 'avc_ais_filter_null_option_values', 1 ); add_filter( 'option_avc_ais_wizard_progress', 'avc_ais_filter_null_option_values', 1 ); // Composer autoloader or PSR-4 fallback. $avc_ais_autoloader = AVC_AIS_DIR . 'vendor/autoload.php'; if ( file_exists( $avc_ais_autoloader ) ) { require_once $avc_ais_autoloader; } else { spl_autoload_register( static function ( $class_name ) { // PSR-4 (namespaced). $prefix = 'Aivec\\AiSearchSchema\\'; $base_dir = AVC_AIS_DIR . 'src/'; $len = strlen( $prefix ); if ( strncmp( $prefix, $class_name, $len ) === 0 ) { $relative_class = substr( $class_name, $len ); $file = $base_dir . str_replace( '\\', '/', $relative_class ) . '.php'; if ( file_exists( $file ) ) { require $file; } return; } // Legacy global classes (AVC_AIS_*). $legacy_prefix = 'AVC_AIS_'; if ( strpos( $class_name, $legacy_prefix ) === 0 ) { $relative = substr( $class_name, strlen( $legacy_prefix ) ); $slug = strtolower( str_replace( '_', '-', $relative ) ); if ( 'Schema' === $relative ) { $file = AVC_AIS_DIR . 'includes/class-avc-ais-schema.php'; } elseif ( strpos( $relative, 'Type_' ) === 0 ) { $file = AVC_AIS_DIR . 'src/Schema/Type/class-avc-ais-' . $slug . '.php'; } elseif ( strpos( $relative, 'Adapter_' ) === 0 ) { $adapter_slug = strtolower( str_replace( '_', '-', substr( $relative, strlen( 'Adapter_' ) ) ) ); $file = AVC_AIS_DIR . 'src/Schema/Adapter/class-avc-ais-' . $adapter_slug . '.php'; } else { $file = AVC_AIS_DIR . 'src/Schema/class-avc-ais-' . $slug . '.php'; } if ( file_exists( $file ) ) { require $file; return; } // Fallback to includes/ directory. $includes_file = AVC_AIS_DIR . 'includes/class-avc-ais-' . $slug . '.php'; if ( file_exists( $includes_file ) ) { require $includes_file; } } } ); } /** * Plugin entrypoint. * * @return \Aivec\AiSearchSchema\Plugin */ if ( ! function_exists( 'avc_ais_init' ) ) { function avc_ais_init() { static $plugin = null; if ( null === $plugin ) { $plugin = new \Aivec\AiSearchSchema\Plugin(); $plugin->register(); } return $plugin; } } avc_ais_init(); // Initialize llms.txt generator. add_action( 'init', static function () { require_once AVC_AIS_DIR . 'includes/class-avc-ais-llms-txt.php'; AVC_AIS_Llms_Txt::init(); }, 5 ); // Activation hook - set redirect transient for wizard and flush rewrite rules. register_activation_hook( __FILE__, static function () { // Only set redirect if wizard hasn't been completed. if ( ! get_option( 'avc_ais_wizard_completed', false ) ) { set_transient( 'avc_ais_wizard_redirect', true, 30 ); } // Flush rewrite rules for llms.txt. require_once AVC_AIS_DIR . 'includes/class-avc-ais-llms-txt.php'; AVC_AIS_Llms_Txt::activate(); } ); // Deactivation hook - flush rewrite rules. register_deactivation_hook( __FILE__, static function () { require_once AVC_AIS_DIR . 'includes/class-avc-ais-llms-txt.php'; AVC_AIS_Llms_Txt::deactivate(); } ); // Cleanup on uninstall. register_uninstall_hook( __FILE__, array( '\\Aivec\\AiSearchSchema\\Plugin', 'uninstall' ) );