@@ -80,6 +80,7 @@ func (a *Analyzer) AnalyzePaths(paths []string) ([]php.CodeChunk, error) {
8080// analyzeWordPress performs complete WordPress analysis using both package info and AST
8181func (a * Analyzer ) analyzeWordPress (packages []* php.PackageInfo , paths []string ) * WordPressInfo {
8282 info := & WordPressInfo {}
83+ var wcAPICalls []woocommerce.WCAPICall
8384
8485 // Analyze from parsed package info (method calls)
8586 info .Hooks = a .hookAnalyzer .AnalyzeHooks (packages )
@@ -149,6 +150,12 @@ func (a *Analyzer) analyzeWordPress(packages []*php.PackageInfo, paths []string)
149150 }
150151 }
151152
153+ // WooCommerce API calls from AST
154+ wcInfo := a .woocommerceAnalyzer .Analyze (rootNode , path )
155+ if wcInfo != nil && len (wcInfo .APICalls ) > 0 {
156+ wcAPICalls = append (wcAPICalls , wcInfo .APICalls ... )
157+ }
158+
152159 return nil
153160 })
154161 }
@@ -173,8 +180,11 @@ func (a *Analyzer) analyzeWordPress(packages []*php.PackageInfo, paths []string)
173180 })
174181 }
175182 wcHooks := a .woocommerceAnalyzer .AnalyzeHooksFromWP (wcInputHooks )
176- if len (wcHooks ) > 0 {
177- wcInfo := & woocommerce.WooCommerceInfo {Hooks : wcHooks }
183+ if len (wcHooks ) > 0 || len (wcAPICalls ) > 0 {
184+ wcInfo := & woocommerce.WooCommerceInfo {
185+ Hooks : wcHooks ,
186+ APICalls : wcAPICalls ,
187+ }
178188 info .WooCommerceInfo = wcInfo
179189 }
180190
@@ -379,14 +389,18 @@ func (a *Analyzer) convertToChunks(info *WordPressInfo) []php.CodeChunk {
379389 if info .OxygenInfo != nil {
380390 if oxyInfo , ok := info .OxygenInfo .(* oxygen.OxygenInfo ); ok {
381391 for _ , elem := range oxyInfo .Elements {
392+ baseClass := elem .BaseClass
393+ if baseClass == "" {
394+ baseClass = "OxyEl"
395+ }
382396 chunks = append (chunks , php.CodeChunk {
383397 Name : elem .ClassName ,
384398 Type : "oxy_element" ,
385399 Language : "php" ,
386400 FilePath : elem .FilePath ,
387401 StartLine : elem .StartLine ,
388402 EndLine : elem .EndLine ,
389- Signature : fmt .Sprintf ("class %s extends OxyEl " , elem .ClassName ),
403+ Signature : fmt .Sprintf ("class %s extends %s " , elem .ClassName , baseClass ),
390404 Docstring : fmt .Sprintf ("Oxygen Builder Element: %s (methods: %s)" , elem .ClassName , strings .Join (elem .Methods , ", " )),
391405 Metadata : map [string ]any {
392406 "framework" : "wordpress" ,
@@ -428,7 +442,7 @@ func (a *Analyzer) convertToChunks(info *WordPressInfo) []php.CodeChunk {
428442 FilePath : wcHook .FilePath ,
429443 StartLine : wcHook .StartLine ,
430444 EndLine : wcHook .EndLine ,
431- Signature : fmt . Sprintf ( "%s('%s', '%s')" , wcHook . HookType , wcHook . HookName , wcHook . Callback ),
445+ Signature : buildWCHookSignature ( wcHook ),
432446 Docstring : fmt .Sprintf ("WooCommerce %s hook (%s area): %s" , wcHook .HookType , wcHook .Area , wcHook .HookName ),
433447 Metadata : map [string ]any {
434448 "framework" : "wordpress" ,
@@ -504,6 +518,37 @@ func buildHookSignature(hook WPHook) string {
504518 }
505519}
506520
521+ // buildWCHookSignature creates a readable signature for a WooCommerce hook
522+ // using the real WordPress function names instead of raw hook type values
523+ func buildWCHookSignature (wcHook woocommerce.WCHook ) string {
524+ switch wcHook .HookType {
525+ case "action" :
526+ if wcHook .Priority > 0 {
527+ return fmt .Sprintf ("add_action('%s', '%s', %d)" , wcHook .HookName , wcHook .Callback , wcHook .Priority )
528+ }
529+ return fmt .Sprintf ("add_action('%s', '%s')" , wcHook .HookName , wcHook .Callback )
530+ case "filter" :
531+ if wcHook .Priority > 0 {
532+ return fmt .Sprintf ("add_filter('%s', '%s', %d)" , wcHook .HookName , wcHook .Callback , wcHook .Priority )
533+ }
534+ return fmt .Sprintf ("add_filter('%s', '%s')" , wcHook .HookName , wcHook .Callback )
535+ case "action_trigger" :
536+ return fmt .Sprintf ("do_action('%s')" , wcHook .HookName )
537+ case "filter_trigger" :
538+ return fmt .Sprintf ("apply_filters('%s')" , wcHook .HookName )
539+ case "action_removal" :
540+ return fmt .Sprintf ("remove_action('%s', '%s')" , wcHook .HookName , wcHook .Callback )
541+ case "filter_removal" :
542+ return fmt .Sprintf ("remove_filter('%s', '%s')" , wcHook .HookName , wcHook .Callback )
543+ case "action_check" :
544+ return fmt .Sprintf ("has_action('%s')" , wcHook .HookName )
545+ case "filter_check" :
546+ return fmt .Sprintf ("has_filter('%s')" , wcHook .HookName )
547+ default :
548+ return fmt .Sprintf ("%s('%s', '%s')" , wcHook .HookType , wcHook .HookName , wcHook .Callback )
549+ }
550+ }
551+
507552// IsWordPressProject detects if the given paths contain a WordPress project.
508553// It first checks the paths directly (directory-level indicators, plugin headers),
509554// then walks UP parent directories to find WordPress root indicators.
0 commit comments