@@ -702,6 +702,99 @@ function save_configuration_for_debug( $config ) {
702702 return $ config ;
703703 }
704704
705+ /**
706+ * Get plugin or theme name from directory slug.
707+ *
708+ * @param string $slug Directory name (e.g., 'bb-plugin', 'avada')
709+ *
710+ * @return string|false Plugin/theme name or false if not found
711+ */
712+ function get_plugin_or_theme_name_from_slug ( $ slug ) {
713+ static $ cache = array ();
714+
715+ // Return cached result if available
716+ if ( isset ( $ cache [ $ slug ] ) ) {
717+ return $ cache [ $ slug ];
718+ }
719+
720+ if ( ! function_exists ( 'get_plugins ' ) ) {
721+ require_once ABSPATH . 'wp-admin/includes/plugin.php ' ;
722+ }
723+
724+ $ all_plugins = get_plugins ();
725+
726+ foreach ( $ all_plugins as $ plugin_path => $ plugin_data ) {
727+ // Plugin path format: "plugin-folder/plugin-file.php"
728+ $ plugin_folder = dirname ( $ plugin_path );
729+
730+ if ( $ plugin_folder === $ slug ) {
731+ $ cache [ $ slug ] = $ plugin_data ['Name ' ];
732+ return $ plugin_data ['Name ' ];
733+ }
734+ }
735+
736+ $ theme = wp_get_theme ( $ slug );
737+ if ( $ theme ->exists () ) {
738+ $ theme_name = $ theme ->get ( 'Name ' );
739+ $ cache [ $ slug ] = $ theme_name ;
740+ return $ theme_name ;
741+ }
742+
743+ return false ;
744+ }
745+
746+ /**
747+ * Get the correct folder ID from wpml_config_index based on admin_text_context.
748+ *
749+ * @param string $admin_text_context
750+ *
751+ * @return string
752+ */
753+ function get_remote_config_folder_id ( $ admin_text_context ) {
754+ static $ cache = array ();
755+
756+ if ( isset ( $ cache [ $ admin_text_context ] ) ) {
757+ return $ cache [ $ admin_text_context ];
758+ }
759+
760+ $ config_index = get_option ( 'wpml_config_index ' , array () );
761+
762+ if ( empty ( $ config_index ) ) {
763+ $ result = strtolower ( $ admin_text_context );
764+ $ cache [ $ admin_text_context ] = $ result ;
765+ return $ result ;
766+ }
767+
768+ $ plugin_or_theme_name = $ this ->get_plugin_or_theme_name_from_slug ( $ admin_text_context );
769+
770+ $ sections = array ( 'global ' , 'plugins ' , 'themes ' );
771+
772+ foreach ( $ sections as $ section ) {
773+ if ( ! isset ( $ config_index ->$ section ) || ! is_array ( $ config_index ->$ section ) ) {
774+ continue ;
775+ }
776+
777+ foreach ( $ config_index ->$ section as $ config_item ) {
778+ if ( ! isset ( $ config_item ->path ) || ! isset ( $ config_item ->name ) ) {
779+ continue ;
780+ }
781+
782+ if ( $ plugin_or_theme_name && $ config_item ->name === $ plugin_or_theme_name ) {
783+ $ path_parts = explode ( '/ ' , $ config_item ->path );
784+ if ( isset ( $ path_parts [1 ] ) && ! empty ( $ path_parts [1 ] ) ) {
785+ $ result = $ path_parts [1 ];
786+ $ cache [ $ admin_text_context ] = $ result ;
787+ return $ result ;
788+ }
789+ }
790+ }
791+ }
792+
793+ $ result = strtolower ( $ admin_text_context );
794+ $ cache [ $ admin_text_context ] = $ result ;
795+ return $ result ;
796+ }
797+
705798 /**
706799 * Intercept wpml-config.xml parsing to display loaded configuration files
707800 * for debugging purposes.
@@ -714,9 +807,10 @@ function save_configuration_for_debug( $config ) {
714807 function display_configuration_for_debug ( $ file ) {
715808 // Get url and name.
716809 if ( is_object ( $ file ) ) {
717- $ url = ICL_REMOTE_WPML_CONFIG_FILES_INDEX . 'wpml-config/ ' . $ file ->admin_text_context . '/wpml-config.xml ' ;
718- $ name = $ file ->admin_text_context ;
719- $ class = 'dashicons-admin-site ' ;
810+ $ folder_id = $ this ->get_remote_config_folder_id ( $ file ->admin_text_context );
811+ $ url = ICL_REMOTE_WPML_CONFIG_FILES_INDEX . 'wpml-config/ ' . $ folder_id . '/wpml-config.xml ' ;
812+ $ name = $ file ->admin_text_context ;
813+ $ class = 'dashicons-admin-site ' ;
720814 } else {
721815 $ url = str_replace ( WP_CONTENT_DIR , WP_CONTENT_URL , $ file );
722816 $ name = basename ( dirname ( $ url ) );
0 commit comments