['id' => true, 'class' => true, 'style' => true], 'pre' => ['id' => true, 'style' => true, 'class' => true], 'div' => [ 'id' => true, 'class' => true, 'style' => true, 'aria-label' => true, 'role' => true, 'tabindex' => true, 'data-template-id' => true, 'data-css-url' => true, 'data-no-translation' => true, 'data-time-locale' => true, 'data-layout-id' => true, 'data-layout-category' => true, 'data-set-id' => true, 'data-pid' => true, 'data-language' => true, 'data-close-locale' => true, 'data-review-target-width' => true, 'data-css-version' => true, 'data-review-text' => true, 'data-reply-by-locale' => true, 'data-pager-autoplay-timeout' => true, 'data-empty' => true, 'data-time' => true, 'data-id' => true, 'data-container' => true, 'data-collapse-text' => true, 'data-open-text' => true, 'data-is-valid' => true, 'data-domain' => true, 'data-auto-dark-mode' => true, 'data-rotate-to' => true, 'data-slider-loop' => true, 'data-size' => true, 'data-load-more-rows' => true, 'data-column-vertical-separate' => true, 'data-hide-count' => true, 'data-fomo-day' => true, 'data-style' => true, 'data-src' => true, 'data-type' => true, 'data-plugin-version' => true, 'data-only-rating-locale' => true, ], 'a' => [ 'class' => true, 'style' => true, 'href' => true, 'role' => true, 'target' => true, 'rel' => true, 'aria-label' => true, 'data-subcontent' => true, 'data-subcontent-target' => true, ], 'img' => ['class' => true, 'style' => true, 'src' => true, 'srcset' => true, 'alt' => true, 'width' => true, 'height' => true, 'loading' => true], 'trustindex-image' => ['data-imgurl' => true, 'class' => true, 'style' => true, 'src' => true, 'srcset' => true, 'alt' => true, 'width' => true, 'height' => true, 'loading' => true], 'span' => [ 'class' => true, 'style' => true, 'data-id' => true, 'data-empty' => true, 'data-time' => true, 'data-container' => true, 'data-collapse-text' => true, 'data-open-text' => true, ], 'p' => ['class' => true, 'style' => true], 'font' => ['class' => true, 'style' => true], 'strong' => ['class' => true, 'style' => true], 'br' => [], 'i' => ['class' => true, 'style' => true], 'style' => ['type' => true], 'script' => ['type' => true, 'src' => true], ]; public function __construct($shortname, $pluginFilePath, $version, $pluginName, $platformName) { $this->shortname = $shortname; $this->plugin_file_path = $pluginFilePath; $this->version = $version; $this->plugin_name = $pluginName; $this->platform_name = $platformName; } public function getPluginTabs() { $tabs = []; $tabs[] = [ 'place' => 'left', 'slug' => 'free-widget-configurator', 'name' => __('Free Widget Configurator', 'wp-reviews-plugin-for-google') ]; if ($this->is_noreg_linked()) { $tabs[] = [ 'place' => 'left', 'slug' => 'my-reviews', 'name' => __('My reviews', 'wp-reviews-plugin-for-google') ]; } $tabs[] = [ 'place' => 'left', 'slug' => 'get-reviews', 'name' => __('Get Reviews', 'wp-reviews-plugin-for-google') ]; $tabs[] = [ 'place' => 'left', 'slug' => 'rate-us', 'name' => __('Rate Us', 'wp-reviews-plugin-for-google') ]; if (!$this->is_trustindex_connected()) { $tabs[] = [ 'place' => 'left', 'slug' => 'get-more-features', 'name' => __('Get more Features', 'wp-reviews-plugin-for-google') ]; } $tabs[] = [ 'place' => 'right', 'slug' => 'instagram-feed-widget', 'name' => 'Instagram Feed Widget', ]; $tabs[] = [ 'place' => 'right', 'slug' => 'advanced', 'name' => __('Advanced', 'wp-reviews-plugin-for-google') ]; return $tabs; } public function getShortName() { return $this->shortname; } public function getWebhookAction() { return 'trustindex_reviews_hook_' . $this->getShortName(); } public function getWebhookUrl() { return admin_url('admin-ajax.php') . '?action='. $this->getWebhookAction(); } public function getProFeatureButton($campaignId) { return ''. __('Create a Free Account for More Features', 'wp-reviews-plugin-for-google') .''; } public function is_review_download_in_progress() { return get_option($this->get_option_name('review-download-inprogress'), 0); } public function is_review_manual_download() { return get_option($this->get_option_name('review-manual-download'), 0); } public function delete_async_request() { $requestId = get_option($this->get_option_name('review-download-request-id')); if (!$requestId) { return false; } wp_remote_post('https://admin.trustindex.io/source/wordpressPageRequest', [ 'body' => [ 'is_delete' => 1, 'id' => $requestId ], 'timeout' => 300, 'redirection' => '5', 'blocking' => true ]); return true; } public function save_details($tmp) { $name = isset($tmp['name']) ? sanitize_text_field(wp_unslash($tmp['name'])) : ""; $name = json_encode($name); $details = [ 'id' => isset($tmp['page_id']) ? $tmp['page_id'] : $tmp['id'], 'name' => $name, 'address' => isset($tmp['address']) ? sanitize_text_field(wp_unslash($tmp['address'])) : "", 'avatar_url' => isset($tmp['avatar_url']) ? sanitize_text_field(wp_unslash($tmp['avatar_url'])) : "", 'rating_number' => isset($tmp['reviews']['count']) ? (int)$tmp['reviews']['count'] : 0, 'rating_score' => isset($tmp['reviews']['score']) ? (float)$tmp['reviews']['score'] : 0, ]; if (isset($tmp['access_token'])) { $details['access_token'] = sanitize_text_field(wp_unslash($tmp['access_token'])); } update_option($this->get_option_name('page-details'), $details, false); } public function save_reviews($tmp) { global $wpdb; $tableName = $this->get_tablename('reviews'); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $oldReviews = $wpdb->get_results($wpdb->prepare('SELECT reviewId, hidden, highlight FROM %i ORDER BY date DESC', $tableName), ARRAY_A); $oldReviews = array_combine(array_column($oldReviews, 'reviewId'), $oldReviews); $wpdb->query($wpdb->prepare('TRUNCATE %i', $tableName)); if ($wpdb->last_error) { throw new Exception('DB truncate failed: '. esc_html($wpdb->last_error)); } foreach ($tmp as $i => $review) { foreach ($review as $key => $value) { if (is_array($value)) { if ($key === 'reviewer') { $review[ $key ] = array_map(function($v) { return $v ? sanitize_text_field(wp_unslash($v)) : $v; }, $value); } else { unset($review[ $key ]); } } else if ($key === 'text') { $review[ $key ] = $value ? wp_kses_post(wp_unslash($value)) : $value; } else { $review[ $key ] = $value ? sanitize_text_field(wp_unslash($value)) : $value; } } $hidden = 0; $highlight = null; if (isset($review['id']) && isset($oldReviews[$review['id']])) { $hidden = $oldReviews[$review['id']]['hidden']; $highlight = $oldReviews[$review['id']]['highlight']; } // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->insert($tableName, [ 'user' => $review['reviewer']['name'], 'user_photo' => $review['reviewer']['avatar_url'], 'text' => $review['text'], 'rating' => $review['rating'] ? $review['rating'] : 5, 'date' => substr($review['created_at'], 0, 10), 'reviewId' => isset($review['id']) ? $review['id'] : null, 'reply' => isset($review['reply']) ? $review['reply'] : "", 'hidden' => $hidden, 'highlight' => $highlight ? $highlight : null, ]); if ($wpdb->last_error) { throw new Exception('DB insert failed: '. esc_html($wpdb->last_error)); } } update_option($this->get_option_name('review-download-modal'), 0, false); } public function get_plugin_dir() { return plugin_dir_path($this->plugin_file_path); } public function get_plugin_file_url($file, $addVersioning = true) { $url = plugins_url($file, $this->plugin_file_path); if ($addVersioning) { $appendMark = strpos($url, '?') === FALSE ? '?' : '&'; $url .= $appendMark . 'ver=' . $this->getVersion(); } return $url; } public function get_plugin_slug() { return basename($this->get_plugin_dir()); } public function uninstall() { $this->delete_async_request(); include $this->get_plugin_dir() . 'include' . DIRECTORY_SEPARATOR . 'uninstall.php'; if (is_file($this->getCssFile())) { wp_delete_file($this->getCssFile()); } } public function activate() { include $this->get_plugin_dir() . 'include' . DIRECTORY_SEPARATOR . 'activate.php'; $this->setNotificationParam('not-using-no-connection', 'timestamp', time() + 86400); if (!$this->getNotificationParam('rate-us', 'hidden', false) && $this->getNotificationParam('rate-us', 'active', true)) { $this->setNotificationParam('rate-us', 'active', true); $this->setNotificationParam('rate-us', 'timestamp', time() + 86400); } update_option($this->get_option_name('activation-redirect'), 1, false); } public function deactivate() { update_option($this->get_option_name('active'), '0'); } public function load() { global $wpdb; $this->loadI18N(); include $this->get_plugin_dir() . 'include' . DIRECTORY_SEPARATOR . 'update.php'; if (get_option($this->get_option_name('activation-redirect'))) { delete_option($this->get_option_name('activation-redirect')); wp_safe_redirect(admin_url('admin.php?page=' . $this->get_plugin_slug() . '/settings.php')); exit; } if ( $this->is_noreg_linked() && !$this->is_review_download_in_progress() && get_option($this->get_option_name('download-timestamp'), time()) < time() && !$this->getNotificationParam('review-download-available', 'hidden') && $this->getNotificationParam('review-download-available', 'do-check', true) ) { $this->setNotificationParam('review-download-available', 'active', true); $this->setNotificationParam('review-download-available', 'do-check', false); } if ( !$this->is_noreg_linked() && !$this->getNotificationParam('not-using-no-connection', 'active', false) && $this->getNotificationParam('not-using-no-connection', 'do-check', true) ) { $this->setNotificationParam('not-using-no-connection', 'active', true); $this->setNotificationParam('not-using-no-connection', 'do-check', false); } if ( !class_exists('TrustindexGutenbergPlugin') && function_exists( 'register_block_type' ) && !WP_Block_Type_Registry::get_instance()->is_registered( 'trustindex/block-selector' )) { require_once $this->get_plugin_dir() . 'static' . DIRECTORY_SEPARATOR . 'block-editor' . DIRECTORY_SEPARATOR . 'block-editor.php'; TrustindexGutenbergPlugin::instance(); } } public function loadI18N() { load_textdomain( $this->get_plugin_slug(), $this->get_plugin_dir() . 'languages/'.$this->get_plugin_slug().'-' . get_locale() . '.mo' ); } public function is_enabled() { return get_option($this->get_option_name('active'), 0); } public function add_setting_menu() { global $menu, $submenu; $settingsPageUrl = $this->get_plugin_slug() . "/settings.php"; $settingsPageTitle = $this->platform_name . ' '; if (function_exists('mb_strtolower')) { $settingsPageTitle .= mb_strtolower(__('Reviews', 'wp-reviews-plugin-for-google')); } else { $settingsPageTitle .= strtolower(__('Reviews', 'wp-reviews-plugin-for-google')); } $topMenu = false; foreach ($menu as $key => $item) { if ($item[0] === 'Trustindex.io') { $topMenu = $item; break; } } if ($topMenu === false) { add_menu_page( $settingsPageTitle, 'Trustindex.io', self::$permissionNeeded, $settingsPageUrl, '', $this->get_plugin_file_url('static/img/trustindex-sign-logo.png') ); } else { if (!isset($submenu[ $topMenu[2] ])) { add_submenu_page( $topMenu[2], 'Trustindex.io', $topMenu[3], self::$permissionNeeded, $topMenu[2] ); } add_submenu_page( $topMenu[2], 'Trustindex.io', $settingsPageTitle, self::$permissionNeeded, $settingsPageUrl ); } } public function add_plugin_action_links($links, $file) { if (!is_array($links)) { $links = []; } if (basename($file) === basename($this->plugin_file_path)) { $platformLink = 'get_option_name('widget-setted-up'), 0)) { $platformLink .= 'href="' . admin_url('admin.php?page=' . $this->get_plugin_slug() . '/settings.php&tab=my-reviews') . '">'. __('Review Management', 'wp-reviews-plugin-for-google'); } else { $platformLink .= 'href="' . admin_url('admin.php?page=' . $this->get_plugin_slug() . '/settings.php') . '">'; if (!$this->is_noreg_linked()) { /* translators: %s: Platform name */ $platformLink .= sprintf(__('Connect %s', 'wp-reviews-plugin-for-google'), $this->platform_name); } else { $platformLink .= __('Create Widget', 'wp-reviews-plugin-for-google'); } } $platformLink .= ''; $settingsLink = '' . __('Settings', 'wp-reviews-plugin-for-google') . ''; array_unshift($links, $platformLink, $settingsLink); } return $links; } public function add_plugin_meta_links($meta, $file) { if (basename($file) === basename($this->plugin_file_path)) { $meta[] = ''. __('Get more Features', 'wp-reviews-plugin-for-google') . ' →'; $meta[] = ''. __('Rate our plugin', 'wp-reviews-plugin-for-google') . ' ★★★★★'; } return $meta; } public function init_widget() { if (!class_exists('TrustindexWidget_'.$this->getShortName())) { require $this->get_plugin_dir() . 'trustindex-'. $this->getShortName() .'-widget.class.php'; } } public function register_widget() { return register_widget('TrustindexWidget_'.$this->getShortName()); } public function get_option_name($opt_name) { if (!in_array($opt_name, $this->get_option_names())) { echo esc_html('Option not registered in plugin (Trustindex class)'); } if (in_array($opt_name, [ 'subscription-id', 'proxy-check' ])) { return 'trustindex-'. $opt_name; } else { return 'trustindex-'. $this->getShortName() .'-'. $opt_name; } } public function get_option_names() { return [ 'active', 'page-details', 'subscription-id', 'proxy-check', 'style-id', 'review-content', 'filter', 'scss-set', 'css-content', 'lang', 'no-rating-text', 'dateformat', 'nameformat', 'rate-us-feedback', 'verified-icon', 'enable-animation', 'show-arrows', 'show-reviewers-photo', 'download-timestamp', 'widget-setted-up', 'disable-font', 'show-logos', 'show-stars', 'load-css-inline', 'align', 'review-text-mode', 'amp-hidden-notification', 'review-download-token', 'review-download-inprogress', 'review-download-request-id', 'review-download-modal', 'review-download-is-connecting', 'review-download-is-failed', 'review-manual-download', 'reply-generated', 'instagram-promo-opened', 'footer-filter-text', 'show-header-button', 'reviews-load-more', 'activation-redirect', 'notifications', 'top-rated-type', 'top-rated-date', 'show-review-replies', 'verified-by-trustindex', 'fomo-open', 'fomo-link', 'fomo-border', 'fomo-arrow', 'fomo-icon', 'fomo-color', 'fomo-margin', 'fomo-title', 'fomo-text', 'fomo-url', 'fomo-icon-background', 'fomo-day', 'fomo-hide-count', 'cdn-version-control', 'version-control', 'preview', ]; } private $widgetOptions = []; private $widgetOptionDefaultOverride = []; public function getWidgetOption($name, $forceDatabaseValue = false, $returnDefault = false) { if (isset($this->widgetOptions[$name]) && !$forceDatabaseValue && !$returnDefault) { return $this->widgetOptions[$name]; } if ($returnDefault && isset($this->widgetOptionDefaultOverride[$name])) { return $this->widgetOptionDefaultOverride[$name]; } global $wpdb; if (!in_array($name, ['style-id', 'scss-set'])) { $styleId = $this->getWidgetOption('style-id'); $scssSet = $this->getWidgetOption('scss-set'); } $default = null; if (!$forceDatabaseValue) { switch ($name) { case 'style-id': $default = 4; break; case 'scss-set': $default = 'light-background'; break; case 'lang': $default = 'en'; break; case 'dateformat': $default = 'modern'; break; case 'nameformat': $default = 1; break; case 'filter': global $wpdb; $onlyRatingsDefault = false; if ($this->is_noreg_linked()) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $onlyRatingsDefault = (float)$wpdb->get_var($wpdb->prepare('SELECT COUNT(`id`) FROM %i WHERE `text` != ""', $this->get_tablename('reviews'))) >= 3; } $default = [ 'stars' => [1, 2, 3, 4, 5], 'only-ratings' => $onlyRatingsDefault ]; break; case 'no-rating-text': $default = !in_array($styleId, [6, 8, 37]) ? 1 : 0; break; case 'verified-icon': case 'enable-animation': case 'show-arrows': case 'show-header-button': case 'reviews-load-more': case 'fomo-open': case 'fomo-border': case 'fomo-arrow': $default = 1; break; case 'widget-setted-up': case 'disable-font': case 'footer-filter-text': case 'floating-mobile-open': case 'show-review-replies': case 'fomo-link': case 'fomo-margin': $default = 0; break; case 'align': $default = in_array($styleId, [ 36, 37, 38, 39 ]) ? 'center' : ($this->isRtlLanguage() ? 'right' : 'left'); break; case 'review-text-mode': $default = 'readmore'; break; case 'show-logos': $default = isset(self::$widget_styles[$scssSet]) && self::$widget_styles[$scssSet]['hide-logos'] ? 0 : 1; break; case 'show-stars': $default = isset(self::$widget_styles[$scssSet]) && self::$widget_styles[$scssSet]['hide-stars'] ? 0 : 1; break; case 'show-reviewers-photo': $default = isset(self::$widget_styles[$scssSet]) && self::$widget_styles[$scssSet]['reviewer-photo'] ? 1 : 0; break; case 'top-rated-type': $default = 'Service'; break; case 'top-rated-date': $default = in_array($styleId, [98, 100, 102, 104]) ? 'hide' : ''; break; case 'verified-by-trustindex': $default = 0; break; case 'fomo-icon': $default = self::$widget_templates['templates'][$styleId]['params']['fomo-icon']; break; case 'fomo-color': $params = self::$widget_templates['templates'][$styleId]['params']; $default = isset($params['fomo-color']) ? $params['fomo-color'] : '#FF552B'; break; case 'fomo-icon-background': $default = 0; break; case 'fomo-title': $default = ""; $content = $this->getWidgetOption('review-content'); preg_match('/
Great news.
Your new '. $platformName .' reviews have been downloaded.
| Reply with ChatGPT! » |
'. $message .'
['.$this->get_shortcode_name().' data-widget-id="478dcc2136263f2b3a3726ff"]'));
}
}
public function frontEndErrorForAdmins($text)
{
if (!current_user_can('manage_options')) {
return " ";
}
return self::get_alertbox('error', ' @ '. __('Trustindex plugin', 'wp-reviews-plugin-for-google') .' ('. __('This message is not be visible to visitors in public mode.', 'wp-reviews-plugin-for-google') .')' .
''. __('ERROR with the following plugin:', 'wp-reviews-plugin-for-google') .' '. $this->plugin_name .'
' .
__('CSS file could not saved.', 'wp-reviews-plugin-for-google') .' ('. $this->getCssFile() .') '. __('Your widgets do not display properly!', 'wp-reviews-plugin-for-google') . '
';
if ($errorType === 'filesystem') {
$html .= '
There is an error with your filesystem. We got the following error message:
'. $errorMessage .'Maybe you configured your filesystem incorrectly.