TabsView::class ]; public function __construct() { parent::__construct(); $this->setFilters(); } protected function init() { $this->disableScreenOption(); $this->incompleteSourceChannelsNotice(); $this->processSourceChannelBackgroundAction(); } protected function setFilters() { $searchChannelsData = $this->getSearchChannels(); $socialChannelsData = $this->getSocialChannels(); $sourceChannelsData = $this->getSourceChannels(); $referrer = Request::get('referrer', ''); $referrerPlaceholder = ! empty($referrer) ? $referrer : esc_html__('All', 'wp-statistics'); $this->filters = FilterGenerator::create() ->hidden('pageName', [ 'name' => 'page', 'attributes' => [ 'value' => Menus::get_page_slug('referrals') ] ]) ->select('referrers', [ 'name' => 'referrer', 'placeholder' => $referrerPlaceholder, 'classes' => 'wps-width-100 wps-select2', 'attributes' => [ 'data-type' => 'referrers', 'data-source' => 'getReferrer', 'data-searchable' => true, 'data-default' => $referrer, ], ]) ->dropdown('search_channel', [ 'name' => 'source_channel', 'label' => esc_html__('Source Category', 'wp-statistics'), 'panel' => true, 'searchable' => true, 'attributes' => [ 'data-type' => 'search-channels', ], 'predefined' => $searchChannelsData ]) ->dropdown('social_channel', [ 'name' => 'source_channel', 'label' => esc_html__('Source Category', 'wp-statistics'), 'panel' => true, 'searchable' => true, 'attributes' => [ 'data-type' => 'social-channels', ], 'predefined' => $socialChannelsData ]) ->dropdown('source_channel', [ 'label' => esc_html__('Source Category', 'wp-statistics'), 'panel' => true, 'searchable' => true, 'attributes' => [ 'data-type' => 'source-channels', ], 'predefined' => $sourceChannelsData ]) ->button('resetButton', [ 'name' => 'reset', 'type' => 'button', 'classes' => 'wps-reset-filter wps-modal-reset-filter', 'label' => esc_html__('Reset', 'wp-statistics'), ]) ->button('submitButton', [ 'name' => 'filter', 'type' => 'button', 'classes' => 'button-primary', 'label' => esc_html__('Filter', 'wp-statistics'), 'attributes' => [ 'type' => 'submit', ], ]) ->get(); return $this->filters; } /** * Retrieves filtered search channels and generates corresponding data. * * @return array */ private function getSearchChannels() { $channels = Helper::filterArrayByKeys(SourceChannels::getList(), ['search', 'paid_search']); $baseUrl = htmlspecialchars_decode(esc_url(remove_query_arg(['source_channel', 'pid']))); foreach ($channels as $key => $channel) { $args[] = [ 'slug' => esc_attr($key), 'name' => esc_html($channel), 'url' => add_query_arg(['source_channel' => $key]), ]; } return [ 'args' => $args, 'baseUrl' => $baseUrl, 'selectedOption' => Request::get('source_channel'), ]; } /** * Retrieves filtered social channels and generates corresponding data. * * @return array */ private function getSocialChannels() { $channels = Helper::filterArrayByKeys(SourceChannels::getList(), ['social', 'paid_social']); $baseUrl = htmlspecialchars_decode(esc_url(remove_query_arg(['source_channel', 'pid']))); foreach ($channels as $key => $channel) { $args[] = [ 'slug' => esc_attr($key), 'name' => esc_html($channel), 'url' => add_query_arg(['source_channel' => $key]), ]; } return [ 'args' => $args, 'baseUrl' => $baseUrl, 'selectedOption' => Request::get('source_channel'), ]; } /** * Retrieves filtered source channels and generates corresponding data. * * @return array */ private function getSourceChannels() { $channels = SourceChannels::getList(); unset($channels['direct']); $baseUrl = htmlspecialchars_decode(esc_url(remove_query_arg(['source_channel', 'pid']))); foreach ($channels as $key => $channel) { $args[] = [ 'slug' => esc_attr($key), 'name' => esc_html($channel), 'url' => add_query_arg(['source_channel' => $key]), ]; } return [ 'args' => $args, 'baseUrl' => $baseUrl, 'selectedOption' => Request::get('source_channel') ]; } /** * Check for visitors with incomplete source channel data * * @return void */ private function incompleteSourceChannelsNotice() { /** @var SourceChannelUpdater $backgroundProcess */ $backgroundProcess = WP_Statistics()->getBackgroundProcess('update_visitors_source_channel'); // Show migration notice if the process is not already initiated if (!$backgroundProcess->is_initiated()) { $actionUrl = add_query_arg( [ 'action' => 'update_visitor_source_channel', 'nonce' => wp_create_nonce('update_visitor_source_channel_nonce') ], Menus::admin_url('referrals') ); $message = sprintf( __('We’ve updated the referral structure in this version. To ensure accurate reports, please initiate the background data process by clicking here.', 'wp-statistics'), esc_url($actionUrl) ); Notice::addNotice($message, 'update_visitors_source_channel_notice', 'info', false); } // Show notice if already running if ($backgroundProcess->is_active()) { $message = __('The referrals process is running in the background and may take a while depending on your data size.
Note: The accuracy of the results may be affected as we only retain whitelisted query parameters.', 'wp-statistics'); Notice::addNotice($message, 'running_visitors_source_channel_notice', 'info', true); } } private function processSourceChannelBackgroundAction() { // Check the action and nonce if (!Request::compare('action', 'update_visitor_source_channel')) { return; } check_admin_referer('update_visitor_source_channel_nonce', 'nonce'); // Check if already processed if (Option::getOptionGroup('jobs', 'update_source_channel_process_running')) { wp_redirect(Menus::admin_url('referrals')); exit; } BackgroundProcessFactory::batchUpdateSourceChannelForVisitors(); wp_redirect(Menus::admin_url('referrals')); exit; } }