<?php namespace DgoraWcas\Analytics; use DgoraWcas\Helpers; use DgoraWcas\Multilingual; // Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } class Widget { /** * @var Analytics */ private $analytics; /** * @var UserInterface */ private $ui; /** * Constructor * * @param Analytics $analytics * @param UserInterface $ui */ public function __construct( Analytics $analytics, UserInterface $ui ) { $this->analytics = $analytics; $this->ui = $ui; } public function init() { if ( $this->analytics->isModuleEnabled() && $this->isCriticalSearchesWidgetEnabled() ) { if ( current_user_can( Helpers::shopManagerHasAccess() ? 'manage_woocommerce' : 'manage_options' ) ) { add_action( 'wp_dashboard_setup', array( $this, 'addWidget' ) ); if ( Multilingual::isMultilingual() ) { add_action( 'admin_init', array( $this, 'enqueueTabsScript' ), 5 ); } } } } /** * Check if the Analytics widget is enabled * * @return bool */ public function isCriticalSearchesWidgetEnabled() { return DGWT_WCAS()->settings->getOption( 'analytics_critical_searches_widget_enabled', 'off' ) === 'on'; } public function addWidget() { wp_add_dashboard_widget( 'fibosearch_analytics_critical_searches', esc_html__( 'FiboSearch - Search Analytics', 'ajax-search-for-woocommerce' ), array( $this, 'render' ) ); } public function render() { $data = new Data(); $vars = array( 'days' => $this->ui->getExpirationInDays(), 'critical-searches' => array(), 'critical-searches-total' => 0, 'settings-analytics-url' => admin_url( 'admin.php?page=dgwt_wcas_settings#analytics' ), 'multilingual' => array(), ); if ( Multilingual::isMultilingual() ) { $vars['multilingual'] = array( 'current-lang' => Multilingual::getCurrentLanguage(), 'langs' => array() ); foreach ( Multilingual::getLanguages() as $lang ) { $data->setLang( $lang ); $vars['multilingual']['langs'][ $lang ] = array( 'name' => Multilingual::getLanguageField( $lang, 'name' ), 'critical-searches' => $data->getCriticalSearches( UserInterface::CRITICAL_SEARCHES_LOAD_LIMIT ), 'critical-searches-total' => $data->getTotalCriticalSearches(), ); } } else { $vars['critical-searches'] = $data->getCriticalSearches( UserInterface::CRITICAL_SEARCHES_LOAD_LIMIT ); $vars['critical-searches-total'] = $data->getTotalCriticalSearches(); } ob_start(); ?> <h3><strong><?php _e( 'Critical searches without result', 'ajax-search-for-woocommerce' ); ?></strong></h3> <?php if ( ! empty( $vars['multilingual'] ) ) { ?> <p> <?php _e( 'Language', 'ajax-search-for-woocommerce' ); ?>: <span class="dgwt-wcas-widget-tab-wrapper"> <?php $next = false; foreach ( $vars['multilingual']['langs'] as $lang => $langData ) { if ( $next ) { echo ' | '; } printf( '<a class="dgwt-wcas-widget-tab" title="%s" href="%s">%s</a>', esc_attr( $langData['name'] ), esc_attr( '#dgwt-wcas-widget-tab-content-' . $lang ), esc_html( $langData['name'] ) ); $next = true; } ?> </span> </p> <?php foreach ( $vars['multilingual']['langs'] as $lang => $langName ) { ?> <div class="dgwt-wcas-widget-tab-content" id="dgwt-wcas-widget-tab-content-<?php echo esc_attr( $lang ); ?>"> <?php $this->renderTable( array_merge( $vars, $vars['multilingual']['langs'][ $lang ] ) ); ?> </div> <?php } } else { $this->renderTable( $vars ); } ?> <p> <?php printf( __( "Go to FiboSearch Settings page → %s to see more.", 'ajax-search-for-woocommerce' ), sprintf( '<a title="%2$s" href="%1$s">%2$s</a>', $vars['settings-analytics-url'], esc_attr__( 'Analytics tab', 'ajax-search-for-woocommerce' ) ) ); ?> </p> <?php echo ob_get_clean(); } private function renderTable( $vars ) { if ( ! empty( $vars['critical-searches'] ) ) { ?> <p> <?php printf( _n( 'The FiboSearch analyzer found <b>1 critical search phrase</b>.', 'The FiboSearch analyzer found <b>%d critical search phrases</b>.', $vars['critical-searches-total'], 'ajax-search-for-woocommerce' ), $vars['critical-searches-total'] ); echo ' '; printf( _n( 'These phrases have been typed by users over the last 1 day.', 'These phrases have been typed by users over the last %d days.', $vars['days'], 'ajax-search-for-woocommerce' ), $vars['days'] ); echo ' '; _e( "These phrases don`t return any search results. It's time to fix it.", 'ajax-search-for-woocommerce' ); ?> </p> <table class="widefat fixed"> <thead> <tr> <th>#</th> <th><?php _e( 'Phrase', 'ajax-search-for-woocommerce' ); ?></th> <th><?php _e( 'Repetitions', 'ajax-search-for-woocommerce' ); ?></th> </tr> </thead> <tbody> <?php $i = 1; foreach ( $vars['critical-searches'] as $row ) { ?> <tr> <td><?php echo $i; ?></td> <td><?php echo esc_html( $row['phrase'] ); ?></td> <td><?php echo esc_html( $row['qty'] ); ?></td> </tr> <?php $i ++; } ?> </tbody> </table> <?php } else { ?> <p> <?php printf( __( "Fantastic! The FiboSearch analyzer hasn't found any critical search phrases for the last %d days.", 'ajax-search-for-woocommerce' ), $vars['days'] ); ?> </p> <?php } } public function enqueueTabsScript() { wp_enqueue_style( 'jquery' ); ob_start(); ?> <script> (function ($) { $(document).ready(function () { const tabs = $('.dgwt-wcas-widget-tab'); tabs.on('click', function (event) { event.preventDefault(); $('.dgwt-wcas-widget-tab.dgwt-wcas-widget-tab-active').removeClass('dgwt-wcas-widget-tab-active'); $(this).addClass('dgwt-wcas-widget-tab-active'); $('.dgwt-wcas-widget-tab-content').hide(); $($(this).attr('href')).show(); }); if (tabs.length > 0) { $(tabs[0]).trigger('click'); } }); }(jQuery) ); </script> <?php $script = str_replace( array( '<script>', '</script>' ), array( '', '' ), ob_get_clean() ); wp_add_inline_script( 'jquery', $script ); } }