PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / Independent_Analytics.php
independent-analytics / IAWP Last commit date
AJAX 4 days ago Admin_Page 4 days ago Click_Tracking 4 days ago ColumnOptions 6 months ago Cron 9 months ago Data_Pruning 4 days ago Date_Picker 3 months ago Date_Range 5 months ago Ecommerce 5 months ago Email_Reports 4 days ago Examiner 3 months ago Favicon 2 months ago Form_Submissions 4 days ago Integrations 4 days ago Journey 3 months ago Migrations 6 months ago Models 4 days ago Overview 2 months ago Public_API 5 months ago RealTime 4 days ago Rows 4 days ago Statistics 4 days ago Tables 4 days ago Utils 4 days ago Views 4 days ago ViewsColumn 4 days ago WooCommerceOrderMetaBox 5 months ago ActivationLifecycle.php 3 months ago Admin_Bar_Stats.php 4 days ago Appearance.php 1 year ago BreakdanceFormAction.php 4 days ago Campaign_Builder.php 4 days ago Capability_Manager.php 4 days ago Chart.php 2 months ago Chart_Data.php 1 year ago Click_Tracking.php 2 months ago ComplianzIntegration.php 3 months ago Cron_Job.php 5 months ago Cron_Manager.php 5 months ago Dashboard_Options.php 6 months ago Dashboard_Widget.php 2 months ago Database.php 8 months ago Database_Manager.php 4 days ago Empty_Report_Option.php 2 years ago Env.php 4 days ago Examiner_Config.php 11 months ago FetchFaviconsJob.php 5 months ago Filters.php 3 months ago Geo_Database_Health_Check_Job.php 9 months ago Geo_Database_Manager.php 6 months ago Geoposition.php 1 year ago Icon_Directory.php 6 months ago Icon_Directory_Factory.php 2 years ago Illuminate_Builder.php 10 months ago Independent_Analytics.php 4 days ago Interrupt.php 3 months ago Known_Referrers.php 4 days ago MainWP.php 2 months ago Map.php 9 months ago Map_Data.php 1 year ago Migration_Fixer_Job.php 5 months ago Patch.php 1 year ago Payload_Validator.php 9 months ago Plugin_Conflict_Detector.php 4 days ago Plugin_Group.php 6 months ago Plugin_Group_Option.php 2 years ago Query.php 1 year ago Query_Taps.php 4 months ago Quick_Stats.php 3 months ago REST_API.php 4 days ago Report.php 1 year ago Report_Finder.php 6 months ago Report_Options_Parser.php 9 months ago Resource_Identifier.php 2 months ago Settings.php 2 months ago Sort_Configuration.php 9 months ago Tables.php 8 months ago Track_Resource_Changes.php 1 year ago View_Counter.php 6 months ago VisitorSaltRefreshInterval.php 6 months ago WP_Option_Cache_Bust.php 2 years ago
Independent_Analytics.php
657 lines
1 <?php
2
3 namespace IAWP;
4
5 use IAWPSCOPED\Carbon\CarbonImmutable;
6 use IAWPSCOPED\Carbon\CarbonInterval;
7 use IAWP\Admin_Page\Analytics_Page;
8 use IAWP\Admin_Page\Campaign_Builder_Page;
9 use IAWP\Admin_Page\Click_Tracking_Page;
10 use IAWP\Admin_Page\Debug_Page;
11 use IAWP\Admin_Page\Integrations_Pages;
12 use IAWP\Admin_Page\Settings_Page;
13 use IAWP\Admin_Page\Support_Page;
14 use IAWP\Admin_Page\Updates_Page;
15 use IAWP\Admin_Page\Visitor_Page;
16 use IAWP\AJAX\AJAX_Manager;
17 use IAWP\Click_Tracking\Click_Processing_Job;
18 use IAWP\Data_Pruning\Pruner;
19 use IAWP\Ecommerce\EDD_Order;
20 use IAWP\Ecommerce\Fluent_Cart_Order;
21 use IAWP\Ecommerce\PMPro_Order;
22 use IAWP\Ecommerce\SureCart_Event_Sync_Job;
23 use IAWP\Ecommerce\SureCart_Order;
24 use IAWP\Ecommerce\SureCart_Store;
25 use IAWP\Ecommerce\WooCommerce_Order;
26 use IAWP\Email_Reports\Email_Reports;
27 use IAWP\Form_Submissions\Form;
28 use IAWP\Form_Submissions\Submission_Listener;
29 use IAWP\Journey\JourneyStatisticsJob;
30 use IAWP\Migrations\Migrations;
31 use IAWP\Overview\Module_Refresh_Job;
32 use IAWP\Overview\Modules\Module;
33 use IAWP\Utils\Format;
34 use IAWP\Utils\Plugin;
35 use IAWP\Utils\Request;
36 use IAWP\Utils\Singleton;
37 use IAWP\Utils\Timezone;
38 use IAWP\WooCommerceOrderMetaBox\WooCommerceOrderMetaBox;
39 use IAWPSCOPED\Illuminate\Support\Carbon;
40 use IAWPSCOPED\Illuminate\Support\Str;
41 /** @internal */
42 class Independent_Analytics
43 {
44 use Singleton;
45 public $settings;
46 public $email_reports;
47 public $cron_manager;
48 private $is_woocommerce_support_enabled;
49 private $is_surecart_support_enabled;
50 private $is_edd_support_enabled;
51 private $is_pmpro_support_enabled;
52 private $is_fluent_cart_support_enabled;
53 private $is_form_submission_support_enabled;
54 // This is where we attach functions to WP hooks
55 private function __construct()
56 {
57 $this->configure_carbon();
58 $this->settings = new \IAWP\Settings();
59 new \IAWP\REST_API();
60 new \IAWP\Dashboard_Widget();
61 new \IAWP\View_Counter();
62 new Submission_Listener();
63 Pruner::register_hook();
64 AJAX_Manager::getInstance();
65 if (!Migrations::is_migrating()) {
66 new \IAWP\Track_Resource_Changes();
67 \IAWP\Admin_Bar_Stats::register();
68 WooCommerce_Order::register_hooks();
69 EDD_Order::register_hooks();
70 PMPro_Order::register_hooks();
71 SureCart_Order::register_hooks();
72 Fluent_Cart_Order::register_hooks();
73 }
74 \IAWP\Cron_Job::register_custom_intervals();
75 \IAWP\Database_Manager::register_actions();
76 $this->cron_manager = new \IAWP\Cron_Manager();
77 (new SureCart_Event_Sync_Job())->register_handler();
78 (new JourneyStatisticsJob())->register_handler();
79 (new \IAWP\FetchFaviconsJob())->register_handler();
80 (new Click_Processing_Job())->register_handler();
81 (new Module_Refresh_Job())->register_handler();
82 (new \IAWP\Migration_Fixer_Job())->register_handler();
83 (new \IAWP\Geo_Database_Health_Check_Job())->register_handler();
84 if (\IAWPSCOPED\iawp_is_pro()) {
85 $this->email_reports = new Email_Reports();
86 new \IAWP\Campaign_Builder();
87 WooCommerceOrderMetaBox::register();
88 \add_action('iawp_module_refresh_now', function () {
89 Module::refresh_all_modules();
90 });
91 }
92 \add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts_and_styles'], 110);
93 // Called at 110 to dequeue other scripts
94 \add_action('wp_enqueue_scripts', [$this, 'enqueue_scripts_and_styles_front_end']);
95 \add_action('admin_menu', [$this, 'add_admin_menu_pages']);
96 \add_action('admin_init', [$this, 'remove_freemius_pricing_menu']);
97 \add_filter('plugin_action_links_independent-analytics/iawp.php', [$this, 'plugin_action_links']);
98 \add_action('init', [$this, 'polylang_translations']);
99 \add_action('init', [$this, 'load_text_domain']);
100 // Freemius adjustments
101 \IAWP_FS()->add_filter('pricing_url', [$this, 'change_freemius_pricing_url'], 10);
102 \IAWP_FS()->add_filter('show_affiliate_program_notice', '__return_false');
103 \IAWP_FS()->add_filter('show_deactivation_feedback_form', function () {
104 return \false;
105 });
106 \IAWP_FS()->add_filter('plugin_icon', function () {
107 \IAWPSCOPED\iawp_url_to('img/plugin-icon.png');
108 });
109 \IAWP_FS()->add_filter('connect-header', [$this, 'freemius_optin_heading']);
110 \IAWP_FS()->add_filter('connect_message', [$this, 'freemius_optin_text']);
111 \add_action('admin_init', [$this, 'override_freemius_text']);
112 // Other hooks
113 \add_action('admin_init', [$this, 'maybe_delete_mu_plugin']);
114 \add_action('admin_body_class', [$this, 'add_body_class']);
115 \add_filter('sgs_whitelist_wp_content', [$this, 'whitelist_click_endpoint']);
116 \add_filter('cmplz_whitelisted_script_tags', [$this, 'whitelist_script_tag_for_complianz']);
117 \add_filter('plugin_action_links_independent-analytics/iawp.php', [$this, 'add_upgrade_link_in_plugins_menu'], 999);
118 \add_filter('plugin_row_meta', [$this, 'add_docs_link_in_plugins_menu'], 10, 2);
119 \add_action('admin_footer', [$this, 'attach_system_appearance_script'], 99, 0);
120 \add_filter('sgo_javascript_combine_excluded_inline_content', [$this, 'exclude_tracking_script_from_speed_optimizer'], 10, 1);
121 \add_action('admin_init', [$this, 'update_cookie']);
122 }
123 public function override_freemius_text()
124 {
125 if (\function_exists('IAWPSCOPED\\fs_override_i18n')) {
126 fs_override_i18n(['opt-in-connect' => \__('Subscribe & Go To Analytics', 'independent-analytics'), 'skip' => \__('No, thanks', 'independent-analytics')], 'independent-analytics');
127 }
128 }
129 public function add_upgrade_link_in_plugins_menu($links)
130 {
131 if (\IAWPSCOPED\iawp_is_pro()) {
132 return $links;
133 }
134 $upgrade_link = '<a target="_blank" style="color:#36B366;font-weight:700;"
135 href="https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Plugin+Settings+Link"
136 >' . \esc_html__('Upgrade to Pro', 'independent-analytics') . '</a>';
137 \array_unshift($links, $upgrade_link);
138 return $links;
139 }
140 public function add_docs_link_in_plugins_menu($plugin_meta, $plugin_file)
141 {
142 if ($plugin_file == 'independent-analytics/iawp.php' || $plugin_file == 'independent-analytics-pro/iawp.php') {
143 $plugin_meta[] = '<a target="_blank" href="https://independentwp.com/knowledgebase/">' . \esc_html__('Knowledge Base', 'independent-analytics') . '</a>';
144 }
145 return $plugin_meta;
146 }
147 /**
148 * Attach some JavaScript to manage the color scheme for admin pages.
149 *
150 * @return void
151 */
152 public function attach_system_appearance_script() : void
153 {
154 ?>
155 <script>
156 ;(() => {
157 try {
158 const isLightMode = document.body.classList.contains('iawp-light-mode')
159 const isDarkMode = document.body.classList.contains('iawp-dark-mode')
160 const isSystem = !isLightMode && !isDarkMode
161
162 // Stop if they're not using the systems color scheme
163 if(!isSystem) {
164 return
165 }
166
167 // Switch to dark mode if dark is the system color scheme preference
168 if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
169 document.body.classList.add('iawp-dark-mode')
170 }
171
172 // Watching for changes is a nice idea, but it's more complicated than just
173 // adding or removing a class from the body. There are elements like
174 // charts that cannot adapt without a rendered. Holding off on this.
175
176 // window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
177 // if(event.matches) {
178 // document.body.classList.remove('iawp-light-mode')
179 // document.body.classList.add('iawp-dark-mode')
180 // } else {
181 // document.body.classList.remove('iawp-dark-mode')
182 // document.body.classList.add('iawp-light-mode')
183 // }
184 // });
185 } catch (error) {
186
187 }
188 })();
189
190 </script>
191 <?php
192 }
193 public function add_body_class(string $classes) : string
194 {
195 $newClasses = [];
196 if (\IAWP\Appearance::is_light()) {
197 $newClasses[] = 'iawp-light-mode';
198 } elseif (\IAWP\Appearance::is_dark()) {
199 $newClasses[] = 'iawp-dark-mode';
200 }
201 $page = \IAWP\Env::get_page();
202 if (\is_string($page)) {
203 $newClasses[] = $page;
204 }
205 if (\array_key_exists('examiner', $_GET)) {
206 $newClasses[] = 'iawp-in-examiner';
207 }
208 return $classes . ' ' . \implode(' ', $newClasses) . ' ';
209 }
210 /**
211 * At one point in time, there was a must-use plugin that was created. The plugin file and the
212 * option need to get cleaned up.
213 * @return void
214 */
215 public function maybe_delete_mu_plugin()
216 {
217 $already_attempted = \get_option('iawp_attempted_to_delete_mu_plugin', '0');
218 if ($already_attempted === '1') {
219 return;
220 }
221 if (\get_option('iawp_must_use_directory_not_writable', '0') === '1') {
222 \delete_option('iawp_must_use_directory_not_writable');
223 }
224 $mu_plugin_file = \trailingslashit(\WPMU_PLUGIN_DIR) . 'iawp-performance-boost.php';
225 if (\file_exists($mu_plugin_file)) {
226 \unlink($mu_plugin_file);
227 }
228 \update_option('iawp_attempted_to_delete_mu_plugin', '1', \true);
229 }
230 public function load_text_domain()
231 {
232 \load_plugin_textdomain('independent-analytics', \false, \IAWP_LANGUAGES_DIRECTORY);
233 // Freemius overrides must happen after the text domain is loaded
234 \IAWP_FS()->override_i18n(['yee-haw' => \__('Success', 'independent-analytics')]);
235 }
236 public function polylang_translations()
237 {
238 if (\function_exists('IAWPSCOPED\\pll_register_string')) {
239 pll_register_string('view_counter', 'Views:', 'Independent Analytics');
240 }
241 }
242 // Changes the URL for the "Upgrade" tab in the Account menu
243 public function change_freemius_pricing_url()
244 {
245 return 'https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Account';
246 }
247 public function freemius_optin_heading()
248 {
249 return '<h2>' . \esc_html__('Congratulations on Your New Analytics! 🎉', 'independent-analytics') . '</h2>';
250 }
251 public function freemius_optin_text()
252 {
253 $html = '<p>' . \esc_html__("You've just taken the first step towards building a better website.", "independent-analytics") . '</p>';
254 $html .= '<br />';
255 $html .= '<p>' . \esc_html__("If you signup for our free email course, we’ll walk you through each feature in Independent Analytics, so you can learn how to analyze and optimize your website for growth.", "independent-analytics") . '</p>';
256 $html .= '<br />';
257 $html .= '<p><strong>' . \esc_html_x("Subscribe now and you'll receive our:", "What follows is a list of benefits", "independent-analytics") . '</strong></p>';
258 $html .= '<ul>';
259 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Free email tutorial series', 'independent-analytics') . '</li>';
260 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Subscriber-only sales announcements', 'independent-analytics') . '</li>';
261 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('New feature updates', 'independent-analytics') . '</li>';
262 $html .= '<li><span class="dashicons dashicons-yes-alt"></span> ' . \esc_html__('Security alerts', 'independent-analytics') . '</li>';
263 $html .= '</ul>';
264 $html .= '<p>' . \esc_html('Subscribing will also share some basic info about your WordPress site with us, which helps us make Independent Analytics an even better plugin for everyone.', 'independent-analytics') . '</p>';
265 $html .= '<p class="rating">' . \sprintf(\esc_html__('Rated %s and trusted by over 100,000+ WordPress websites.', 'independent-analytics'), '<span class="star-container"><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span></span>') . '</p>';
266 $html .= '<img src="' . \IAWPSCOPED\iawp_url_to('img/email-review.png') . '" />';
267 return $html;
268 }
269 public function add_admin_menu_pages()
270 {
271 $title = \IAWP\Capability_Manager::show_white_labeled_ui() ? \esc_html__('Analytics', 'independent-analytics') : 'Independent Analytics';
272 \add_menu_page($title, \esc_html__('Analytics', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics', function () {
273 $analytics_page = new Analytics_Page();
274 $analytics_page->render();
275 }, $this->get_menu_icon(), 3);
276 if (\IAWP\Capability_Manager::can_edit()) {
277 \add_submenu_page('independent-analytics', \esc_html__('Settings', 'independent-analytics'), \esc_html__('Settings', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-settings', function () {
278 $settings_page = new Settings_Page();
279 $settings_page->render(\false);
280 });
281 }
282 if (\IAWPSCOPED\iawp_is_pro()) {
283 \add_submenu_page('independent-analytics', \esc_html__('Campaign Builder', 'independent-analytics'), \esc_html__('Campaign Builder', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-campaign-builder', function () {
284 $campaign_builder_page = new Campaign_Builder_Page();
285 $campaign_builder_page->render(\false);
286 });
287 if (\IAWP\Capability_Manager::can_edit()) {
288 \add_submenu_page('independent-analytics', \esc_html__('Click Tracking', 'independent-analytics'), \esc_html__('Click Tracking', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-click-tracking', function () {
289 $click_tracking_page = new Click_Tracking_Page();
290 $click_tracking_page->render(\false);
291 });
292 }
293 }
294 if (\IAWP\Capability_Manager::show_branded_ui()) {
295 \add_submenu_page('independent-analytics', \esc_html__('Help & Support', 'independent-analytics'), \esc_html__('Help & Support', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-support-center', function () {
296 $support_page = new Support_Page();
297 $support_page->render(\false);
298 });
299 }
300 if (\IAWP\Capability_Manager::show_branded_ui()) {
301 \add_submenu_page('independent-analytics', \esc_html__('Integrations', 'independent-analytics'), \esc_html__('Integrations', 'independent-analytics'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-integrations', function () {
302 $integrations_page = new Integrations_Pages();
303 $integrations_page->render(\false);
304 });
305 }
306 if (\IAWP\Capability_Manager::show_branded_ui()) {
307 $menu_html = '<span class="menu-name">' . \esc_html__('Updates', 'independent-analytics') . '</span>';
308 $menu_html = $this->show_changelog_menu_label() ? $menu_html . ' <span class="menu-counter">' . \esc_html__('New', 'independent-analytics') . '</span>' : $menu_html;
309 \add_submenu_page('independent-analytics', \esc_html__('Updates', 'independent-analytics'), $menu_html, \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-updates', function () {
310 $updates_page = new Updates_Page();
311 $updates_page->render(\false);
312 });
313 }
314 if (\IAWPSCOPED\iawp_is_free() && \IAWP\Capability_Manager::show_branded_ui()) {
315 \add_submenu_page('independent-analytics', \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics'), '<span style="color: #F69D0A;">' . \esc_html__('Upgrade to Pro &rarr;', 'independent-analytics') . '</span>', \IAWP\Capability_Manager::menu_page_capability_string(), \esc_url('https://independentwp.com/pro/?utm_source=User+Dashboard&utm_medium=WP+Admin&utm_campaign=Upgrade+to+Pro&utm_content=Sidebar'));
316 }
317 if (\IAWP\Capability_Manager::can_edit()) {
318 \add_submenu_page('options.php', \__('Independent Analytics Debug'), \__('Independent Analytics Debug'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-debug', function () {
319 $debug_page = new Debug_Page();
320 $debug_page->render(\false);
321 });
322 }
323 if (\IAWPSCOPED\iawp_is_pro() && \IAWP\Capability_Manager::can_view()) {
324 \add_submenu_page('options.php', \__('Journey'), \__('Journey'), \IAWP\Capability_Manager::menu_page_capability_string(), 'independent-analytics-visitor', function () {
325 $page = new Visitor_Page();
326 $page->render();
327 });
328 }
329 }
330 // The menu link is removed in the SDK setup, but this makes it completely inaccessible
331 public function remove_freemius_pricing_menu()
332 {
333 \remove_submenu_page('independent-analytics', 'independent-analytics-pricing');
334 }
335 public function register_scripts_and_styles() : void
336 {
337 \wp_register_style('iawp-styles', \IAWPSCOPED\iawp_url_to('dist/styles/style.css'), [], \IAWP_VERSION);
338 \wp_register_style('iawp-dashboard-widget-styles', \IAWPSCOPED\iawp_url_to('dist/styles/dashboard_widget.css'), [], \IAWP_VERSION);
339 \wp_register_style('iawp-freemius-notice-styles', \IAWPSCOPED\iawp_url_to('dist/styles/freemius_notice_styles.css'), [], \IAWP_VERSION);
340 \wp_register_style('iawp-posts-menu-styles', \IAWPSCOPED\iawp_url_to('dist/styles/posts_menu.css'), [], \IAWP_VERSION);
341 \wp_register_style('iawp-wc-order-box-styles', \IAWPSCOPED\iawp_url_to('dist/styles/wc_order_box.css'), [], \IAWP_VERSION);
342 \wp_register_script('iawp-javascript', \IAWPSCOPED\iawp_url_to('dist/js/index.js'), ['wp-i18n'], \IAWP_VERSION . 'wefwef');
343 \wp_set_script_translations('iawp-javascript', 'independent-analytics');
344 \wp_register_script('iawp-dashboard-widget-javascript', \IAWPSCOPED\iawp_url_to('dist/js/dashboard_widget.js'), ['wp-i18n'], \IAWP_VERSION);
345 \wp_set_script_translations('iawp-dashboard-widget-javascript', 'independent-analytics');
346 \wp_register_script('iawp-layout-javascript', \IAWPSCOPED\iawp_url_to('dist/js/layout.js'), ['wp-i18n'], \IAWP_VERSION);
347 \wp_set_script_translations('iawp-layout-javascript', 'independent-analytics');
348 \wp_register_script('iawp-settings-javascript', \IAWPSCOPED\iawp_url_to('dist/js/settings.js'), ['wp-color-picker', 'wp-i18n'], \IAWP_VERSION);
349 \wp_set_script_translations('iawp-settings-javascript', 'independent-analytics');
350 \wp_register_script('iawp-click-tracking-menu-javascript', \IAWPSCOPED\iawp_url_to('dist/js/click-tracking-menu.js'), ['wp-i18n'], \IAWP_VERSION);
351 \wp_set_script_translations('iawp-click-tracking-menu-javascript', 'independent-analytics');
352 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
353 \wp_register_style('iawp-admin-bar-stats', \IAWPSCOPED\iawp_url_to('dist/styles/admin_bar_stats.css'), [], \IAWP_VERSION);
354 }
355 if (\is_rtl()) {
356 \wp_register_style('iawp-styles-rtl', \IAWPSCOPED\iawp_url_to('dist/styles/rtl.css'), [], \IAWP_VERSION);
357 }
358 }
359 public function enqueue_scripts_and_styles($hook)
360 {
361 $this->register_scripts_and_styles();
362 $page = \IAWP\Env::get_page();
363 $this->enqueue_translations();
364 $this->enqueue_nonces();
365 \wp_enqueue_style('iawp-freemius-notice-styles');
366 if (\is_string($page)) {
367 \wp_enqueue_style('iawp-styles');
368 \wp_enqueue_script('iawp-javascript');
369 \wp_enqueue_script('iawp-layout-javascript');
370 $this->dequeue_bad_actors();
371 $this->maybe_override_adminify_styles();
372 if (\is_rtl()) {
373 \wp_enqueue_style('iawp-styles-rtl');
374 }
375 }
376 if ($page === 'independent-analytics-settings') {
377 \wp_enqueue_style('wp-color-picker');
378 \wp_enqueue_script('iawp-settings-javascript');
379 } elseif ($page === 'independent-analytics-click-tracking') {
380 \wp_enqueue_script('iawp-click-tracking-menu-javascript');
381 } elseif ($hook === 'index.php') {
382 \wp_enqueue_script('iawp-dashboard-widget-javascript');
383 \wp_enqueue_style('iawp-dashboard-widget-styles');
384 } elseif ($hook === 'edit.php') {
385 \wp_enqueue_style('iawp-posts-menu-styles');
386 } elseif (\IAWPSCOPED\iawp_is_pro() && $this->is_woocommerce_support_enabled() && $hook == 'woocommerce_page_wc-orders') {
387 \wp_enqueue_style('iawp-wc-order-box-styles');
388 }
389 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
390 \wp_enqueue_style('iawp-admin-bar-stats');
391 }
392 }
393 public function enqueue_scripts_and_styles_front_end()
394 {
395 if (\IAWP\Admin_Bar_Stats::is_feature_enabled()) {
396 \wp_register_style('iawp-admin-bar-stats', \IAWPSCOPED\iawp_url_to('dist/styles/admin_bar_stats.css'), [], \IAWP_VERSION);
397 \wp_enqueue_style('iawp-admin-bar-stats');
398 }
399 }
400 public function enqueue_translations()
401 {
402 \wp_register_script('iawp-translations', '');
403 \wp_enqueue_script('iawp-translations');
404 \wp_add_inline_script('iawp-translations', 'const iawpText = ' . \json_encode(['views' => \__('Views', 'independent-analytics'), 'visitors' => \__('Visitors', 'independent-analytics'), 'sessions' => \__('Sessions', 'independent-analytics'), 'orders' => \__('Orders', 'independent-analytics'), 'clicks' => \__('Clicks', 'independent-analytics'), 'formSubmissions' => \__('Form Submissions', 'independent-analytics'), 'exactDates' => \__('Apply Exact Dates', 'independent-analytics'), 'relativeDates' => \__('Apply Relative Dates', 'independent-analytics'), 'copied' => \__('Copied', 'independent-analytics'), 'exportingPages' => \__('Exporting Pages...', 'independent-analytics'), 'exportPages' => \__('Export Pages', 'independent-analytics'), 'exportingReferrers' => \__('Exporting Referrers...', 'independent-analytics'), 'exportReferrers' => \__('Export Referrers', 'independent-analytics'), 'exportingGeolocations' => \__('Exporting Geolocations...', 'independent-analytics'), 'exportGeolocations' => \__('Export Geolocations', 'independent-analytics'), 'exportingDevices' => \__('Exporting Devices...', 'independent-analytics'), 'exportDevices' => \__('Export Devices', 'independent-analytics'), 'exportingCampaigns' => \__('Exporting Campaigns...', 'independent-analytics'), 'exportCampaigns' => \__('Export Campaigns', 'independent-analytics'), 'exportingClicks' => \__('Exporting Clicks', 'independent-analytics'), 'exportClicks' => \__('Export Clicks', 'independent-analytics'), 'invalidReportArchive' => \__('This report archive is invalid. Please export your reports and try again.', 'independent-analytics'), 'openMobileMenu' => \__('Open menu', 'independent-analytics'), 'closeMobileMenu' => \__('Close menu', 'independent-analytics'), 'noComparison' => \__('No Comparison', 'independent-analytics')]), 'before');
405 }
406 public function enqueue_nonces()
407 {
408 \wp_register_script('iawp-nonces', '');
409 \wp_enqueue_script('iawp-nonces');
410 \wp_add_inline_script('iawp-nonces', 'const iawpActions = ' . \json_encode(AJAX_Manager::getInstance()->get_action_signatures()), 'before');
411 }
412 public function get_option($name, $default)
413 {
414 $option = \get_option($name, $default);
415 return $option === '' ? $default : $option;
416 }
417 public function date_i18n(string $format, \DateTime $date) : string
418 {
419 return \date_i18n($format, $date->setTimezone(Timezone::site_timezone())->getTimestamp() + Timezone::site_offset_in_seconds($date));
420 }
421 public function plugin_action_links($links)
422 {
423 // Create the link
424 $settings_link = '<a class="calendar-link" href="' . \esc_url(\IAWPSCOPED\iawp_dashboard_url()) . '">' . \esc_html__('Analytics Dashboard', 'independent-analytics') . '</a>';
425 // Add the link to the start of the array
426 \array_unshift($links, $settings_link);
427 return $links;
428 }
429 public function pagination_page_size()
430 {
431 return 50;
432 }
433 public function dequeue_bad_actors()
434 {
435 // https://wordpress.org/plugins/comment-link-remove/
436 \wp_dequeue_style('qc_clr_admin_style_css');
437 // https://wordpress.org/plugins/webappick-pdf-invoice-for-woocommerce/
438 \wp_dequeue_style('woo-invoice');
439 // https://wordpress.org/plugins/wp-media-files-name-rename/
440 \wp_dequeue_style('wpcmp_bootstrap_css');
441 // https://wordpress.org/plugins/morepuzzles/
442 \wp_dequeue_style('bscss');
443 \wp_dequeue_style('mypluginstyle');
444 }
445 public function maybe_override_adminify_styles()
446 {
447 if (\is_plugin_active('adminify/adminify.php')) {
448 $settings = \get_option('_wpadminify');
449 if ($settings) {
450 if (\array_key_exists('admin_ui', $settings)) {
451 if ($settings['admin_ui']) {
452 \wp_register_style('iawp-adminify-styles', \IAWPSCOPED\iawp_url_to('dist/styles/adminify.css'), [], \IAWP_VERSION);
453 \wp_enqueue_style('iawp-adminify-styles');
454 }
455 }
456 }
457 }
458 }
459 public function update_cookie()
460 {
461 $should_have_cookie = Request::is_blocked_user_role() && $this->get_option('iawp_ignore_via_cookie', \false);
462 $has_cookie = isset($_COOKIE['iawp_ignore_visitor']);
463 if ($should_have_cookie && !$has_cookie) {
464 \setcookie('iawp_ignore_visitor', '1', \time() + 365 * 24 * 60 * 60, \COOKIEPATH, \COOKIE_DOMAIN);
465 }
466 if (!$should_have_cookie && $has_cookie) {
467 // Delete cookie by using a non-zero time in the past
468 \setcookie('iawp_ignore_visitor', '1', \time() - 60, \COOKIEPATH, \COOKIE_DOMAIN);
469 }
470 }
471 // Note: We don't use version_compare because we only want to notify of major version updates
472 // Ex. Show notice for 2.14.5 => 2.15.0, but not for 2.15.0 => 2.15.1
473 public function show_changelog_menu_label() : bool
474 {
475 if (\floatval(\IAWP_VERSION) > \floatval($this->get_option('iawp_last_update_viewed', '0'))) {
476 return \true;
477 }
478 return \false;
479 }
480 public function is_form_submission_support_enabled() : bool
481 {
482 if (!\is_bool($this->is_form_submission_support_enabled)) {
483 $this->is_form_submission_support_enabled = \IAWPSCOPED\iawp_is_pro() && Form::has_active_form_plugin();
484 }
485 return $this->is_form_submission_support_enabled;
486 }
487 public function is_woocommerce_support_enabled() : bool
488 {
489 if (!\is_bool($this->is_woocommerce_support_enabled)) {
490 $this->is_woocommerce_support_enabled = $this->actually_check_if_woocommerce_support_is_enabled();
491 }
492 return $this->is_woocommerce_support_enabled;
493 }
494 public function is_surecart_support_enabled() : bool
495 {
496 if (!\is_bool($this->is_surecart_support_enabled)) {
497 $this->is_surecart_support_enabled = $this->actually_check_if_surecart_support_is_enabled();
498 }
499 return $this->is_surecart_support_enabled;
500 }
501 public function is_edd_support_enabled() : bool
502 {
503 if (!\is_bool($this->is_edd_support_enabled)) {
504 $this->is_edd_support_enabled = $this->actually_check_if_edd_support_is_enabled();
505 }
506 return $this->is_edd_support_enabled;
507 }
508 public function is_pmpro_support_enabled() : bool
509 {
510 if (!\is_bool($this->is_pmpro_support_enabled)) {
511 $this->is_pmpro_support_enabled = $this->actually_check_if_pmpro_support_is_enabled();
512 }
513 return $this->is_pmpro_support_enabled;
514 }
515 public function is_fluent_cart_support_enabled() : bool
516 {
517 if (!\is_bool($this->is_fluent_cart_support_enabled)) {
518 $this->is_fluent_cart_support_enabled = $this->actually_check_if_fluent_cart_support_is_enabled();
519 }
520 return $this->is_fluent_cart_support_enabled;
521 }
522 public function is_ecommerce_support_enabled() : bool
523 {
524 return $this->is_woocommerce_support_enabled() || $this->is_surecart_support_enabled() || $this->is_edd_support_enabled() || $this->is_pmpro_support_enabled() || $this->is_fluent_cart_support_enabled();
525 }
526 public function get_currency_code() : ?string
527 {
528 if ($this->is_woocommerce_support_enabled()) {
529 return get_woocommerce_currency();
530 }
531 if ($this->is_surecart_support_enabled()) {
532 return SureCart_Store::get_currency_code();
533 }
534 if ($this->is_edd_support_enabled()) {
535 return \edd_get_currency();
536 }
537 if ($this->is_pmpro_support_enabled()) {
538 global $pmpro_default_currency;
539 return $pmpro_default_currency;
540 }
541 if ($this->is_fluent_cart_support_enabled()) {
542 $settings = new \FluentCart\Api\StoreSettings();
543 return $settings->getCurrency();
544 }
545 return null;
546 }
547 // This is for compatibility with the "Lock and Protect System Folders" setting in the Security Optimizer plugin
548 public function whitelist_click_endpoint($whitelist)
549 {
550 if (\IAWPSCOPED\iawp_is_free()) {
551 return $whitelist;
552 }
553 $whitelist[] = 'iawp-click-endpoint.php';
554 return $whitelist;
555 }
556 public function exclude_tracking_script_from_speed_optimizer($exclude_list)
557 {
558 $exclude_list[] = '// Do not change this comment line otherwise Speed Optimizer won\'t be able to detect this script';
559 return $exclude_list;
560 }
561 // This whitelists our plugin with the "Complianz" plugin
562 public function whitelist_script_tag_for_complianz($scripts)
563 {
564 $scripts[] = '/wp-json/iawp/search';
565 return $scripts;
566 }
567 public function prefers_24_hour_clock() : bool
568 {
569 $time_format = Format::time();
570 if (Str::contains($time_format, 'a') || Str::contains($time_format, 'A')) {
571 return \false;
572 }
573 return \true;
574 }
575 private function actually_check_if_woocommerce_support_is_enabled() : bool
576 {
577 global $wpdb;
578 if (\IAWPSCOPED\iawp_is_free()) {
579 return \false;
580 }
581 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
582 return \false;
583 }
584 if (!\is_plugin_active('woocommerce/woocommerce.php')) {
585 return \false;
586 }
587 $table_name = $wpdb->prefix . 'wc_order_stats';
588 $order_stats_table = $wpdb->get_row($wpdb->prepare('
589 SELECT * FROM INFORMATION_SCHEMA.TABLES
590 WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
591 ', $wpdb->dbname, $table_name));
592 if (\is_null($order_stats_table)) {
593 return \false;
594 }
595 return \true;
596 }
597 private function actually_check_if_surecart_support_is_enabled() : bool
598 {
599 if (\IAWPSCOPED\iawp_is_free()) {
600 return \false;
601 }
602 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
603 return \false;
604 }
605 return \is_plugin_active('surecart/surecart.php');
606 }
607 private function actually_check_if_edd_support_is_enabled() : bool
608 {
609 if (\IAWPSCOPED\iawp_is_free()) {
610 return \false;
611 }
612 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
613 return \false;
614 }
615 return \is_plugin_active('easy-digital-downloads/easy-digital-downloads.php') || \is_plugin_active('easy-digital-downloads-pro/easy-digital-downloads.php');
616 }
617 private function actually_check_if_pmpro_support_is_enabled() : bool
618 {
619 if (\IAWPSCOPED\iawp_is_free()) {
620 return \false;
621 }
622 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
623 return \false;
624 }
625 return \is_plugin_active('paid-memberships-pro-dev/paid-memberships-pro.php') || \is_plugin_active('paid-memberships-pro/paid-memberships-pro.php');
626 }
627 private function actually_check_if_fluent_cart_support_is_enabled() : bool
628 {
629 if (\IAWPSCOPED\iawp_is_free()) {
630 return \false;
631 }
632 if (\IAWP\Capability_Manager::can_only_view_authored_analytics()) {
633 return \false;
634 }
635 return \is_plugin_active('fluent-cart/fluent-cart.php');
636 }
637 private function get_menu_icon()
638 {
639 if (\is_null(\IAWP\Env::get_page())) {
640 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEyNiwgLTIyOCkiIGZpbGw9IiNBN0FBQUQiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgyLCA1NSkiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
641 } else {
642 return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNTEzcHgiIGhlaWdodD0iMjU0cHgiIHZpZXdCb3g9IjAgMCA1MTMgMjU0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPkljb248L3RpdGxlPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9Ik1lbnUtSWNvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc3NSwgLTIyOSkiIGZpbGw9IiNGRkZGRkYiPgogICAgICAgICAgICA8ZyBpZD0iV2hpdGUtQ29weSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzMxLCA1NikiPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ0LjUsIDE3MykiPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi44MDU3LCAxMDguNjEyNSkgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTQwMi44MDU3LCAtMTA4LjYxMjUpIiBwb2ludHM9IjM5MS4xNjkzNTYgNTYuMjQ4ODI1OSA0MTQuNDQyMDgzIDU2LjI0ODgyNTkgNDE0LjQ0MjA4MyAxNjAuOTc2MDk5IDM5MS4xNjkzNTYgMTYwLjk3NjA5OSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NiwgMTI1LjY3MjcpIHJvdGF0ZSgtNjApIHRyYW5zbGF0ZSgtMjU2LCAtMTI1LjY3MjcpIiBwb2ludHM9IjI0NC4zNjM2MzYgNzMuMzA5MDkwOSAyNjcuNjM2MzY0IDczLjMwOTA5MDkgMjY3LjYzNjM2NCAxNzguMDM2MzY0IDI0NC4zNjM2MzYgMTc4LjAzNjM2NCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJOZWNrLTEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwOS41Njk0LCAxNDQuNjg1Mikgcm90YXRlKDQ1KSB0cmFuc2xhdGUoLTEwOS41Njk0LCAtMTQ0LjY4NTIpIiBwb2ludHM9Ijk3LjkzMjk5MjMgOTIuMzIxNTUzMiAxMjEuMjA1NzIgOTIuMzIxNTUzMiAxMjEuMjA1NzIgMTk3LjA0ODgyNiA5Ny45MzI5OTIzIDE5Ny4wNDg4MjYiPjwvcG9seWdvbj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC00IiBjeD0iNDY4Ljk0NTQ1NSIgY3k9IjQzLjA1NDU0NTUiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9IlBvaW50LTMiIGN4PSIzMzYuMjkwOTA5IiBjeT0iMTczLjM4MTgxOCIgcj0iNDMuMDU0NTQ1NSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iUG9pbnQtMiIgY3g9IjE3NS43MDkwOTEiIGN5PSI3OS4xMjcyNzI3IiByPSI0My4wNTQ1NDU1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJQb2ludC0xIiBjeD0iNDMuMDU0NTQ1NSIgY3k9IjIxMC42MTgxODIiIHI9IjQzLjA1NDU0NTUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=';
643 }
644 }
645 private function configure_carbon()
646 {
647 $locale = \get_locale();
648 // Carbon will throw an error if de_DE_Formal is used
649 if ('de_de_formal' === \strtolower($locale)) {
650 $locale = 'de_DE';
651 }
652 Carbon::setLocale($locale);
653 CarbonImmutable::setLocale($locale);
654 CarbonInterval::setLocale($locale);
655 }
656 }
657