' . esc_html__( 'Settings', 'metaforge-engine' ) . ''; array_unshift( $links, $settings_link ); return $links; } ); // Register suggested privacy policy content (WordPress Privacy Handbook) add_action( 'admin_init', function () { if ( function_exists( 'wp_add_privacy_policy_content' ) ) { $content = __( 'MetaForge Engine does not collect or transmit personal visitor data. Any custom field data created or submitted through the administration panel is stored locally within your site database. When using optional AI generation features, prompts are securely sent directly to the configured AI API provider (e.g., OpenAI, Anthropic, or Google) according to your configured API keys and settings.', 'metaforge-engine' ); wp_add_privacy_policy_content( 'MetaForge Engine', wp_kses_post( wpautop( $content, false ) ) ); } } ); // --- CLASS AUTOLOADER --- spl_autoload_register( function ( $class ) { if ( strpos( $class, 'MetaForge_' ) !== 0 ) { return; } $raw_name = substr( $class, 10 ); $normalized_name = str_replace( '_', '', $raw_name ); $directories = array( METAFORGE_PATH . 'core/', METAFORGE_PATH . 'fields/', METAFORGE_PATH . 'ai/', METAFORGE_PATH . 'admin/', METAFORGE_PATH . 'api/', METAFORGE_PATH . 'blocks/', ); $candidates = array( $raw_name . '.php', $normalized_name . '.php', ); foreach ( $directories as $dir ) { foreach ( $candidates as $candidate ) { $file = $dir . $candidate; if ( file_exists( $file ) ) { require_once $file; return; } } } } ); if ( defined( 'WP_CLI' ) && WP_CLI && file_exists( METAFORGE_PATH . 'core/CLICommand.php' ) ) { require_once METAFORGE_PATH . 'core/CLICommand.php'; } /** * Extensible helper for Pro add-on activation check. */ if ( ! function_exists( 'metaforge_is_pro_active' ) ) { function metaforge_is_pro_active() { if ( defined( 'METAFORGE_PRO_DEV_UNLOCKED' ) && METAFORGE_PRO_DEV_UNLOCKED ) { return true; } return (bool) apply_filters( 'metaforge_is_pro_active', defined( 'METAFORGE_PRO_VERSION' ) ); } } // --- ACTIVATION & DEACTIVATION HOOKS --- // Idempotent function: safely grants manage_metaforge to administrators function metaforge_sync_capabilities() { $roles_to_grant = array( 'administrator' ); foreach ( $roles_to_grant as $role_name ) { $role = get_role( $role_name ); if ( $role && ! $role->has_cap( 'manage_metaforge' ) ) { $role->add_cap( 'manage_metaforge' ); } } } function metaforge_activate() { metaforge_sync_capabilities(); metaforge_register_core_cpts(); flush_rewrite_rules( false ); } register_activation_hook( __FILE__, 'metaforge_activate' ); function metaforge_deactivate() { $admin = get_role( 'administrator' ); if ( $admin ) { $admin->remove_cap( 'manage_metaforge' ); } wp_clear_scheduled_hook( 'metaforge_async_fallback_generation' ); delete_transient( 'metaforge_all_field_groups_cache' ); delete_transient( 'metaforge_field_flat_map' ); flush_rewrite_rules( false ); } register_deactivation_hook( __FILE__, 'metaforge_deactivate' ); // --------------------------------------- // --- REGISTER CORE CPT --- function metaforge_register_core_cpts() { // Field Groups store register_post_type( 'metaforge_group', array( 'labels' => array( 'name' => 'Field Groups', 'singular_name' => 'Field Group', ), 'public' => false, 'show_ui' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow' ), 'map_meta_cap' => true, 'hierarchical' => false, 'supports' => array( 'title' ), ) ); // Options Page value store register_post_type( 'metaforge_options', array( 'labels' => array( 'name' => 'Options Store', 'singular_name' => 'Options Store', ), 'public' => false, 'show_ui' => false, 'capability_type' => 'post', 'capabilities' => array( 'create_posts' => 'do_not_allow' ), 'map_meta_cap' => true, 'hierarchical' => false, 'supports' => array( 'title' ), ) ); } add_action( 'init', 'metaforge_register_core_cpts' ); // ------------------------- // Launch Upgraders Early new MetaForge_Migrations(); // Initialize field registry with core field types MetaForge_Field_Registry::register_core_field_types(); // Developer Public API functions require_once METAFORGE_PATH . 'api/functions.php'; // Core Services require_once METAFORGE_PATH . 'core/Loader.php'; new MetaForge_Loader(); new MetaForge_SchemaGenerator(); new MetaForge_FallbackContent(); // REST API — always init (runs on rest_api_init hook internally) new MetaForge_RestController(); // Block Bridge — always init (runs on init hook internally) new MetaForge_BlockBridge(); // Core Custom Post Types, Taxonomies, and Ordering managers new MetaForge_PostTypeManager(); new MetaForge_TaxonomyManager(); if ( class_exists( 'MetaForge_TaxonomyOrderManager' ) ) { new MetaForge_TaxonomyOrderManager(); } new MetaForge_PostOrderManager(); if ( is_admin() || wp_doing_ajax() ) { // Admin Services new MetaForge_OptionsPageManager(); new MetaForge_ImportExport(); new MetaForge_AISettings(); new MetaForge_LayoutAssistant(); }