Conversation
- Enhanced Route validation and sanitization to prevent path traversal attacks - Improved email notification system with better error handling - Updated multiple action controllers with security enhancements - Added email notification template for integration failures - Renamed integration images for consistency - Updated deployment workflow configuration - Improved helper functions and smart tags processing
…rations namespaces
…roller - Updated GoogleSheet components and common functions - Modified ajax.php routes - Removed OneClickCredentialController.php - Added EXTERNAL-SERVICES.md documentation - Updated readme.txt
- Fixed namespace mismatch in composer.json from BitCode\FI\ to BitApps\BTCBI_FI- Regenerated composer autoload files to resolve Plugin class not found error - Added source code and build instructions section to readme.txt for WordPress.org compliance
- Fixed WordPress.DB.PreparedSQL.NotPrepared errors by adding phpcs:ignore comments for static queries with no user input - Fixed WordPress.DB.PreparedSQL.InterpolatedNotPrepared errors in dynamic IN clauses using sprintf() pattern - Fixed WordPress.Security.NonceVerification warnings with appropriate phpcs:ignore comments for routing and external parameters - Fixed WordPress.I18n.MissingTranslatorsComment by adding translators comments to 443+ files - Fixed unordered placeholders (changed %s,%d to %1$s,%2$d where needed) Affected files: - TriggerFallback.php: DB query and nonce verification fixes - AcademyLmsController.php: Dynamic IN clause fix for quiz deletion - BuddyBoss/RecordApiHelper.php: Dynamic IN clause fix for group status query - TutorLmsController.php: Dynamic IN clause fix for lesson meta deletion - ZohoCRM/RecordApiHelper.php: Nonce verification for external parameters - Route.php: Nonce verification in routing logic - GamiPress, LifterLms, Affiliate, PaidMembershipPro controllers: Static query fixes - 443+ files: Added translators comments for i18n compliance All changes maintain functionality while ensuring WordPress coding standards compliance.
There was a problem hiding this comment.
Pull request overview
Updates the plugin to version 2.7.8 while refactoring a large set of integrations to a new root namespace and addressing WordPress Plugin Check/WPCS concerns.
Changes:
- Migrated PHP namespaces/autoloading from
BitCode\FI\toBitApps\BTCBI_FI\across integrations. - Added caching, PHPCS suppressions, translator comments, and removed debug logging in several helpers/controllers.
- Reworked the GitHub workflow to run WordPress Plugin Check on PRs/pushes to
main, plus refreshed frontend changelog and Google Sheets auth logic.
Reviewed changes
Copilot reviewed 295 out of 565 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| includes/Actions/PerfexCRM/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/PerfexCRM/PerfexCRMController.php | Namespace/import migration; added translator comment. |
| includes/Actions/PaidMembershipPro/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/PaidMembershipPro/RecordApiHelper.php | Added WP object cache around membership level lookup. |
| includes/Actions/PaidMembershipPro/PaidMembershipProController.php | Cached PMPro levels query; added translator comment. |
| includes/Actions/Pabbly/PabblyController.php | Namespace/import migration to new root. |
| includes/Actions/PCloud/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/PCloud/RecordApiHelper.php | Namespace/import migration; reordered imports. |
| includes/Actions/PCloud/PCloudController.php | Namespace/import migration; added translator comment. |
| includes/Actions/OneHashCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/OneHashCRM/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/OneHashCRM/OneHashCRMController.php | Namespace/import migration; added translator comment. |
| includes/Actions/OneDrive/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/OneDrive/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/OneDrive/OneDriveController.php | Namespace/import migration; added translator comment. |
| includes/Actions/OmniSend/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/OmniSend/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/OmniSend/OmniSendController.php | Namespace/import migration; added translator comment. |
| includes/Actions/NutshellCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/NutshellCRM/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/NutshellCRM/NutshellCRMController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Notion/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Notion/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Notion/NotionController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Nimble/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Nimble/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Nimble/NimbleController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Newsletter/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Newsletter/RecordApiHelper.php | Namespace/import migration; reordered imports. |
| includes/Actions/Newsletter/NewsletterController.php | Namespace migration to new root. |
| includes/Actions/N8n/N8nController.php | Namespace/import migration to new root. |
| includes/Actions/MoxieCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MoxieCRM/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/MoxieCRM/MoxieCRMController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Moosend/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Moosend/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Moosend/MoosendHelper.php | Namespace migration to new root. |
| includes/Actions/Moosend/MoosendController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Memberpress/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Memberpress/RecordApiHelper.php | Namespace/import migration; added translator comment. |
| includes/Actions/Memberpress/MemberpressController.php | Namespace/import migration; PHPCS ignore; translator comments. |
| includes/Actions/Mautic/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mautic/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mautic/MauticController.php | Namespace/import migration; added translator comment. |
| includes/Actions/MasterStudyLms/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MasterStudyLms/RecordApiHelper.php | Namespace/import migration; reordered imports. |
| includes/Actions/MasterStudyLms/MasterStudyLmsHelper.php | Added PHPCS suppressions for direct DB reads. |
| includes/Actions/MasterStudyLms/MasterStudyLmsController.php | Namespace migration; added translator comments. |
| includes/Actions/Mailup/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mailup/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mailup/MailupController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Mailster/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mailster/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mailster/MailsterController.php | Namespace migration to new root. |
| includes/Actions/Mailjet/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mailjet/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mailjet/MailjetController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Mailify/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mailify/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mailify/MailifyController.php | Namespace/import migration; added translator comment. |
| includes/Actions/Mailercloud/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Mailercloud/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/Mailercloud/MailercloudController.php | Namespace/import migration; added translator comment. |
| includes/Actions/MailerPress/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailerPress/RecordApiHelper.php | Namespace/import migration; default message translator note. |
| includes/Actions/MailerPress/MailerPressController.php | Namespace migration; added translator comment; removed trailing whitespace. |
| includes/Actions/MailerLite/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailerLite/RecordApiHelper.php | Namespace/import migration; added PHPCS ignores for $_SERVER. |
| includes/Actions/MailerLite/MailerLiteController.php | Namespace/import migration; added translator comment. |
| includes/Actions/MailRelay/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailRelay/RecordApiHelper.php | Namespace/import migration to new root. |
| includes/Actions/MailRelay/MailRelayController.php | Namespace/import migration; added translator comment. |
| includes/Actions/MailPoet/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailPoet/RecordApiHelper.php | Namespace migration; added translator comment (near response handling). |
| includes/Actions/MailPoet/MailPoetController.php | Namespace migration; updated comment; added translator comment. |
| includes/Actions/MailMint/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailMint/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/MailMint/MailMintController.php | Namespace migration; cached DB query; added translator comments. |
| includes/Actions/MailChimp/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailChimp/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/MailChimp/MailChimpController.php | Namespace migration; import reorder; added translator comment. |
| includes/Actions/MailBluster/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/MailBluster/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/MailBluster/MailBlusterController.php | Namespace migration; added translator comment. |
| includes/Actions/Mail/MailController.php | Namespace migration; ABSPATH guard added; updated sprintf placeholders. |
| includes/Actions/Livestorm/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Livestorm/RecordApiHelper.php | Namespace migration; added translator comments for required fields. |
| includes/Actions/Livestorm/LivestormController.php | Namespace migration; added translator comment. |
| includes/Actions/LionDesk/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/LionDesk/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/LionDesk/LionDeskController.php | Namespace migration; added translator comment. |
| includes/Actions/Line/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Line/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/Line/LineController.php | Namespace migration to new root. |
| includes/Actions/LifterLms/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/LifterLms/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/LifterLms/LifterLmsController.php | Added caching to course/membership lookups; translator comment. |
| includes/Actions/Lemlist/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Lemlist/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Lemlist/LemlistController.php | Namespace migration; added translator comment. |
| includes/Actions/LearnDash/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/LearnDash/RecordApiHelper.php | Import reorder; added PHPCS ignores; fixed SQL quoting. |
| includes/Actions/LearnDash/LearnDashController.php | Namespace migration; added translator comment. |
| includes/Actions/LMFWC/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/LMFWC/RecordApiHelper.php | Namespace migration; added translator comments for pro-only fallback. |
| includes/Actions/LMFWC/LMFWCController.php | Namespace migration; added translator comment. |
| includes/Actions/KonnectzIT/KonnectzITController.php | Namespace migration to new root. |
| includes/Actions/Klaviyo/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Klaviyo/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/Klaviyo/KlaviyoController.php | Namespace migration; import reorder; added translator comment. |
| includes/Actions/KirimEmail/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/KirimEmail/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/KirimEmail/KirimEmailController.php | Namespace migration; added translator comment. |
| includes/Actions/Keap/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Keap/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Keap/KeapController.php | Namespace migration; import reorder; added translator comment. |
| includes/Actions/JetEngine/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/JetEngine/RecordApiHelper.php | Namespace migration; added PHPCS ignore for direct update. |
| includes/Actions/JetEngine/JetEngineController.php | Namespace migration; added translator comment for plugin missing. |
| includes/Actions/Integromat/IntegromatController.php | Namespace migration to new root. |
| includes/Actions/Integrately/IntegratelyController.php | Namespace migration to new root. |
| includes/Actions/Insightly/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Insightly/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Insightly/InsightlyController.php | Namespace migration; added translator comment. |
| includes/Actions/Hubspot/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Hubspot/HubspotRecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/Hubspot/HubspotController.php | Namespace migration to new root. |
| includes/Actions/HighLevel/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/HighLevel/RecordApiHelper.php | Namespace migration; added translator comment in default response. |
| includes/Actions/HighLevel/HighLevelController.php | Namespace migration; added translator comments for errors. |
| includes/Actions/Groundhogg/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Groundhogg/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Groundhogg/GroundhoggController.php | Namespace migration; added translator comment. |
| includes/Actions/Gravitec/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Gravitec/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Gravitec/GravitecController.php | Namespace migration; added translator comment. |
| includes/Actions/GoogleSheet/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GoogleSheet/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/GoogleSheet/GoogleSheetController.php | Namespace migration; ABSPATH guard added; translator note. |
| includes/Actions/GoogleDrive/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GoogleDrive/RecordApiHelper.php | Namespace migration; removed debug logging. |
| includes/Actions/GoogleDrive/GoogleDriveController.php | Namespace migration; added translator comment. |
| includes/Actions/GoogleContacts/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GoogleContacts/RecordApiHelper.php | Namespace migration; replaced file_get_contents with wp_remote_get. |
| includes/Actions/GoogleContacts/GoogleContactsController.php | Namespace migration; added translator comment. |
| includes/Actions/GoogleCalendar/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GoogleCalendar/RecordApiHelper.php | Namespace migration; imports reordered. |
| includes/Actions/GoogleCalendar/GoogleCalendarController.php | Namespace migration; added translator comment. |
| includes/Actions/GiveWp/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GiveWp/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/GiveWp/GiveWpController.php | Namespace migration; added translator comment(s). |
| includes/Actions/Getgist/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Getgist/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Getgist/GetgistController.php | Namespace migration; added translator comment. |
| includes/Actions/GetResponse/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GetResponse/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/GetResponse/GetResponseController.php | Namespace migration; added translator comment. |
| includes/Actions/GamiPress/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/GamiPress/RecordApiHelper.php | Namespace migration; improved sprintf placeholders; translator notes. |
| includes/Actions/Freshdesk/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Freshdesk/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Freshdesk/FreshdeskController.php | Namespace migration; added translator comment. |
| includes/Actions/Freshdesk/FilesApiHelper.php | Namespace migration; updated HttpHelper import. |
| includes/Actions/Freshdesk/AllFilesApiHelper.php | Namespace migration; updated HttpHelper import. |
| includes/Actions/FreshSales/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/FreshSales/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/FreshSales/FreshSalesController.php | Namespace migration; import reorder; added translator comment. |
| includes/Actions/FluentSupport/Routes.php | Namespace/import migration; formatting tweak. |
| includes/Actions/FluentSupport/RecordApiHelper.php | Namespace migration; added PHPCS ignore + translator note. |
| includes/Actions/FluentSupport/FluentSupportController.php | Namespace migration; translator comment for missing plugin. |
| includes/Actions/FluentCrm/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/FluentCrm/RecordApiHelper.php | Namespace migration; changed applied filter name. |
| includes/Actions/FluentCrm/FluentCrmController.php | Namespace migration; imports reordered; translator note. |
| includes/Actions/FluentCart/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/FluentCart/RecordApiHelper.php | Namespace migration; translator note in default response. |
| includes/Actions/FluentCart/FluentCartController.php | Namespace migration to new root. |
| includes/Actions/Flowlu/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Flowlu/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Flowlu/FlowluController.php | Namespace migration; added translator comment. |
| includes/Actions/FlowMattic/FlowMatticController.php | Namespace migration to new root. |
| includes/Actions/Fabman/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Fabman/RecordApiHelper.php | Namespace migration; improved i18n formatting. |
| includes/Actions/Fabman/FabmanController.php | Namespace migration; removed debug logging. |
| includes/Actions/Encharge/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Encharge/RecordApiHelper.php | Namespace migration; updated imports. |
| includes/Actions/Encharge/EnchargeController.php | Namespace migration; added translator comment. |
| includes/Actions/EmailOctopus/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/EmailOctopus/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/EmailOctopus/EmailOctopusController.php | Namespace migration; updated HttpHelper import. |
| includes/Actions/ElasticEmail/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ElasticEmail/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/ElasticEmail/ElasticEmailController.php | Namespace migration; added translator comment. |
| includes/Actions/Dropbox/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Dropbox/RecordApiHelper.php | Namespace migration; import reorder. |
| includes/Actions/Dropbox/DropboxController.php | Namespace migration; added translator comment. |
| includes/Actions/Drip/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Drip/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Drip/DripController.php | Namespace migration; added translator comment. |
| includes/Actions/Dokan/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Dokan/RecordApiHelper.php | Namespace migration; improved sprintf placeholders; translator notes. |
| includes/Actions/Dokan/DokanController.php | Namespace migration; added translator comment. |
| includes/Actions/Discord/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Discord/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Discord/FilesApiHelper.php | Namespace migration; import reorder. |
| includes/Actions/Discord/DiscordController.php | Namespace migration; added translator comment. |
| includes/Actions/DirectIq/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/DirectIq/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/DirectIq/DirectIqController.php | Namespace migration; added translator comment. |
| includes/Actions/Demio/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Demio/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Demio/DemioController.php | Namespace migration; added translator comment. |
| includes/Actions/CustomApi/CustomApiController.php | Namespace migration; updated imports. |
| includes/Actions/CustomAction/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/CustomAction/CustomActionController.php | Reworked temp file handling to WP_Filesystem + uploads dir. |
| includes/Actions/CopperCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/CopperCRM/RecordApiHelper.php | Namespace migration; updated imports. |
| includes/Actions/CopperCRM/CopperCRMController.php | Namespace migration; added translator comment. |
| includes/Actions/ConvertKit/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ConvertKit/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/ConvertKit/ConvertKitController.php | Namespace migration; added translator comment. |
| includes/Actions/ConstantContact/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ConstantContact/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/ConstantContact/ConstantContactController.php | Namespace migration; imports updated; translator comment. |
| includes/Actions/CompanyHub/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/CompanyHub/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/CompanyHub/CompanyHubController.php | Namespace migration; added translator comment. |
| includes/Actions/ClinchPad/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ClinchPad/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/ClinchPad/ClinchPadController.php | Namespace migration; added translator comment. |
| includes/Actions/Clickup/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Clickup/RecordApiHelper.php | Switched file upload to CURLFile; namespace migration. |
| includes/Actions/Clickup/ClickupController.php | Namespace migration; added translator comment. |
| includes/Actions/CapsuleCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/CapsuleCRM/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/CapsuleCRM/CapsuleCRMController.php | Namespace migration; added translator comment. |
| includes/Actions/CampaignMonitor/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/CampaignMonitor/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/CampaignMonitor/CampaignMonitorController.php | Namespace migration; added translator comment. |
| includes/Actions/BuddyBoss/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/BuddyBoss/Hooks.php | Updated controller/Hooks imports to new namespace. |
| includes/Actions/BuddyBoss/BuddyBossController.php | Added caching for group/user lists; namespace migration. |
| includes/Actions/BitForm/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/BitForm/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/BitForm/BitFormController.php | Namespace migration; added translator comment. |
| includes/Actions/Bento/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Bento/RecordApiHelper.php | Namespace migration; translator note. |
| includes/Actions/Bento/BentoHelper.php | Namespace migration; updated import. |
| includes/Actions/Bento/BentoController.php | Namespace migration; import reorder; translator comment. |
| includes/Actions/BenchMark/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/BenchMark/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/BenchMark/BenchMarkController.php | Namespace migration; import reorder; translator comment. |
| includes/Actions/Autonami/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Autonami/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Autonami/AutonamiController.php | Namespace migration; updated imports; translator note. |
| includes/Actions/AutomatorWP/AutomatorWPController.php | Namespace migration to new root. |
| includes/Actions/Asana/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Asana/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Asana/AsanaController.php | Namespace migration; added translator comment. |
| includes/Actions/AntApps/AntAppsController.php | Namespace migration to new root. |
| includes/Actions/Albato/AlbatoController.php | Namespace migration to new root. |
| includes/Actions/Airtable/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Airtable/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Airtable/AirtableController.php | Namespace migration; updated import. |
| includes/Actions/AgiledCRM/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/AgiledCRM/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/AgiledCRM/AgiledCRMController.php | Namespace migration; added translator comment. |
| includes/Actions/Affiliate/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Affiliate/RecordApiHelper.php | Namespace migration; added translator comment. |
| includes/Actions/Affiliate/AffiliateController.php | Namespace migration; added caching; translator comment. |
| includes/Actions/AdvancedFormIntegration/AdvancedFormIntegrationController.php | Namespace migration to new root. |
| includes/Actions/Acumbamail/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/Acumbamail/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/Acumbamail/AcumbamailController.php | Namespace migration; added translator comment. |
| includes/Actions/ActiveCampaign/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ActiveCampaign/RecordApiHelper.php | Namespace migration to new root. |
| includes/Actions/ActiveCampaign/ActiveCampaignController.php | Namespace migration; added translator comment. |
| includes/Actions/ActionController.php | Namespace migration; switched to wp_safe_redirect. |
| includes/Actions/AcademyLms/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/AcademyLms/AcademyLmsController.php | Namespace migration; ABSPATH guard added; query hardening. |
| includes/Actions/ACPT/Routes.php | Updated controller/Route imports to new namespace. |
| includes/Actions/ACPT/RecordApiHelper.php | Replaced dynamic hooks with explicit filter names. |
| includes/Actions/ACPT/ACPTHelper.php | Namespace migration; translator comments; response validation helper. |
| includes/Actions/ACPT/ACPTController.php | Namespace migration; translator comment. |
| frontend-dev/src/pages/ChangelogToggle.jsx | Updated release date + reorganized changelog sections. |
| frontend-dev/src/components/Flow/New/SelectAction.jsx | Added explicit logo keys and fallback for GetLogo. |
| frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetCommonFunc.js | Removed one-click auth branching; simplified credential usage. |
| frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheetAuthorization.jsx | Removed large blocks of commented one-click auth code. |
| frontend-dev/src/components/AllIntegrations/GoogleSheet/GoogleSheet.jsx | Removed credential prefetch side-effect for one-click auth. |
| composer.json | Updated PSR-4 autoload root namespace. |
| bitwpfi.php | Version bump to 2.7.8 (header + constant). |
| .php-cs-fixer.php | Excluded defined from native_function_invocation rule. |
| .github/workflows/deploy.yml | Replaced deploy workflow with WordPress Plugin Check CI. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if (! defined('ABSPATH')) { | ||
| exit; | ||
| } | ||
|
|
||
| use BitApps\BTCBI_FI\Core\Util\Common; | ||
| use BitApps\BTCBI_FI\Log\LogHandler; | ||
|
|
There was a problem hiding this comment.
use statements must appear before other executable statements in a namespace scope. Placing the ABSPATH guard between the namespace declaration and use imports will trigger a PHP parse error. Move the ABSPATH guard below the use statements, or convert the file to bracketed namespace syntax if you need global-scope code before imports.
| if (! defined('ABSPATH')) { | |
| exit; | |
| } | |
| use BitApps\BTCBI_FI\Core\Util\Common; | |
| use BitApps\BTCBI_FI\Log\LogHandler; | |
| use BitApps\BTCBI_FI\Core\Util\Common; | |
| use BitApps\BTCBI_FI\Log\LogHandler; | |
| if (! defined('ABSPATH')) { | |
| exit; | |
| } |
| namespace BitApps\BTCBI_FI\Actions\GoogleSheet; | ||
|
|
||
| if (! defined('ABSPATH')) { | ||
| exit; | ||
| } | ||
| use BitApps\BTCBI_FI\Core\Util\HttpHelper; | ||
| use BitApps\BTCBI_FI\Flow\FlowController; |
There was a problem hiding this comment.
This has the same parse-error issue: executable code (if (! defined('ABSPATH')) ...) appears before use statements inside the namespace. Relocate the ABSPATH guard after the imports (or switch to bracketed namespaces).
| if (! defined('ABSPATH')) { | ||
| exit; | ||
| } | ||
|
|
||
| use BitApps\BTCBI_FI\Log\LogHandler; | ||
|
|
There was a problem hiding this comment.
Same PHP syntax rule violation as above: use cannot follow other statements in the same namespace scope. Move the ABSPATH guard below the use line(s) or refactor to bracketed namespaces.
| if (! defined('ABSPATH')) { | |
| exit; | |
| } | |
| use BitApps\BTCBI_FI\Log\LogHandler; | |
| use BitApps\BTCBI_FI\Log\LogHandler; | |
| if (! defined('ABSPATH')) { | |
| exit; | |
| } |
.github/workflows/deploy.yml
Outdated
| env: | ||
| PLUGIN_SLUG: bit-smtp |
There was a problem hiding this comment.
The workflow sets PLUGIN_SLUG to bit-smtp, which looks inconsistent with this repository/plugin (Bit Integrations) and will point Plugin Check at a non-existent build directory. Also, pnpm install / pnpm production now run from the repo root, but earlier workflow logic installed from frontend-dev; if the package.json/lockfile live under frontend-dev, these commands will fail unless you cd frontend-dev (and run the build from there).
.github/workflows/deploy.yml
Outdated
| - name: Install dependencies | ||
| run: | | ||
| if [[ "${{ github.event_name }}" == "release" ]]; then | ||
| echo "TEST_ACTION=false" >> $GITHUB_ENV | ||
| else | ||
| echo "TEST_ACTION=true" >> $GITHUB_ENV | ||
| fi | ||
| composer install --prefer-dist --no-progress --no-dev --optimize-autoloader | ||
| pnpm install --frozen-lockfile | ||
|
|
||
| - name: Build | ||
| id: build-plugin | ||
| - name: Build plugin | ||
| run: | | ||
| bash .github/build | ||
| if [ -d "${{ github.workspace }}/build/${{ env.PLUGIN_SLUG }}" ]; then | ||
| echo "free_exists=true" >> "${GITHUB_OUTPUT}" | ||
| else | ||
| echo "free_exists=false" >> "${GITHUB_OUTPUT}" | ||
| fi | ||
| pnpm production | ||
| bash .github/copy-assets |
There was a problem hiding this comment.
The workflow sets PLUGIN_SLUG to bit-smtp, which looks inconsistent with this repository/plugin (Bit Integrations) and will point Plugin Check at a non-existent build directory. Also, pnpm install / pnpm production now run from the repo root, but earlier workflow logic installed from frontend-dev; if the package.json/lockfile live under frontend-dev, these commands will fail unless you cd frontend-dev (and run the build from there).
| $wp_filesystem->delete($filePath); | ||
| wp_send_json_success(__('Exec function not found in your server, So we can\'t validate your function. But you can run your custom action.', 'bit-integrations')); | ||
| } | ||
| $response = exec(escapeshellcmd("php -l {$filePath}"), $output, $return); |
There was a problem hiding this comment.
This writes arbitrary user-supplied PHP into the uploads directory with a .php extension and then executes a shell command referencing it. For safer hardening: write to a non-web-accessible temp location (e.g., via wp_tempnam()/sys_get_temp_dir()), avoid .php extension if possible, and shell-escape the filename with escapeshellarg($filePath) (not escapeshellcmd on the whole command). Consider using PHP_BINARY (or a configurable path) instead of php to avoid PATH ambiguity.
| $msg = str_replace($filePath, 'your function', $response); | ||
| fclose($temp_file); | ||
| $wp_filesystem->delete($filePath); |
There was a problem hiding this comment.
This writes arbitrary user-supplied PHP into the uploads directory with a .php extension and then executes a shell command referencing it. For safer hardening: write to a non-web-accessible temp location (e.g., via wp_tempnam()/sys_get_temp_dir()), avoid .php extension if possible, and shell-escape the filename with escapeshellarg($filePath) (not escapeshellcmd on the whole command). Consider using PHP_BINARY (or a configurable path) instead of php to avoid PATH ambiguity.
| /* translators: %s: Plugin name */ | ||
| $errorMessages = wp_sprintf(__('%s is not active or not installed', 'bit-integrations'), 'Bit Integrations Pro'); | ||
| } elseif (!$response['success']) { | ||
| $errorMessages = $response('message'); |
There was a problem hiding this comment.
$response('message') attempts to call $response as a function. If $response is an array (as implied by $response['success']), this should likely be $response['message'] (or object access if $response is an object).
| $errorMessages = $response('message'); | |
| $errorMessages = $response['message']; |
| public function execute($fieldValues, $fieldMap, $actions, $list_id, $tags, $actionName) | ||
| { | ||
| $fieldData = apply_filters('fluent_crm_assign_company', [], (array) $actions); | ||
| $fieldData = apply_filters('btcbi_fluent_crm_assign_company', [], (array) $actions); |
There was a problem hiding this comment.
Renaming the applied filter from fluent_crm_assign_company to btcbi_fluent_crm_assign_company is a breaking change for any third-party code hooking into the old filter. To preserve compatibility, consider applying both (e.g., apply the old filter first and then the new one), or keep the old name and introduce the new one as an alias with a deprecation path.
| $fieldData = apply_filters('btcbi_fluent_crm_assign_company', [], (array) $actions); | |
| $fieldData = apply_filters('fluent_crm_assign_company', [], (array) $actions); | |
| $fieldData = apply_filters('btcbi_fluent_crm_assign_company', $fieldData, (array) $actions); |
| // translators: %s: Plugin name | ||
| // translators: %s: Placeholder value | ||
| wp_send_json_error(wp_sprintf(__('%s must be activated!', 'bit-integrations'), 'Memberpress')); |
There was a problem hiding this comment.
The translator comments are duplicated/redundant here (both describe the same single %s). Keeping just one accurate translator comment helps avoid clutter and keeps i18n guidance consistent.
Summary of ChangesHello @RishadAlam, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request primarily focuses on a version bump to 2.7.8, accompanied by a major refactoring of PHP namespaces for better code organization and future maintainability. Significant efforts were made to enhance compliance through detailed external services documentation and improve security and internationalization across the codebase. Performance was also boosted with the introduction of caching for several integrations, and various compatibility and file handling improvements were implemented. Highlights
Changelog
Ignored Files
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request introduces a significant and beneficial refactoring by changing the PHP namespace from BitCode\FI to BitApps\BTCBI_FI, which improves code organization and consistency across the project. In addition to this major refactoring, the changes include performance enhancements through database query caching, security improvements by fixing SQL injection vulnerabilities and using wp_safe_redirect, and code quality upgrades by removing dead code and debug logs. I've identified a few minor issues, such as future dates in documentation files and a potential bug in the Discord helper where a variable is overwritten, which I've detailed in the comments. Overall, this is a high-quality pull request with substantial improvements.
I am having trouble creating individual review comments. Click here to see my feedback.
includes/Actions/AcademyLms/AcademyLmsController.php (193-198)
The query to get QuizIds has a hardcoded user_id = '14'. This will cause the logic to fail for any other user. It should use the dynamic $user_id variable.
includes/Actions/Discord/RecordApiHelper.php (73-74)
The value of $recordApiResponse from the uploadFiles call on line 73 is immediately overwritten by the call to sendMessages on line 74. This means the result of the file upload is lost and never checked for success or failure. This could lead to silent failures where a file upload fails but the integration reports success based on the sendMessages call.
$uploadApiResponse = $sendPhotoApiHelper->uploadFiles($this->_apiEndPoint, $data, $this->_accessToken, $integrationDetails->selectedChannel);
// You should check $uploadApiResponse here for errors before proceeding.
$recordApiResponse = $this->sendMessages($data, $integrationDetails->selectedChannel);external-services.md (2260)
The 'Last Updated' date is set to a future date. This appears to be a typo and should be corrected to reflect the actual date of the update.
frontend-dev/src/pages/ChangelogToggle.jsx (14)
The releaseDate constant is set to a future date. This is likely a typo and should be updated to the correct release date.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 295 out of 565 changed files in this pull request and generated 10 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| $domain = $integrationDetails->domain; | ||
|
|
||
| if (empty($fieldMap) || empty($apiToken) || empty($actionName) || empty($domain)) { | ||
|
|
There was a problem hiding this comment.
Empty line before translator comment is unnecessary and inconsistent with other files in the same changeset where translator comments are added directly before the code they describe without an empty line.
| // translators: %s: Plugin name | ||
| // translators: %s: Placeholder value |
There was a problem hiding this comment.
Duplicate translator comments on consecutive lines. Only one comment is needed here since the function call uses a single placeholder.
| // translators: %s: Plugin name | ||
| /* translators: %s: Placeholder value */ |
There was a problem hiding this comment.
Inconsistent translator comment style (// vs /* */) on consecutive lines. Use the same style for consistency.
| // translators: %s: Plugin name | ||
| // translators: %s: Placeholder value |
There was a problem hiding this comment.
Duplicate translator comments on consecutive lines. Only one comment is needed since the function call uses a single placeholder.
|
|
||
|
|
There was a problem hiding this comment.
Excessive empty lines between translator comments. Remove extra empty lines for consistency.
| // translators: %s: Integration name | ||
| // translators: %s: Integration name | ||
|
|
||
|
|
||
| /* translators: %s: Placeholder value */ |
There was a problem hiding this comment.
Duplicate translator comments and excessive empty lines. Remove duplicate comment and extra empty lines.
| 'message' => wp_sprintf(__('%s is not installed or activated.', 'bit-integrations'), 'The Dokan Pro'), | ||
| 'success' => false, |
There was a problem hiding this comment.
The 'success' key should come before 'message' to maintain consistent ordering with the rest of the codebase where status fields typically precede message fields.
| 'message' => wp_sprintf(__('%s is not installed or activated.', 'bit-integrations'), 'The Dokan Pro'), | |
| 'success' => false, | |
| 'success' => false, | |
| 'message' => wp_sprintf(__('%s is not installed or activated.', 'bit-integrations'), 'The Dokan Pro'), |
|
|
||
| $QuizIds = $wpdb->get_col($wpdb->prepare("select quiz_id from {$wpdb->prefix}academy_quiz_attempts where user_id = '14' AND course_id = %d ", $course_id)); | ||
| // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query needed for AcademyLMS reset lookup. | ||
| $QuizIds = $wpdb->get_col($wpdb->prepare("SELECT quiz_id FROM {$wpdb->prefix}academy_quiz_attempts WHERE user_id = %d AND course_id = %d", $user_id, $course_id)); |
There was a problem hiding this comment.
Variable $QuizIds uses PascalCase naming which is inconsistent with PHP naming conventions. Should be $quiz_ids to follow camelCase convention.
|
|
||
|
|
There was a problem hiding this comment.
Empty line before translator comment is inconsistent with the pattern used elsewhere in this file and changeset.
|
|
||
|
|
There was a problem hiding this comment.
Empty line before translator comment is unnecessary and inconsistent with other translator comments in the same file.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 295 out of 565 changed files in this pull request and generated 4 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| private static function uploadTicketFiles($finalData, $attachments, $ticket, $customer, $flowId) | ||
| { | ||
| if (BtcbiHelper::proActionFeatExists('FluentSupport', 'uploadTicketAttachments')) { | ||
| do_action('btcbi_fluent_support_upload_ticket_attachments', $finalData, $attachments, $ticket, $customer, $flowId); | ||
| } | ||
| do_action('btcbi_fluent_support_upload_ticket_attachments', $finalData, $attachments, $ticket, $customer, $flowId); | ||
|
|
||
| // translators: %s: Placeholder value | ||
| LogHandler::save($flowId, ['type' => 'Ticket', 'type_name' => 'Upload-Ticket-Attachments'], 'error', wp_sprintf(__('%s plugin is not installed or activate', 'bit-integrations'), 'Bit Integrations Pro')); | ||
| } |
There was a problem hiding this comment.
This function now always logs an error even when attachments are successfully handled by hooked callbacks. The error log should only be written when the Pro handler isn't available / no callback ran, or when the upload action explicitly fails. Consider checking for the Pro capability (or whether any callback is attached via has_action()), or have the action return/record a success flag and conditionally log.
| // translators: %s: Plugin name | ||
| $errorMessages = wp_sprintf(__('%s is not active or not installed', 'bit-integrations'), 'Bit Integrations Pro'); | ||
| } elseif (!$response['success']) { | ||
| $errorMessages = $response('message'); |
There was a problem hiding this comment.
$response('message') is a function call and will fatally error if $response is an array/object (which it appears to be, given $response['success']). This should read the message field (e.g., $response['message'] or $response->message, depending on structure).
| $errorMessages = $response('message'); | |
| $errorMessages = isset($response['message']) ? $response['message'] : ''; |
| wp_safe_redirect($state . '&' . http_build_query($params), 302); | ||
| exit; |
There was a problem hiding this comment.
Previously the function only exited when wp_redirect() succeeded. With unconditional exit, if headers are already sent (or redirect is otherwise not performed), the request will terminate without output. Consider restoring conditional exit (check the return value) or handling the failure case (e.g., fallback response or wp_die with a link).
| wp_safe_redirect($state . '&' . http_build_query($params), 302); | |
| exit; | |
| $redirect_url = $state . '&' . http_build_query($params); | |
| if (wp_safe_redirect($redirect_url, 302)) { | |
| exit; | |
| } | |
| wp_die( | |
| sprintf( | |
| 'Redirection failed. Please click <a href="%s">here</a> to continue.', | |
| esc_url($redirect_url) | |
| ) | |
| ); |
| } | ||
| $imageData = wp_remote_retrieve_body($response); |
There was a problem hiding this comment.
This now base64-encodes the response body without validating the HTTP status code or ensuring a non-empty/binary payload. If the URL returns an error page (e.g., 404 HTML), the API call will likely fail with a confusing error. Consider checking wp_remote_retrieve_response_code($response) === 200 (and that body is not empty) and returning a meaningful WP_Error when the fetch isn't successful.
| } | |
| $imageData = wp_remote_retrieve_body($response); | |
| } | |
| $status_code = wp_remote_retrieve_response_code($response); | |
| if (200 !== $status_code) { | |
| return new \WP_Error( | |
| 'image_fetch_failed', | |
| sprintf('Failed to fetch image. HTTP status code: %d', $status_code), | |
| ['status_code' => $status_code, 'image_url' => $imageLocation] | |
| ); | |
| } | |
| $imageData = wp_remote_retrieve_body($response); | |
| if (!is_string($imageData) || $imageData === '') { | |
| return new \WP_Error( | |
| 'image_fetch_failed', | |
| 'Failed to fetch image content or image is empty.', | |
| ['image_url' => $imageLocation] | |
| ); | |
| } |
No description provided.