Changeset 3723403
- Timestamp:
- 10/01/2026 03:27:15 PM (5 weeks ago)
- Location:
- miniorange-ai-visibility
- Files:
-
- 218 added
- 14 edited
-
tags/1.8.1 (added)
-
tags/1.8.1/assets (added)
-
tags/1.8.1/assets/css (added)
-
tags/1.8.1/assets/css/admin.css (added)
-
tags/1.8.1/assets/css/contact-us.css (added)
-
tags/1.8.1/assets/css/dashboard-widget.css (added)
-
tags/1.8.1/assets/css/deactivation-feedback.css (added)
-
tags/1.8.1/assets/css/index.php (added)
-
tags/1.8.1/assets/images (added)
-
tags/1.8.1/assets/images/companies (added)
-
tags/1.8.1/assets/images/companies/allen-institute.svg (added)
-
tags/1.8.1/assets/images/companies/amazon.svg (added)
-
tags/1.8.1/assets/images/companies/anthropic.svg (added)
-
tags/1.8.1/assets/images/companies/apple.svg (added)
-
tags/1.8.1/assets/images/companies/bytedance.svg (added)
-
tags/1.8.1/assets/images/companies/cloudflare.svg (added)
-
tags/1.8.1/assets/images/companies/cognition-ai.svg (added)
-
tags/1.8.1/assets/images/companies/cohere.svg (added)
-
tags/1.8.1/assets/images/companies/common-crawl.svg (added)
-
tags/1.8.1/assets/images/companies/deepseek.svg (added)
-
tags/1.8.1/assets/images/companies/diffbot.svg (added)
-
tags/1.8.1/assets/images/companies/duckduckgo.svg (added)
-
tags/1.8.1/assets/images/companies/firecrawl.svg (added)
-
tags/1.8.1/assets/images/companies/google.svg (added)
-
tags/1.8.1/assets/images/companies/huawei.svg (added)
-
tags/1.8.1/assets/images/companies/iask-ai.svg (added)
-
tags/1.8.1/assets/images/companies/imagesift.svg (added)
-
tags/1.8.1/assets/images/companies/index.php (added)
-
tags/1.8.1/assets/images/companies/kagi.svg (added)
-
tags/1.8.1/assets/images/companies/laion.svg (added)
-
tags/1.8.1/assets/images/companies/linkedin.svg (added)
-
tags/1.8.1/assets/images/companies/meta.svg (added)
-
tags/1.8.1/assets/images/companies/microsoft.svg (added)
-
tags/1.8.1/assets/images/companies/mistral-ai.svg (added)
-
tags/1.8.1/assets/images/companies/moonshot-ai.svg (added)
-
tags/1.8.1/assets/images/companies/nict.svg (added)
-
tags/1.8.1/assets/images/companies/openai.svg (added)
-
tags/1.8.1/assets/images/companies/perplexity.svg (added)
-
tags/1.8.1/assets/images/companies/phind.svg (added)
-
tags/1.8.1/assets/images/companies/sb-intuitions.svg (added)
-
tags/1.8.1/assets/images/companies/timpi.svg (added)
-
tags/1.8.1/assets/images/companies/webz-io.svg (added)
-
tags/1.8.1/assets/images/companies/xai.svg (added)
-
tags/1.8.1/assets/images/companies/yandex.svg (added)
-
tags/1.8.1/assets/images/companies/you-com.svg (added)
-
tags/1.8.1/assets/images/data-management.svg (added)
-
tags/1.8.1/assets/images/index.php (added)
-
tags/1.8.1/assets/images/logo.svg (added)
-
tags/1.8.1/assets/images/miniorange-logo.png (added)
-
tags/1.8.1/assets/images/miniorange-menu.png (added)
-
tags/1.8.1/assets/js (added)
-
tags/1.8.1/assets/js/admin.js (added)
-
tags/1.8.1/assets/js/ai-inventory.js (added)
-
tags/1.8.1/assets/js/analytics.js (added)
-
tags/1.8.1/assets/js/app-shell.js (added)
-
tags/1.8.1/assets/js/chart.min.js (added)
-
tags/1.8.1/assets/js/contact-us.js (added)
-
tags/1.8.1/assets/js/crawler-tracker.js (added)
-
tags/1.8.1/assets/js/deactivation-feedback.js (added)
-
tags/1.8.1/assets/js/discoverability.js (added)
-
tags/1.8.1/assets/js/index.php (added)
-
tags/1.8.1/assets/js/mcp-control.js (added)
-
tags/1.8.1/assets/js/mcp-tracker.js (added)
-
tags/1.8.1/assets/js/reports.js (added)
-
tags/1.8.1/assets/js/settings.js (added)
-
tags/1.8.1/assets/js/side-nav.js (added)
-
tags/1.8.1/assets/js/visibility.js (added)
-
tags/1.8.1/class-enqueue-scripts.php (added)
-
tags/1.8.1/includes (added)
-
tags/1.8.1/includes/autoloader.php (added)
-
tags/1.8.1/includes/common (added)
-
tags/1.8.1/includes/common/class-installer.php (added)
-
tags/1.8.1/includes/common/class-loader.php (added)
-
tags/1.8.1/includes/common/constants (added)
-
tags/1.8.1/includes/common/constants/class-plugin-constants.php (added)
-
tags/1.8.1/includes/common/constants/index.php (added)
-
tags/1.8.1/includes/common/controllers (added)
-
tags/1.8.1/includes/common/controllers/class-ai-inventory-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-analytics-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-contact-us-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-crawler-control-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-deactivation-feedback-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-discoverability-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-indexnow-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-mcp-control-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-mcp-tracker-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-reports-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-rest-api-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-settings-controller.php (added)
-
tags/1.8.1/includes/common/controllers/class-visibility-controller.php (added)
-
tags/1.8.1/includes/common/controllers/index.php (added)
-
tags/1.8.1/includes/common/data (added)
-
tags/1.8.1/includes/common/data/ai-referral-sources.php (added)
-
tags/1.8.1/includes/common/data/builtin-crawlers.php (added)
-
tags/1.8.1/includes/common/handlers (added)
-
tags/1.8.1/includes/common/handlers/class-ai-inventory-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-analytics-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-contact-us-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-crawler-control-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-deactivation-feedback-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-discoverability-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-mcp-control-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-mcp-tracker-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-reports-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-settings-handler.php (added)
-
tags/1.8.1/includes/common/handlers/class-visibility-handler.php (added)
-
tags/1.8.1/includes/common/handlers/index.php (added)
-
tags/1.8.1/includes/common/hooks (added)
-
tags/1.8.1/includes/common/hooks/class-abilities-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-admin-assets-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-admin-menu-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-ai-inventory-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-ai-meta-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-analytics-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-contact-us-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-crawler-control-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-crawler-tracking-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-dashboard-widget-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-deactivation-feedback-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-discoverability-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-indexnow-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-mcp-control-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-mcp-tracker-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-referral-tracking-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-reports-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-rest-api-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-settings-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-visibility-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/class-woocommerce-hooks.php (added)
-
tags/1.8.1/includes/common/hooks/index.php (added)
-
tags/1.8.1/includes/common/models (added)
-
tags/1.8.1/includes/common/models/class-ai-meta-model.php (added)
-
tags/1.8.1/includes/common/models/class-blocked-crawler-model.php (added)
-
tags/1.8.1/includes/common/models/class-crawler-log-model.php (added)
-
tags/1.8.1/includes/common/models/class-indexnow-log-model.php (added)
-
tags/1.8.1/includes/common/models/class-mcp-request-model.php (added)
-
tags/1.8.1/includes/common/models/class-referral-log-model.php (added)
-
tags/1.8.1/includes/common/models/class-visibility-scan-model.php (added)
-
tags/1.8.1/includes/common/models/index.php (added)
-
tags/1.8.1/includes/common/services (added)
-
tags/1.8.1/includes/common/services/class-abilities-service.php (added)
-
tags/1.8.1/includes/common/services/class-ai-inventory-service.php (added)
-
tags/1.8.1/includes/common/services/class-ai-meta-service.php (added)
-
tags/1.8.1/includes/common/services/class-analytics-service.php (added)
-
tags/1.8.1/includes/common/services/class-content-sanitizer.php (added)
-
tags/1.8.1/includes/common/services/class-content-type-service.php (added)
-
tags/1.8.1/includes/common/services/class-crawler-blocker-service.php (added)
-
tags/1.8.1/includes/common/services/class-crawler-detector-service.php (added)
-
tags/1.8.1/includes/common/services/class-dashboard-widget.php (added)
-
tags/1.8.1/includes/common/services/class-email-alerts-service.php (added)
-
tags/1.8.1/includes/common/services/class-indexnow-service.php (added)
-
tags/1.8.1/includes/common/services/class-json-ld-service.php (added)
-
tags/1.8.1/includes/common/services/class-llms-txt-service.php (added)
-
tags/1.8.1/includes/common/services/class-markdown-service.php (added)
-
tags/1.8.1/includes/common/services/class-mcp-control-service.php (added)
-
tags/1.8.1/includes/common/services/class-mcp-server-service.php (added)
-
tags/1.8.1/includes/common/services/class-mcp-tracker-service.php (added)
-
tags/1.8.1/includes/common/services/class-referral-detector-service.php (added)
-
tags/1.8.1/includes/common/services/class-reports-service.php (added)
-
tags/1.8.1/includes/common/services/class-robots-txt-service.php (added)
-
tags/1.8.1/includes/common/services/class-settings-service.php (added)
-
tags/1.8.1/includes/common/services/class-visibility-checks-service.php (added)
-
tags/1.8.1/includes/common/services/class-visibility-quick-fix-service.php (added)
-
tags/1.8.1/includes/common/services/class-visibility-score-service.php (added)
-
tags/1.8.1/includes/common/services/class-woocommerce-geo-service.php (added)
-
tags/1.8.1/includes/common/services/index.php (added)
-
tags/1.8.1/includes/common/utils (added)
-
tags/1.8.1/includes/common/utils/class-utils.php (added)
-
tags/1.8.1/includes/common/utils/index.php (added)
-
tags/1.8.1/includes/index.php (added)
-
tags/1.8.1/index.php (added)
-
tags/1.8.1/libraries (added)
-
tags/1.8.1/libraries/index.php (added)
-
tags/1.8.1/miniorange-ai-visibility.php (added)
-
tags/1.8.1/readme.txt (added)
-
tags/1.8.1/scripts (added)
-
tags/1.8.1/tools (added)
-
tags/1.8.1/tools/generate-company-logos.php (added)
-
tags/1.8.1/uninstall.php (added)
-
tags/1.8.1/views (added)
-
tags/1.8.1/views/src (added)
-
tags/1.8.1/views/src/common (added)
-
tags/1.8.1/views/src/common/components (added)
-
tags/1.8.1/views/src/common/components/class-app-header-view.php (added)
-
tags/1.8.1/views/src/common/components/class-app-shell-view.php (added)
-
tags/1.8.1/views/src/common/components/class-contact-us-view.php (added)
-
tags/1.8.1/views/src/common/components/class-deactivation-feedback-view.php (added)
-
tags/1.8.1/views/src/common/components/class-icons-sprite-view.php (added)
-
tags/1.8.1/views/src/common/components/class-navbar-view.php (added)
-
tags/1.8.1/views/src/common/components/class-side-nav-view.php (added)
-
tags/1.8.1/views/src/common/components/index.php (added)
-
tags/1.8.1/views/src/common/pages (added)
-
tags/1.8.1/views/src/common/pages/ai-inventory (added)
-
tags/1.8.1/views/src/common/pages/ai-inventory/class-ai-inventory-view.php (added)
-
tags/1.8.1/views/src/common/pages/ai-inventory/index.php (added)
-
tags/1.8.1/views/src/common/pages/analytics (added)
-
tags/1.8.1/views/src/common/pages/analytics/class-analytics-view.php (added)
-
tags/1.8.1/views/src/common/pages/analytics/index.php (added)
-
tags/1.8.1/views/src/common/pages/dashboard (added)
-
tags/1.8.1/views/src/common/pages/dashboard/index.php (added)
-
tags/1.8.1/views/src/common/pages/discoverability (added)
-
tags/1.8.1/views/src/common/pages/discoverability/class-discoverability-view.php (added)
-
tags/1.8.1/views/src/common/pages/discoverability/index.php (added)
-
tags/1.8.1/views/src/common/pages/mcp-control (added)
-
tags/1.8.1/views/src/common/pages/mcp-control/class-mcp-control-view.php (added)
-
tags/1.8.1/views/src/common/pages/mcp-tracker (added)
-
tags/1.8.1/views/src/common/pages/mcp-tracker/class-mcp-tracker-view.php (added)
-
tags/1.8.1/views/src/common/pages/mcp-tracker/index.php (added)
-
tags/1.8.1/views/src/common/pages/reports (added)
-
tags/1.8.1/views/src/common/pages/reports/class-reports-view.php (added)
-
tags/1.8.1/views/src/common/pages/reports/index.php (added)
-
tags/1.8.1/views/src/common/pages/settings (added)
-
tags/1.8.1/views/src/common/pages/settings/class-settings-view.php (added)
-
tags/1.8.1/views/src/common/pages/settings/index.php (added)
-
tags/1.8.1/views/src/common/pages/visibility (added)
-
tags/1.8.1/views/src/common/pages/visibility/class-visibility-view.php (added)
-
tags/1.8.1/views/src/common/pages/visibility/index.php (added)
-
trunk/assets/js/ai-inventory.js (modified) (1 diff)
-
trunk/assets/js/contact-us.js (modified) (1 diff)
-
trunk/includes/common/controllers/class-ai-inventory-controller.php (modified) (1 diff)
-
trunk/includes/common/controllers/class-settings-controller.php (modified) (1 diff)
-
trunk/includes/common/data/builtin-crawlers.php (modified) (1 diff)
-
trunk/includes/common/handlers/class-contact-us-handler.php (modified) (3 diffs)
-
trunk/includes/common/handlers/class-deactivation-feedback-handler.php (modified) (6 diffs)
-
trunk/includes/common/hooks/class-contact-us-hooks.php (modified) (2 diffs)
-
trunk/miniorange-ai-visibility.php (modified) (1 diff)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/views/src/common/components/class-app-shell-view.php (modified) (5 diffs)
-
trunk/views/src/common/pages/ai-inventory/class-ai-inventory-view.php (modified) (4 diffs)
-
trunk/views/src/common/pages/discoverability/class-discoverability-view.php (modified) (5 diffs)
-
trunk/views/src/common/pages/settings/class-settings-view.php (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
miniorange-ai-visibility/trunk/assets/js/ai-inventory.js
r3636134 r3723403 481 481 var s = strings(); 482 482 var $text = $( '#moai-av-inv-live-text' ); 483 var $indicator = $( '#moai-av-inv-live' ); 483 484 var generated = parseGeneratedDate(); 485 var agentCount = parseInt( String( $( '[data-inv-count="agents"]' ).first().text() ).replace( /[^\d]/g, '' ), 10 ) || 0; 486 var serverCount = parseInt( String( $( '[data-inv-count="mcp_servers"]' ).first().text() ).replace( /[^\d]/g, '' ), 10 ) || 0; 484 487 var label; 485 488 489 if ( 0 === agentCount && 0 === serverCount ) { 490 $indicator.addClass( 'is-waiting' ); 491 $text.text( s.waiting || 'Waiting for AI traffic' ); 492 return; 493 } 494 495 $indicator.removeClass( 'is-waiting' ); 486 496 if ( ! generated ) { 487 497 label = ( s.live || 'Live' ) + ' · ' + ( s.justNow || 'just now' ); -
miniorange-ai-visibility/trunk/assets/js/contact-us.js
r3629940 r3723403 21 21 } 22 22 23 function pluginName() { 24 return cfg().plugin_name || 'AI Crawlers Visibility, Analytics & Control'; 25 } 26 27 function buildSubject( query ) { 28 var issue = String( query ).split( /\r?\n/ )[ 0 ].trim(); 29 var subject = 'Feedback - ' + pluginName(); 30 31 if ( ! issue ) { 32 return subject; 33 } 34 35 if ( issue.length > 80 ) { 36 issue = issue.slice( 0, 77 ) + '…'; 37 } 38 39 return subject + ' - ' + issue; 40 } 41 42 function buildBody( email, query ) { 43 var c = cfg(); 44 var name = ( ( c.first_name || '' ) + ' ' + ( c.last_name || '' ) ).trim(); 45 46 return [ 47 'Feedback - ' + pluginName(), 48 '', 49 'Plugin: ' + pluginName(), 50 'Version: ' + ( c.version || '' ), 51 'Site: ' + ( c.site_url || '' ), 52 'WordPress: ' + ( c.wp_version || '' ), 53 'PHP: ' + ( c.php_version || '' ), 54 'From: ' + ( name ? name + ' <' + email + '>' : email ), 55 '', 56 'Message:', 57 query, 58 ].join( '\n' ); 59 } 60 23 61 function buildPayload( email, query ) { 24 62 var c = cfg(); 25 var prefix = '[' + ( c.plugin_name || 'AI Crawlers Visibility, Analytics & Control' ) + '] ' + ( c.version || '' ) + ' - ';63 var subject = buildSubject( query ); 26 64 27 65 return { 28 66 email: email, 29 query: prefix + query, 67 subject: subject, 68 topic: subject, 69 query: buildBody( email, query ), 30 70 ccEmail: c.support_email || '', 31 71 company: c.site_url || '', 32 72 firstName: c.first_name || '', 33 73 lastName: c.last_name || '', 34 areaOfInterest: c.area_of_interest || c.plugin_name || 'AI Crawlers Visibility, Analytics & Control', 74 areaOfInterest: c.area_of_interest || pluginName(), 75 request_type: 'plugin_support_request', 35 76 }; 36 77 } -
miniorange-ai-visibility/trunk/includes/common/controllers/class-ai-inventory-controller.php
r3636134 r3723403 159 159 return array( 160 160 'live' => __( 'Live', 'miniorange-ai-visibility' ), 161 'waiting' => __( 'Waiting for AI traffic', 'miniorange-ai-visibility' ), 161 162 'refreshed' => __( 'refreshed %s ago', 'miniorange-ai-visibility' ), 162 163 'justNow' => __( 'just now', 'miniorange-ai-visibility' ), -
miniorange-ai-visibility/trunk/includes/common/controllers/class-settings-controller.php
r3670315 r3723403 288 288 'requiredFields' => __( 'Name and user-agent pattern are required.', 'miniorange-ai-visibility' ), 289 289 'genericError' => __( 'Something went wrong. Please try again.', 'miniorange-ai-visibility' ), 290 'robotsRuleAdded' => __( ' robots.txt disallow rule added.', 'miniorange-ai-visibility' ),291 'robotsRuleRemoved' => __( ' robots.txt disallow ruleremoved.', 'miniorange-ai-visibility' ),292 'bulkDisallowDone' => __( ' Category disallow template applied.', 'miniorange-ai-visibility' ),290 'robotsRuleAdded' => __( 'The bot has been asked not to crawl in robots.txt.', 'miniorange-ai-visibility' ), 291 'robotsRuleRemoved' => __( 'The robots.txt crawl restriction was removed.', 'miniorange-ai-visibility' ), 292 'bulkDisallowDone' => __( 'The selected bot category has been asked not to crawl.', 'miniorange-ai-visibility' ), 293 293 'bulkAllowDone' => __( 'Category allow template applied.', 'miniorange-ai-visibility' ), 294 'confirmBulkDisallow' => __( ' Disallow all crawlers in this category in robots.txt?', 'miniorange-ai-visibility' ),294 'confirmBulkDisallow' => __( 'Ask every bot in this category not to crawl your site?', 'miniorange-ai-visibility' ), 295 295 'confirmBulkAllow' => __( 'Allow all crawlers in this category again (remove Disallow rules)?', 'miniorange-ai-visibility' ), 296 'blocked' => __( ' Crawler blocked via PHP.', 'miniorange-ai-visibility' ),297 'ipBlocked' => __( ' IP address blocked via PHP.', 'miniorange-ai-visibility' ),296 'blocked' => __( 'The bot is now hard-blocked.', 'miniorange-ai-visibility' ), 297 'ipBlocked' => __( 'The IP address is now hard-blocked.', 'miniorange-ai-visibility' ), 298 298 'unblocked' => __( 'Crawler unblocked.', 'miniorange-ai-visibility' ), 299 299 'invalidIp' => __( 'Enter a valid IPv4 or IPv6 address.', 'miniorange-ai-visibility' ), 300 'robotsDisallowed' => __( ' Disallowed in robots.txt', 'miniorange-ai-visibility' ),301 'phpBlocked' => __( ' PHPblocked', 'miniorange-ai-visibility' ),302 'disallowRobots' => __( ' Disallow in robots.txt', 'miniorange-ai-visibility' ),300 'robotsDisallowed' => __( 'Asked not to crawl', 'miniorange-ai-visibility' ), 301 'phpBlocked' => __( 'Hard blocked', 'miniorange-ai-visibility' ), 302 'disallowRobots' => __( 'Ask not to crawl (robots.txt)', 'miniorange-ai-visibility' ), 303 303 'allowRobots' => __( 'Allow in robots.txt', 'miniorange-ai-visibility' ), 304 'blockPhp' => __( ' Block via PHP (403)', 'miniorange-ai-visibility' ),305 'unblockPhp' => __( ' Unblock PHP', 'miniorange-ai-visibility' ),304 'blockPhp' => __( 'Hard block this bot', 'miniorange-ai-visibility' ), 305 'unblockPhp' => __( 'Remove hard block', 'miniorange-ai-visibility' ), 306 306 'selectCrawler' => __( 'Please select a crawler.', 'miniorange-ai-visibility' ), 307 307 'alreadyDisallowed' => __( 'This crawler is already disallowed in robots.txt.', 'miniorange-ai-visibility' ), 308 308 'notDisallowed' => __( 'This crawler is not disallowed in robots.txt.', 'miniorange-ai-visibility' ), 309 'alreadyBlocked' => __( 'This crawler is already PHP-blocked.', 'miniorange-ai-visibility' ),310 'enablePhpBlocking' => __( 'Enable PHPblocking first.', 'miniorange-ai-visibility' ),309 'alreadyBlocked' => __( 'This bot is already hard-blocked.', 'miniorange-ai-visibility' ), 310 'enablePhpBlocking' => __( 'Enable hard blocking first.', 'miniorange-ai-visibility' ), 311 311 'crawlerCount' => __( 'Showing %1$d of %2$d crawlers.', 'miniorange-ai-visibility' ), 312 312 'prevPage' => __( 'Previous', 'miniorange-ai-visibility' ), -
miniorange-ai-visibility/trunk/includes/common/data/builtin-crawlers.php
r3670315 r3723403 576 576 'category' => 'scraper', 577 577 ), 578 'YandexBot' => array( 579 'name' => 'YandexBot', 580 'company' => 'Yandex', 581 'category' => 'search', 582 ), 583 'Slurp' => array( 584 'name' => 'Slurp', 585 'company' => 'Yahoo', 586 'category' => 'search', 587 ), 588 'Sogou web spider' => array( 589 'name' => 'Sogou web spider', 590 'company' => 'Sogou', 591 'category' => 'search', 592 ), 593 'Quora-Bot' => array( 594 'name' => 'Quora-Bot', 595 'company' => 'Quora', 596 'category' => 'assistant', 597 ), 598 'LinerBot' => array( 599 'name' => 'LinerBot', 600 'company' => 'Liner', 601 'category' => 'search', 602 ), 603 'Awario' => array( 604 'name' => 'Awario', 605 'company' => 'Awario', 606 'category' => 'scraper', 607 ), 608 'Meltwater' => array( 609 'name' => 'Meltwater', 610 'company' => 'Meltwater', 611 'category' => 'scraper', 612 ), 613 'Poseidon Research Crawler' => array( 614 'name' => 'Poseidon Research Crawler', 615 'company' => 'Poseidon Research', 616 'category' => 'training', 617 ), 618 'Sidetrade indexer bot' => array( 619 'name' => 'Sidetrade indexer bot', 620 'company' => 'Sidetrade', 621 'category' => 'scraper', 622 ), 623 'NetEstate Imprint Crawler' => array( 624 'name' => 'NetEstate Imprint Crawler', 625 'company' => 'NetEstate', 626 'category' => 'scraper', 627 ), 628 'Scrapy' => array( 629 'name' => 'Scrapy', 630 'company' => 'Scrapy', 631 'category' => 'scraper', 632 ), 633 'python-requests' => array( 634 'name' => 'python-requests', 635 'company' => 'Requests', 636 'category' => 'scraper', 637 ), 578 638 ); -
miniorange-ai-visibility/trunk/includes/common/handlers/class-contact-us-handler.php
r3602565 r3723403 41 41 42 42 $current_user = wp_get_current_user(); 43 $subject = self::build_subject( $query ); 43 44 $payload = array( 44 45 'email' => $email, 45 'query' => '[' . Plugin_Constants::PLUGIN_DISPLAY_NAME . '] ' . MOAI_AV_VERSION . ' - ' . $query, 46 'subject' => $subject, 47 'topic' => $subject, 48 'query' => $this->build_body( $email, $query ), 46 49 'ccEmail' => Plugin_Constants::SUPPORT_EMAIL, 47 50 'company' => site_url(), … … 49 52 'lastName' => $current_user ? (string) $current_user->user_lastname : '', 50 53 'areaOfInterest' => Plugin_Constants::PLUGIN_DISPLAY_NAME, 54 'request_type' => 'plugin_support_request', 51 55 ); 52 56 … … 76 80 ); 77 81 } 82 83 /** 84 * Build the support email subject: "Feedback - <Plugin> - <issue>". 85 * 86 * @param string $query Message body. 87 * @return string 88 */ 89 public static function build_subject( string $query ): string { 90 $subject = 'Feedback - ' . Plugin_Constants::PLUGIN_DISPLAY_NAME; 91 $issue = self::summarize_issue( $query ); 92 93 if ( '' !== $issue ) { 94 $subject .= ' - ' . $issue; 95 } 96 97 return $subject; 98 } 99 100 /** 101 * First line of the message, trimmed to a readable subject length. 102 * 103 * @param string $query Message body. 104 * @return string 105 */ 106 private static function summarize_issue( string $query ): string { 107 $lines = preg_split( '/\R/', trim( $query ) ); 108 $issue = is_array( $lines ) ? trim( (string) reset( $lines ) ) : ''; 109 110 if ( '' === $issue ) { 111 return ''; 112 } 113 114 if ( mb_strlen( $issue ) > 80 ) { 115 $issue = mb_substr( $issue, 0, 77 ) . '…'; 116 } 117 118 return $issue; 119 } 120 121 /** 122 * Build a readable, line-separated support email body. 123 * 124 * @param string $email Reply-to email. 125 * @param string $query Message body. 126 * @return string 127 */ 128 private function build_body( string $email, string $query ): string { 129 global $wp_version; 130 131 $current_user = wp_get_current_user(); 132 $name = trim( ( $current_user ? (string) $current_user->user_firstname : '' ) . ' ' . ( $current_user ? (string) $current_user->user_lastname : '' ) ); 133 if ( '' === $name && $current_user ) { 134 $name = (string) $current_user->display_name; 135 } 136 137 $lines = array( 138 'Feedback - ' . Plugin_Constants::PLUGIN_DISPLAY_NAME, 139 '', 140 'Plugin: ' . Plugin_Constants::PLUGIN_DISPLAY_NAME, 141 'Version: ' . ( defined( 'MOAI_AV_VERSION' ) ? MOAI_AV_VERSION : '' ), 142 'Site: ' . site_url(), 143 'WordPress: ' . ( isset( $wp_version ) ? (string) $wp_version : '' ), 144 'PHP: ' . PHP_VERSION, 145 'From: ' . ( '' !== $name ? $name . ' <' . $email . '>' : $email ), 146 '', 147 'Message:', 148 $query, 149 ); 150 151 return implode( "\n", $lines ); 152 } 78 153 } -
miniorange-ai-visibility/trunk/includes/common/handlers/class-deactivation-feedback-handler.php
r3646604 r3723403 57 57 ), 58 58 'plugin_deactivation_feedback', 59 $email 59 $email, 60 $reason_label 60 61 ); 61 62 … … 83 84 ), 84 85 'plugin_deactivation_no_feedback', 85 $email 86 $email, 87 __( 'Deactivated without feedback', 'miniorange-ai-visibility' ) 86 88 ); 87 89 … … 112 114 ), 113 115 'plugin_deactivation_hook', 114 '' 116 '', 117 __( 'Deactivated without feedback', 'miniorange-ai-visibility' ) 115 118 ); 116 119 } … … 122 125 * @param string $request_type Request type tag. 123 126 * @param string $email Optional email override. 127 * @param string $issue Short issue summary for the subject. 124 128 * @return true|\WP_Error 125 129 */ 126 private function send_notice( array $query_lines, string $request_type, string $email = '' ) { 130 private function send_notice( array $query_lines, string $request_type, string $email = '', string $issue = '' ) { 131 global $wp_version; 132 127 133 $current_user = wp_get_current_user(); 128 134 $user_email = $current_user && $current_user->user_email ? (string) $current_user->user_email : ''; … … 133 139 } 134 140 141 $subject = 'Feedback - ' . Plugin_Constants::PLUGIN_DISPLAY_NAME . ' - ' . __( 'Deactivation', 'miniorange-ai-visibility' ); 142 if ( '' !== $issue ) { 143 $subject .= ': ' . $issue; 144 } 145 135 146 $lines = array_merge( 136 147 array( 137 'Deactivation Notice', 148 $subject, 149 '', 138 150 'Plugin: ' . Plugin_Constants::PLUGIN_DISPLAY_NAME, 139 151 'Version: ' . ( defined( 'MOAI_AV_VERSION' ) ? MOAI_AV_VERSION : '' ), 140 152 'Site: ' . site_url(), 153 'WordPress: ' . ( isset( $wp_version ) ? (string) $wp_version : '' ), 154 'PHP: ' . PHP_VERSION, 155 'From: ' . $final_email, 156 '', 157 'Deactivation feedback:', 141 158 ), 142 159 $query_lines … … 144 161 $payload = array( 145 162 'email' => $final_email, 163 'subject' => $subject, 164 'topic' => $subject, 146 165 'query' => implode( "\n", $lines ), 147 166 'ccEmail' => Plugin_Constants::SUPPORT_EMAIL, -
miniorange-ai-visibility/trunk/includes/common/hooks/class-contact-us-hooks.php
r3602565 r3723403 56 56 ); 57 57 58 global $wp_version; 59 58 60 $current_user = wp_get_current_user(); 59 61 wp_localize_script( … … 66 68 'area_of_interest' => Plugin_Constants::PLUGIN_DISPLAY_NAME, 67 69 'version' => MOAI_AV_VERSION, 70 'wp_version' => isset( $wp_version ) ? (string) $wp_version : '', 71 'php_version' => PHP_VERSION, 68 72 'site_url' => site_url(), 69 73 'first_name' => $current_user ? (string) $current_user->user_firstname : '', -
miniorange-ai-visibility/trunk/miniorange-ai-visibility.php
r3694415 r3723403 4 4 * Plugin URI: https://plugins.miniorange.com/ 5 5 * Description: Monitor AI crawlers and MCP traffic, inventory agents and tools, control access, and improve AI visibility with llms.txt and readiness checks. 6 * Version: 1.8. 16 * Version: 1.8.2 7 7 * Requires at least: 5.0 8 8 * Requires PHP: 7.4 -
miniorange-ai-visibility/trunk/readme.txt
r3694415 r3723403 5 5 Tested up to: 7.0.1 6 6 Requires PHP: 7.4 7 Stable tag: 1.8. 17 Stable tag: 1.8.2 8 8 License: Expat 9 9 License URI: https://plugins.miniorange.com/mit-license … … 380 380 == Changelog == 381 381 382 = 1.8.2 = 383 * Fixed support and deactivation feedback emails arriving as a generic inquiry — they now use a descriptive subject: `Feedback - AI Crawlers Visibility, Analytics & Control - <issue>`. 384 * Fixed feedback email formatting: labelled lines for plugin, version, site, WordPress, PHP, and sender, with the customer message in its own block. 385 * Added 12 built-in crawlers: YandexBot, Slurp (Yahoo), Sogou web spider, Quora-Bot, LinerBot, Awario, Meltwater, Poseidon Research Crawler, Sidetrade indexer bot, NetEstate Imprint Crawler, Scrapy, and python-requests (125 total). 386 382 387 = 1.8.1 = 383 388 * First-run Analytics guidance: status that crawler tracking is on, why metrics show 0, and a primary **Check Your Homepage** action. … … 535 540 == Upgrade Notice == 536 541 542 = 1.8.2 = 543 Fixes feedback email subject and formatting (no longer sent as a generic inquiry) and adds 12 built-in crawlers including YandexBot, Slurp, Sogou web spider, Quora-Bot, and LinerBot (125 total). 544 537 545 = 1.8.1 = 538 546 Improves first-run Analytics: tracking status, empty-state next steps, homepage Visibility Score CTA, and optional MCP cards until tool traffic appears. -
miniorange-ai-visibility/trunk/views/src/common/components/class-app-shell-view.php
r3636134 r3723403 84 84 <?php $this->render_nav_group( __( 'Controls', 'miniorange-ai-visibility' ), $this->get_controls_items() ); ?> 85 85 <?php $this->render_nav_group( __( 'Monitoring', 'miniorange-ai-visibility' ), $this->get_monitoring_items() ); ?> 86 <?php $this->render_nav_group( __( ' Optimize', 'miniorange-ai-visibility' ), $this->get_optimize_items() ); ?>86 <?php $this->render_nav_group( __( 'Advanced', 'miniorange-ai-visibility' ), $this->get_advanced_items() ); ?> 87 87 <?php $this->render_wp_submenu_group(); ?> 88 88 </nav> … … 163 163 return array( 164 164 array( 165 'slug' => 'visibility', 166 'label' => __( 'Visibility Score', 'miniorange-ai-visibility' ), 167 'icon' => 'moai-i-gauge', 168 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_VISIBILITY ), 169 ), 170 array( 165 171 'slug' => 'analytics', 166 172 'label' => __( 'Analytics', 'miniorange-ai-visibility' ), … … 174 180 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_ANALYTICS . '&tab=inventory' ), 175 181 ), 182 array( 183 'slug' => 'discoverability', 184 'label' => __( 'Help AI Find Your Content', 'miniorange-ai-visibility' ), 185 'icon' => 'moai-i-doc', 186 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_DISCOVERABILITY ), 187 ), 176 188 ); 177 189 } … … 196 208 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_SETTINGS . '&tab=control' ), 197 209 ), 198 array(199 'slug' => 'mcp-control',200 'label' => __( 'MCP Control', 'miniorange-ai-visibility' ),201 'icon' => 'moai-i-lock',202 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_MCP_CONTROL ),203 ),204 210 ); 205 211 } … … 218 224 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_ANALYTICS . '&tab=activity' ), 219 225 ), 226 ); 227 } 228 229 /** 230 * Advanced nav items. 231 * 232 * @return array<int, array<string, mixed>> 233 */ 234 private function get_advanced_items(): array { 235 return array( 220 236 array( 221 237 'slug' => 'mcp-tracker', 222 'label' => __( ' MCP Log', 'miniorange-ai-visibility' ),238 'label' => __( 'AI Tool Log (MCP)', 'miniorange-ai-visibility' ), 223 239 'icon' => 'moai-i-sparkle', 224 240 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_MCP_TRACKER ), 225 241 ), 226 ); 227 } 228 229 /** 230 * Optimize nav items. 231 * 232 * @return array<int, array<string, mixed>> 233 */ 234 private function get_optimize_items(): array { 235 return array( 236 array( 237 'slug' => 'visibility', 238 'label' => __( 'Visibility Score', 'miniorange-ai-visibility' ), 239 'icon' => 'moai-i-gauge', 240 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_VISIBILITY ), 241 ), 242 array( 243 'slug' => 'discoverability', 244 'label' => __( 'Discoverability', 'miniorange-ai-visibility' ), 245 'icon' => 'moai-i-doc', 246 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_DISCOVERABILITY ), 242 array( 243 'slug' => 'mcp-control', 244 'label' => __( 'AI Tool Access (MCP)', 'miniorange-ai-visibility' ), 245 'icon' => 'moai-i-lock', 246 'url' => admin_url( 'admin.php?page=' . Plugin_Constants::MENU_SLUG_MCP_CONTROL ), 247 247 ), 248 248 ); -
miniorange-ai-visibility/trunk/views/src/common/pages/ai-inventory/class-ai-inventory-view.php
r3636134 r3723403 45 45 */ 46 46 public function render(): void { 47 $snapshot = (array) ( $this->data['snapshot'] ?? array() ); 48 $counts = (array) ( $snapshot['counts'] ?? array() ); 49 $has_activity = ! empty( $counts['agents'] ) || ! empty( $counts['mcp_servers'] ); 50 47 51 $shell = new App_Shell_View( 'ai-inventory' ); 48 52 $shell->open(); … … 50 54 ( new App_Header_View( 51 55 __( 'AI Inventory', 'miniorange-ai-visibility' ), 52 __( ' Live catalog of agents, MCP servers, and tools touching this site', 'miniorange-ai-visibility' ),53 self::get_live_indicator_html( )56 __( 'AI bots and connected AI tools detected on this site.', 'miniorange-ai-visibility' ), 57 self::get_live_indicator_html( $has_activity ) 54 58 ) )->render(); 55 59 … … 62 66 * Live indicator markup for the page header. 63 67 * 68 * @param bool $has_activity Whether inventory data has been recorded. 64 69 * @return string 65 70 */ 66 public static function get_live_indicator_html( ): string {71 public static function get_live_indicator_html( bool $has_activity = false ): string { 67 72 ob_start(); 68 73 ?> 69 <div class="moai-av-live-indicator " id="moai-av-inv-live" aria-live="polite">74 <div class="moai-av-live-indicator<?php echo esc_attr( $has_activity ? '' : ' is-waiting' ); ?>" id="moai-av-inv-live" aria-live="polite"> 70 75 <span class="moai-av-live-dot" aria-hidden="true"></span> 71 76 <span class="moai-av-live-indicator__text" id="moai-av-inv-live-text"> 72 <?php e sc_html_e( 'Live · refreshed just now', 'miniorange-ai-visibility' ); ?>77 <?php echo $has_activity ? esc_html__( 'Live · refreshed just now', 'miniorange-ai-visibility' ) : esc_html__( 'Waiting for AI traffic', 'miniorange-ai-visibility' ); ?> 73 78 </span> 74 79 </div> … … 182 187 <div class="moai-av-empty-state"> 183 188 <div class="moai-av-empty-state__icon" aria-hidden="true">🛰️</div> 184 <h3><?php esc_html_e( ' No AI traffic catalogued yet', 'miniorange-ai-visibility' ); ?></h3>185 <p><?php esc_html_e( ' Once AI crawlers visit your site or an MCP client calls a tool, they will appear here automatically.', 'miniorange-ai-visibility' ); ?></p>189 <h3><?php esc_html_e( 'Waiting for your first AI visitor', 'miniorange-ai-visibility' ); ?></h3> 190 <p><?php esc_html_e( 'The inventory fills automatically after an AI bot visits your site. Connected AI tools (MCP) are optional and only appear if you use them.', 'miniorange-ai-visibility' ); ?></p> 186 191 </div> 187 192 </div> -
miniorange-ai-visibility/trunk/views/src/common/pages/discoverability/class-discoverability-view.php
r3670315 r3723403 65 65 66 66 ( new App_Header_View( 67 __( ' Discoverability', 'miniorange-ai-visibility' ),68 __( 'Publish structured, agent-friendly versions of yoursite content.', 'miniorange-ai-visibility' ),67 __( 'Help AI Find Your Content', 'miniorange-ai-visibility' ), 68 __( 'Publish clear, AI-friendly versions of your public site content.', 'miniorange-ai-visibility' ), 69 69 '<button type="button" class="moai-av-btn moai-av-btn-primary" id="moai-av-discoverability-save">' . esc_html__( 'Save settings', 'miniorange-ai-visibility' ) . '</button>' 70 70 ) )->render(); … … 74 74 75 75 <div class="moai-av-section"> 76 <div class="moai-av-section-switch moai-av-section-switch--discover" role="tablist" aria-label="<?php esc_attr_e( 'Discoverability tools', 'miniorange-ai-visibility' ); ?>"> 76 <div class="moai-av-card moai-av-discover-start"> 77 <div class="moai-av-discover-start__content"> 78 <span class="moai-av-pill moai-av-pill--ok"><?php esc_html_e( 'Recommended first step', 'miniorange-ai-visibility' ); ?></span> 79 <h2><?php esc_html_e( 'Publish an AI-readable map of your site', 'miniorange-ai-visibility' ); ?></h2> 80 <p><?php esc_html_e( 'Turn on llms.txt to give AI assistants a simple list of your most important public content. You can review the generated file before sharing it.', 'miniorange-ai-visibility' ); ?></p> 81 </div> 82 <a class="moai-av-btn moai-av-btn-primary" href="#moai-av-section-llms"> 83 <?php echo ! empty( $llms['enabled'] ) ? esc_html__( 'Review llms.txt', 'miniorange-ai-visibility' ) : esc_html__( 'Set Up llms.txt', 'miniorange-ai-visibility' ); ?> 84 </a> 85 </div> 86 </div> 87 88 <div class="moai-av-section"> 89 <div class="moai-av-section-switch moai-av-section-switch--discover"> 77 90 <button 78 91 type="button" … … 86 99 <?php esc_html_e( 'llms.txt', 'miniorange-ai-visibility' ); ?> 87 100 </button> 101 <details class="moai-av-discover-more"> 102 <summary><?php esc_html_e( 'More options', 'miniorange-ai-visibility' ); ?></summary> 103 <div class="moai-av-discover-more__tabs" role="tablist" aria-label="<?php esc_attr_e( 'Additional discoverability tools', 'miniorange-ai-visibility' ); ?>"> 88 104 <button 89 105 type="button" … … 141 157 <?php esc_html_e( 'IndexNow', 'miniorange-ai-visibility' ); ?> 142 158 </button> 159 </div> 160 </details> 143 161 </div> 144 162 </div> … … 154 172 printf( 155 173 /* translators: %s: llms.txt URL */ 156 esc_html__( ' Published at %s with optional llms-full.txt forcomplete content.', 'miniorange-ai-visibility' ),174 esc_html__( 'Creates a simple content map for AI assistants at %s. An optional full version can include complete content.', 'miniorange-ai-visibility' ), 157 175 '<code>/llms.txt</code>' 158 176 ); -
miniorange-ai-visibility/trunk/views/src/common/pages/settings/class-settings-view.php
r3670315 r3723403 81 81 $header_titles = array( 82 82 'crawlers' => array( __( 'AI Crawlers', 'miniorange-ai-visibility' ), __( 'Choose which bots are tracked, and add your own.', 'miniorange-ai-visibility' ) ), 83 'control' => array( __( 'Crawler Control', 'miniorange-ai-visibility' ), __( ' Decide who gets in — robots.txt rules and PHP blocking.', 'miniorange-ai-visibility' ) ),83 'control' => array( __( 'Crawler Control', 'miniorange-ai-visibility' ), __( 'Ask AI bots not to crawl, or force-block bots that ignore your request.', 'miniorange-ai-visibility' ) ), 84 84 'account' => array( __( 'Settings', 'miniorange-ai-visibility' ), __( 'Data preferences and email reports.', 'miniorange-ai-visibility' ) ), 85 85 ); … … 263 263 <div class="moai-av-section-head"> 264 264 <div> 265 <h2><?php esc_html_e( ' robots.txt rules', 'miniorange-ai-visibility' ); ?></h2>266 <div class="moai-av-section-desc"><?php esc_html_e( ' Disallow selected bots — changes apply the moment you save', 'miniorange-ai-visibility' ); ?></div>265 <h2><?php esc_html_e( 'Ask bots not to crawl (robots.txt)', 'miniorange-ai-visibility' ); ?></h2> 266 <div class="moai-av-section-desc"><?php esc_html_e( 'Publish a standard request that selected bots avoid your site. Cooperative bots will respect it; others may ignore it.', 'miniorange-ai-visibility' ); ?></div> 267 267 </div> 268 268 </div> … … 286 286 <?php $this->render_crawler_select( 'moai-av-robots-crawler-select', $monitored_crawlers, ! $robots_txt_enabled ); ?> 287 287 <button type="button" class="moai-av-btn moai-av-btn-ghost" id="moai-av-robots-disallow-btn"<?php disabled( ! $robots_txt_enabled ); ?>> 288 <?php esc_html_e( ' Disallow in robots.txt', 'miniorange-ai-visibility' ); ?>288 <?php esc_html_e( 'Ask This Bot Not to Crawl', 'miniorange-ai-visibility' ); ?> 289 289 </button> 290 290 </div> … … 317 317 printf( 318 318 /* translators: %s: crawler category label */ 319 esc_html__( ' Disallow all %s', 'miniorange-ai-visibility' ),319 esc_html__( 'Ask all %s bots not to crawl', 'miniorange-ai-visibility' ), 320 320 esc_html( (string) $category_label ) 321 321 ); … … 362 362 <div class="moai-av-section-head"> 363 363 <div> 364 <h2><?php esc_html_e( ' PHPblocking', 'miniorange-ai-visibility' ); ?></h2>365 <div class="moai-av-section-desc"><?php esc_html_e( 'Re turn a 403 response instead of serving pages — bots that ignore robots.txt still get blocked', 'miniorange-ai-visibility' ); ?></div>364 <h2><?php esc_html_e( 'Hard blocking', 'miniorange-ai-visibility' ); ?></h2> 365 <div class="moai-av-section-desc"><?php esc_html_e( 'Refuse access instead of serving the page. Use this for bots that ignore your robots.txt request.', 'miniorange-ai-visibility' ); ?></div> 366 366 </div> 367 367 </div> 368 368 <div class="moai-av-card moai-av-card-flush" id="moai-av-blocking-section"> 369 369 <div class="moai-av-settings-row"> 370 <div><div class="moai-av-s-label"><?php esc_html_e( 'Enable PHPblocking', 'miniorange-ai-visibility' ); ?></div></div>370 <div><div class="moai-av-s-label"><?php esc_html_e( 'Enable hard blocking', 'miniorange-ai-visibility' ); ?></div></div> 371 371 <label class="moai-av-toggle"> 372 372 <input type="checkbox" id="moai-av-php-blocking-enabled" <?php checked( $php_blocking_enabled ); ?> /> … … 401 401 <?php $this->render_crawler_select( 'moai-av-php-crawler-select', $monitored_crawlers, ! $php_blocking_enabled ); ?> 402 402 <button type="button" class="moai-av-btn moai-av-btn-ghost" id="moai-av-php-block-btn"<?php disabled( ! $php_blocking_enabled ); ?>> 403 <?php esc_html_e( ' Block via PHP (403)', 'miniorange-ai-visibility' ); ?>403 <?php esc_html_e( 'Hard Block This Bot', 'miniorange-ai-visibility' ); ?> 404 404 </button> 405 405 </div> 406 406 </div> 407 407 <div class="moai-av-field"> 408 <label for="moai-av-php-block-message"><?php esc_html_e( ' Custom 403message', 'miniorange-ai-visibility' ); ?></label>408 <label for="moai-av-php-block-message"><?php esc_html_e( 'Access denied message', 'miniorange-ai-visibility' ); ?></label> 409 409 <textarea 410 410 id="moai-av-php-block-message" … … 414 414 <?php disabled( ! $php_blocking_enabled ); ?> 415 415 ><?php echo esc_textarea( $php_block_message ); ?></textarea> 416 <p class="moai-av-muted"><?php esc_html_e( 'Shown as plain text when a PHP-blocked crawler or IP receives a 403 response.', 'miniorange-ai-visibility' ); ?></p>416 <p class="moai-av-muted"><?php esc_html_e( 'Shown as plain text when a hard-blocked bot or IP address is refused access.', 'miniorange-ai-visibility' ); ?></p> 417 417 </div> 418 418 <div class="moai-av-table-wrap moai-av-blocked-list-wrap" id="moai-av-blocked-list"> 419 419 <?php if ( empty( $ua_blocks ) ) : ?> 420 <p class="moai-av-muted"><?php esc_html_e( 'No crawlers are PHP-blocked yet.', 'miniorange-ai-visibility' ); ?></p>420 <p class="moai-av-muted"><?php esc_html_e( 'No bots are hard-blocked yet.', 'miniorange-ai-visibility' ); ?></p> 421 421 <?php else : ?> 422 422 <table class="moai-av-table"> … … 447 447 <div> 448 448 <h2><?php esc_html_e( 'Blocked IP Addresses', 'miniorange-ai-visibility' ); ?></h2> 449 <div class="moai-av-section-desc"><?php esc_html_e( ' Block requests from specific IP addresses with a 403 response. Requires PHPblocking to be enabled above.', 'miniorange-ai-visibility' ); ?></div>449 <div class="moai-av-section-desc"><?php esc_html_e( 'Refuse requests from specific IP addresses. Requires hard blocking to be enabled above.', 'miniorange-ai-visibility' ); ?></div> 450 450 </div> 451 451 </div> … … 646 646 <?php else : ?> 647 647 <button type="button" class="moai-av-crawler-menu__item moai-av-robots-add" data-crawler-id="<?php echo esc_attr( $crawler_id ); ?>"> 648 <?php esc_html_e( ' Disallow in robots.txt', 'miniorange-ai-visibility' ); ?>648 <?php esc_html_e( 'Ask not to crawl (robots.txt)', 'miniorange-ai-visibility' ); ?> 649 649 </button> 650 650 <?php endif; ?> … … 655 655 <?php else : ?> 656 656 <button type="button" class="moai-av-crawler-menu__item moai-av-php-block" data-crawler-id="<?php echo esc_attr( $crawler_id ); ?>"> 657 <?php esc_html_e( ' Block via PHP (403)', 'miniorange-ai-visibility' ); ?>657 <?php esc_html_e( 'Hard block this bot', 'miniorange-ai-visibility' ); ?> 658 658 </button> 659 659 <?php endif; ?> … … 857 857 <div> 858 858 <h3><?php esc_html_e( 'Compliance monitor', 'miniorange-ai-visibility' ); ?></h3> 859 <div class="moai-av-section-desc"><?php esc_html_e( ' Top disallowed crawlers that visited in the last 30 days — escalate with PHP blockingwhen needed.', 'miniorange-ai-visibility' ); ?></div>859 <div class="moai-av-section-desc"><?php esc_html_e( 'Bots asked not to crawl that still visited in the last 30 days. Hard-block repeat visitors when needed.', 'miniorange-ai-visibility' ); ?></div> 860 860 </div> 861 861 </div> … … 900 900 <?php disabled( ! $php_blocking_enabled ); ?> 901 901 > 902 <?php esc_html_e( ' Block via PHP', 'miniorange-ai-visibility' ); ?>902 <?php esc_html_e( 'Hard block', 'miniorange-ai-visibility' ); ?> 903 903 </button> 904 904 <?php endif; ?>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)