SEO SQUIRRLY™ - Version 10.0.10

Version Description

  • 06/18/2020 =
  • Fixed - Focus Page Words Count
  • Fixed - Focus Page SEO Image
  • Fixed - Goals tasks for SEO Image, SEO in METAs, Robots and Sitemap
  • Fixed - Google charts error Uncaught TypeError: Cannot read property 'arrayToDataTable' of undefined
  • Fixed - Load Squirrly.js in body for Live Assistant
Download this release

Release Info

Developer cifi
Plugin Icon 128x128 SEO SQUIRRLY™
Version 10.0.10
Comparing to
See all releases

Code changes from version 10.0.06 to 10.0.10

Files changed (103) hide show
  1. classes/RemoteController.php +4 -20
  2. classes/helpers/Tools.php +26 -3
  3. controllers/Assistant.php +7 -1
  4. controllers/Audits.php +7 -2
  5. controllers/BulkSeo.php +7 -1
  6. controllers/CheckSeo.php +0 -8
  7. controllers/Dashboard.php +3 -0
  8. controllers/FocusPages.php +7 -2
  9. controllers/Menu.php +9 -2
  10. controllers/Onboarding.php +7 -1
  11. controllers/Overview.php +8 -2
  12. controllers/Patterns.php +6 -1
  13. controllers/Post.php +3 -1
  14. controllers/Ranking.php +7 -2
  15. controllers/Research.php +7 -1
  16. controllers/SeoSettings.php +7 -1
  17. controllers/Snippet.php +6 -1
  18. core/BlockAudits.php +0 -1
  19. core/BlockFocusPages.php +0 -1
  20. core/BlockRanks.php +0 -1
  21. models/CheckSeo.php +42 -1
  22. models/ImportExport.php +3 -1
  23. models/bulkseo/Metas.php +7 -3
  24. models/focuspages/Image.php +5 -2
  25. models/focuspages/Length.php +6 -9
  26. models/focuspages/Onpage.php +5 -3
  27. models/focuspages/Snippet.php +4 -4
  28. readme.txt +64 -25
  29. squirrly.php +3 -3
  30. view/Assistant/Assistant.php +1 -1
  31. view/Assistant/Settings.php +1 -1
  32. view/Audits/Addpage.php +1 -1
  33. view/Audits/Audit.php +1 -1
  34. view/Audits/AuditPageRow.php +6 -2
  35. view/Audits/AuditStats.php +9 -5
  36. view/Audits/Audits.php +8 -1
  37. view/Audits/Compare.php +3 -3
  38. view/Audits/Settings.php +1 -1
  39. view/Blocks/Connect.php +2 -2
  40. view/Blocks/Dashboard.php +7 -0
  41. view/Blocks/Features.php +1 -1
  42. view/Blocks/Jorney.php +1 -1
  43. view/Blocks/KnowledgeBase.php +30 -30
  44. view/Blocks/Login.php +2 -2
  45. view/Blocks/Ranks.php +7 -1
  46. view/Blocks/SEOIssues.php +2 -2
  47. view/Blocks/Toolbar.php +7 -2
  48. view/Blocks/VersionBar.php +1 -1
  49. view/Connect/GoogleAnalytics.php +1 -1
  50. view/Connect/GoogleSearchConsole.php +1 -1
  51. view/FocusPages/Addpage.php +1 -1
  52. view/FocusPages/FocusPageRow.php +9 -5
  53. view/FocusPages/FocusPageStats.php +22 -10
  54. view/FocusPages/Pagelist.php +7 -1
  55. view/Goals/CheckSeo.php +12 -3
  56. view/Goals/Goals.php +5 -5
  57. view/Onboarding/Step1.2.php +1 -1
  58. view/Onboarding/Step2.2.php +1 -1
  59. view/Onboarding/Step3.php +1 -1
  60. view/Ranking/Rankings.php +15 -9
  61. view/Ranking/Settings.php +1 -1
  62. view/Research/Briefcase.php +2 -2
  63. view/Research/Labels.php +2 -2
  64. view/Research/Research.php +1 -1
  65. view/SeoSettings/Advanced.php +1 -1
  66. view/SeoSettings/Automation.php +1 -1
  67. view/SeoSettings/Backup.php +7 -7
  68. view/SeoSettings/Favicon.php +1 -1
  69. view/SeoSettings/Jsonld.php +1 -1
  70. view/SeoSettings/Metas.php +1 -1
  71. view/SeoSettings/Robots.php +1 -1
  72. view/SeoSettings/Sitemap.php +1 -1
  73. view/SeoSettings/Social.php +1 -1
  74. view/SeoSettings/Tracking.php +1 -1
  75. view/SeoSettings/Webmaster.php +1 -1
  76. view/assets/css/account.css +0 -62
  77. view/assets/css/assistant.css +0 -116
  78. view/assets/css/audits.css +0 -1273
  79. view/assets/css/bootstrap-grid.css +0 -1912
  80. view/assets/css/bootstrap-grid.min.css +1 -7
  81. view/assets/css/bootstrap-reboot.css +0 -331
  82. view/assets/css/bootstrap-reboot.min.css +1 -7
  83. view/assets/css/bootstrap.css +0 -9023
  84. view/assets/css/bootstrap.rtl.min.css +2 -0
  85. view/assets/css/briefcase.css +0 -2029
  86. view/assets/css/bulkseo.css +0 -5
  87. view/assets/css/checkseo.css +0 -77
  88. view/assets/css/dashboard.css +0 -22
  89. view/assets/css/datatables.css +0 -15
  90. view/assets/css/datatables.min.css +1 -15
  91. view/assets/css/focuspages.css +0 -140
  92. view/assets/css/fontawesome.css +0 -2926
  93. view/assets/css/frontend.css +0 -152
  94. view/assets/css/frontend.min.css +1 -1
  95. view/assets/css/fullwidth.css +0 -33
  96. view/assets/css/global.css +0 -833
  97. view/assets/css/global.min.css +1 -1
  98. view/assets/css/highlight.css +0 -59
  99. view/assets/css/jorney.css +0 -146
  100. view/assets/css/labels.css +0 -116
  101. view/assets/css/login.css +0 -50
  102. view/assets/css/logo.css +0 -45
  103. view/assets/css/logo.min.css +1 -1
classes/RemoteController.php CHANGED
@@ -87,7 +87,7 @@ class SQ_Classes_RemoteController {
87
  * @return string
88
  */
89
  public static function getMySquirrlyLink($path) {
90
- if (SQ_Classes_Helpers_Tools::getMenuVisible('show_panel')) {
91
  return _SQ_DASH_URL_ . 'login/?token=' . SQ_Classes_Helpers_Tools::getOption('sq_api') . '&user_url=' . get_bloginfo('url') . '&redirect_to=' . _SQ_DASH_URL_ . 'user/' . $path;
92
  } else {
93
  return _SQ_DASH_URL_;
@@ -1312,28 +1312,12 @@ class SQ_Classes_RemoteController {
1312
  __new_post_title: "' . __('Auto Draft') . '",
1313
  __frontend_optimized: "' . __('You’ve already used the Live Assistant to optimize this post when creating it in your Page Builder. Please go back and resume your optimization work there.', _SQ_PLUGIN_NAME_) . '",
1314
  };
1315
-
1316
-
1317
- if (typeof sq_script === "undefined"){
1318
- var sq_script = document.createElement(\'script\');
1319
- sq_script.src = "' . _SQ_STATIC_API_URL_ . SQ_URI . '/js/squirrly' . (SQ_DEBUG ? '' : '.min') . '.js?ver=' . SQ_VERSION . '";
1320
- var site_head = document.getElementsByTagName ("head")[0] || document.documentElement;
1321
- site_head.insertBefore(sq_script, site_head.firstChild);
1322
- }
1323
-
1324
- window.onerror = function(){
1325
- $.sq_config.sq_windowerror = true;
1326
- };
1327
-
1328
- //for older version return
1329
- window.params = [];
1330
-
1331
- $(document).ready(function() {
1332
- $("#sq_preloading").html("");
1333
- });
1334
  })(jQuery);
1335
  </script>';
1336
 
 
 
1337
  }
1338
 
1339
  }
87
  * @return string
88
  */
89
  public static function getMySquirrlyLink($path) {
90
+ if (SQ_Classes_Helpers_Tools::getMenuVisible('show_panel') && current_user_can('sq_manage_settings')) {
91
  return _SQ_DASH_URL_ . 'login/?token=' . SQ_Classes_Helpers_Tools::getOption('sq_api') . '&user_url=' . get_bloginfo('url') . '&redirect_to=' . _SQ_DASH_URL_ . 'user/' . $path;
92
  } else {
93
  return _SQ_DASH_URL_;
1312
  __new_post_title: "' . __('Auto Draft') . '",
1313
  __frontend_optimized: "' . __('You’ve already used the Live Assistant to optimize this post when creating it in your Page Builder. Please go back and resume your optimization work there.', _SQ_PLUGIN_NAME_) . '",
1314
  };
1315
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1316
  })(jQuery);
1317
  </script>';
1318
 
1319
+ echo '<script src="' . _SQ_STATIC_API_URL_ . SQ_URI . '/js/squirrly' . (SQ_DEBUG ? '' : '.min') . '.js?ver=' . SQ_VERSION . '"></script>';
1320
+
1321
  }
1322
 
1323
  }
classes/helpers/Tools.php CHANGED
@@ -821,6 +821,29 @@ class SQ_Classes_Helpers_Tools {
821
  }
822
  }
823
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
824
  /**
825
  * Get a value from $_POST / $_GET
826
  * if unavailable, take a default value
@@ -929,10 +952,10 @@ class SQ_Classes_Helpers_Tools {
929
  */
930
  public static function checkUpgrade($upgrader_object, $options) {
931
  // If an update has taken place and the updated type is plugins and the plugins element exists
932
- if( $options['action'] == 'update' && $options['type'] == 'plugin' && isset( $options['plugins'] ) ) {
933
  // Iterate through the plugins being updated and check if ours is there
934
- foreach( $options['plugins'] as $plugin ) {
935
- if( $plugin == _SQ_PLUGIN_NAME_ . '/squirrly.php' ) {
936
  //Create Qss table if not exists
937
  SQ_Classes_ObjController::getClass('SQ_Models_Qss')->checkTableExists();
938
  }
821
  }
822
  }
823
 
824
+ /**
825
+ * Set the Nonce action
826
+ * @param $action
827
+ * @param string $name
828
+ * @param bool $referer
829
+ * @param bool $echo
830
+ * @return string
831
+ */
832
+ public static function setNonce($action, $name = '_wpnonce', $referer = true, $echo = true) {
833
+ $name = esc_attr($name);
834
+ $nonce_field = '<input type="hidden" name="' . $name . '" value="' . wp_create_nonce($action) . '" />';
835
+
836
+ if ($referer) {
837
+ $nonce_field .= wp_referer_field(false);
838
+ }
839
+
840
+ if ($echo) {
841
+ echo $nonce_field;
842
+ }
843
+
844
+ return $nonce_field;
845
+ }
846
+
847
  /**
848
  * Get a value from $_POST / $_GET
849
  * if unavailable, take a default value
952
  */
953
  public static function checkUpgrade($upgrader_object, $options) {
954
  // If an update has taken place and the updated type is plugins and the plugins element exists
955
+ if ($options['action'] == 'update' && $options['type'] == 'plugin' && isset($options['plugins'])) {
956
  // Iterate through the plugins being updated and check if ours is there
957
+ foreach ($options['plugins'] as $plugin) {
958
+ if ($plugin == _SQ_PLUGIN_NAME_ . '/squirrly.php') {
959
  //Create Qss table if not exists
960
  SQ_Classes_ObjController::getClass('SQ_Models_Qss')->checkTableExists();
961
  }
controllers/Assistant.php CHANGED
@@ -14,7 +14,13 @@ class SQ_Controllers_Assistant extends SQ_Classes_FrontController {
14
  }
15
 
16
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
17
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
18
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
19
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
20
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
14
  }
15
 
16
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
17
+ if(is_rtl()){
18
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
19
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
20
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
21
+ }else{
22
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
23
+ }
24
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
25
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
26
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
controllers/Audits.php CHANGED
@@ -39,7 +39,13 @@ class SQ_Controllers_Audits extends SQ_Classes_FrontController {
39
  }
40
 
41
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
42
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
43
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
44
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
45
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
@@ -189,7 +195,6 @@ class SQ_Controllers_Audits extends SQ_Classes_FrontController {
189
  */
190
  public function getScripts() {
191
  return '<script>
192
- google.load("visualization", "1", {packages: ["corechart"]});
193
  function drawScoreChart(id, values, reverse) {
194
  var data = google.visualization.arrayToDataTable(values);
195
 
39
  }
40
 
41
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
42
+ if(is_rtl()){
43
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
44
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
45
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
46
+ }else{
47
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
48
+ }
49
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
50
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
51
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
195
  */
196
  public function getScripts() {
197
  return '<script>
 
198
  function drawScoreChart(id, values, reverse) {
199
  var data = google.visualization.arrayToDataTable(values);
200
 
controllers/BulkSeo.php CHANGED
@@ -12,7 +12,13 @@ class SQ_Controllers_BulkSeo extends SQ_Classes_FrontController {
12
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'bulkseo');
13
 
14
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
15
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
16
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
17
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
18
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
12
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'bulkseo');
13
 
14
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
15
+ if(is_rtl()){
16
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
17
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
18
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
19
+ }else{
20
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
21
+ }
22
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
23
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
24
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
controllers/CheckSeo.php CHANGED
@@ -24,13 +24,10 @@ class SQ_Controllers_CheckSeo extends SQ_Classes_FrontController {
24
  */
25
  public function init() {
26
 
27
- //Get the notifications from database
28
-
29
  if (!isset($this->congratulations)) {
30
  $this->congratulations = $this->getCongratulations();
31
  }
32
 
33
-
34
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('checkseo');
35
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('knob');
36
 
@@ -271,7 +268,6 @@ class SQ_Controllers_CheckSeo extends SQ_Classes_FrontController {
271
  $this->model->checkSEO();
272
 
273
  break;
274
-
275
  case 'sq_moretasks':
276
  $this->model->dbtasks['tasks_for_today'] = array();
277
  $this->model->saveDbTasks();
@@ -300,16 +296,13 @@ class SQ_Controllers_CheckSeo extends SQ_Classes_FrontController {
300
 
301
  SQ_Classes_Error::setError(__('Could not fix it. You need to change it manually.', _SQ_PLUGIN_NAME_));
302
  break;
303
-
304
  case 'sq_donetask':
305
-
306
  $name = SQ_Classes_Helpers_Tools::getValue('name', false);
307
 
308
  $this->model->doneTask($name);
309
 
310
  SQ_Classes_Error::setMessage(__('Saved! Task marked as done.', _SQ_PLUGIN_NAME_));
311
  break;
312
-
313
  case 'sq_resetignored':
314
  //Remove ignored tasks
315
  $this->model->clearIgnoredTasks();
@@ -317,7 +310,6 @@ class SQ_Controllers_CheckSeo extends SQ_Classes_FrontController {
317
  SQ_Classes_Error::setMessage(__('Saved!', _SQ_PLUGIN_NAME_));
318
 
319
  break;
320
-
321
  case 'sq_ajax_checkseo':
322
  SQ_Classes_Helpers_Tools::setHeader('json');
323
  $json = array();
24
  */
25
  public function init() {
26
 
 
 
27
  if (!isset($this->congratulations)) {
28
  $this->congratulations = $this->getCongratulations();
29
  }
30
 
 
31
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('checkseo');
32
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('knob');
33
 
268
  $this->model->checkSEO();
269
 
270
  break;
 
271
  case 'sq_moretasks':
272
  $this->model->dbtasks['tasks_for_today'] = array();
273
  $this->model->saveDbTasks();
296
 
297
  SQ_Classes_Error::setError(__('Could not fix it. You need to change it manually.', _SQ_PLUGIN_NAME_));
298
  break;
 
299
  case 'sq_donetask':
 
300
  $name = SQ_Classes_Helpers_Tools::getValue('name', false);
301
 
302
  $this->model->doneTask($name);
303
 
304
  SQ_Classes_Error::setMessage(__('Saved! Task marked as done.', _SQ_PLUGIN_NAME_));
305
  break;
 
306
  case 'sq_resetignored':
307
  //Remove ignored tasks
308
  $this->model->clearIgnoredTasks();
310
  SQ_Classes_Error::setMessage(__('Saved!', _SQ_PLUGIN_NAME_));
311
 
312
  break;
 
313
  case 'sq_ajax_checkseo':
314
  SQ_Classes_Helpers_Tools::setHeader('json');
315
  $json = array();
controllers/Dashboard.php CHANGED
@@ -10,6 +10,9 @@ class SQ_Controllers_Dashboard extends SQ_Classes_FrontController {
10
 
11
  public function dashboard() {
12
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('dashboard');
 
 
 
13
  add_action('sq_form_notices', array($this,'getNotificationBar'));
14
 
15
  echo $this->getView('Blocks/Dashboard');
10
 
11
  public function dashboard() {
12
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('dashboard');
13
+ if(is_rtl()) {
14
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
15
+ }
16
  add_action('sq_form_notices', array($this,'getNotificationBar'));
17
 
18
  echo $this->getView('Blocks/Dashboard');
controllers/FocusPages.php CHANGED
@@ -36,7 +36,13 @@ class SQ_Controllers_FocusPages extends SQ_Classes_FrontController {
36
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'pagelist');
37
 
38
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
39
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
40
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
41
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
42
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
@@ -167,7 +173,6 @@ class SQ_Controllers_FocusPages extends SQ_Classes_FrontController {
167
  */
168
  public function getScripts() {
169
  return '<script>
170
- google.load("visualization", "1", {packages: ["corechart"]});
171
  function drawScoreChart(id, values, reverse) {
172
  var data = google.visualization.arrayToDataTable(values);
173
 
36
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'pagelist');
37
 
38
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
39
+ if(is_rtl()){
40
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
41
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
42
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
43
+ }else{
44
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
45
+ }
46
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
47
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
48
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
173
  */
174
  public function getScripts() {
175
  return '<script>
 
176
  function drawScoreChart(id, values, reverse) {
177
  var data = google.visualization.arrayToDataTable(values);
178
 
controllers/Menu.php CHANGED
@@ -197,7 +197,13 @@ class SQ_Controllers_Menu extends SQ_Classes_FrontController {
197
  } elseif ($menuid == 'sq_focuspages' && !SQ_Classes_Helpers_Tools::getMenuVisible('show_focuspages')) {
198
  continue;
199
  } elseif ($menuid == 'sq_dashboard') {
200
- $item['title'] = $item['title'] . (($errors) ? '<span class="sq_errorcount" style="margin: 6px 54px 0 0 !important;">' . $errors . '</span>' : '');
 
 
 
 
 
 
201
  } elseif (!isset($item['parent'])) {
202
  continue;
203
  }
@@ -448,7 +454,8 @@ class SQ_Controllers_Menu extends SQ_Classes_FrontController {
448
  $page = apply_filters('sq_page', SQ_Classes_Helpers_Tools::getValue('page', ''));
449
 
450
  if (in_array($page, array_keys($menus))) {
451
- echo '<script type="text/javascript" src="https://www.google.com/jsapi"></script>';
 
452
  echo '<div id="sq_preloader" class="sq_loading"></div>';
453
 
454
  if ($page <> 'sq_dashboard') {
197
  } elseif ($menuid == 'sq_focuspages' && !SQ_Classes_Helpers_Tools::getMenuVisible('show_focuspages')) {
198
  continue;
199
  } elseif ($menuid == 'sq_dashboard') {
200
+ if(is_rtl()){
201
+ $item['title'] = (($errors) ? '<span class="sq_errorcount" style="margin: 6px 0 0 0 !important; float: left !important;">' . $errors . '</span>' : '') . $item['title'];
202
+
203
+ }else{
204
+ $item['title'] = $item['title'] . (($errors) ? '<span class="sq_errorcount" style="margin: 6px 54px 0 0 !important;">' . $errors . '</span>' : '');
205
+
206
+ }
207
  } elseif (!isset($item['parent'])) {
208
  continue;
209
  }
454
  $page = apply_filters('sq_page', SQ_Classes_Helpers_Tools::getValue('page', ''));
455
 
456
  if (in_array($page, array_keys($menus))) {
457
+ echo '<script type="text/javascript" src="//www.google.com/jsapi"></script>';
458
+ echo '<script>google.load("visualization", "1.0", {packages: ["corechart"]});</script>';
459
  echo '<div id="sq_preloader" class="sq_loading"></div>';
460
 
461
  if ($page <> 'sq_dashboard') {
controllers/Onboarding.php CHANGED
@@ -17,7 +17,13 @@ class SQ_Controllers_Onboarding extends SQ_Classes_FrontController {
17
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'step1');
18
 
19
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
20
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
21
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
22
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
23
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
17
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'step1');
18
 
19
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
20
+ if(is_rtl()){
21
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
22
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
23
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
24
+ }else{
25
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
26
+ }
27
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
28
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
29
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
controllers/Overview.php CHANGED
@@ -13,12 +13,18 @@ class SQ_Controllers_Overview extends SQ_Classes_FrontController {
13
  $this->checkin = SQ_Classes_RemoteController::checkin();
14
 
15
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
16
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
17
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
18
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
19
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
20
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('research');
21
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('navbar.css');
22
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('dashboard');
23
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('account');
24
 
13
  $this->checkin = SQ_Classes_RemoteController::checkin();
14
 
15
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
16
+ if(is_rtl()){
17
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
18
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
19
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
20
+ }else{
21
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
22
+ }
23
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
24
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
25
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
26
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('research');
27
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('navbar');
28
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('dashboard');
29
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('account');
30
 
controllers/Patterns.php CHANGED
@@ -7,7 +7,12 @@ class SQ_Controllers_Patterns extends SQ_Classes_FrontController {
7
  public $patterns;
8
 
9
  public function init() {
10
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap', array('trigger' => true, 'media' => 'all'));
 
 
 
 
 
11
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('patterns', array('trigger' => true, 'media' => 'all'));
12
 
13
  echo '
7
  public $patterns;
8
 
9
  public function init() {
10
+ if(is_rtl()){
11
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap.rtl', array('trigger' => true, 'media' => 'all'));
12
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl', array('trigger' => true, 'media' => 'all'));
13
+ }else{
14
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap', array('trigger' => true, 'media' => 'all'));
15
+ }
16
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('patterns', array('trigger' => true, 'media' => 'all'));
17
 
18
  echo '
controllers/Post.php CHANGED
@@ -10,7 +10,9 @@ class SQ_Controllers_Post extends SQ_Classes_FrontController {
10
 
11
  //Load post style in post edit
12
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('post');
13
-
 
 
14
  //load the draggable script in post edit for the floating SLA
15
  wp_enqueue_script("jquery-ui-core");
16
  wp_enqueue_script("jquery-ui-draggable");
10
 
11
  //Load post style in post edit
12
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('post');
13
+ if(is_rtl()) {
14
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
15
+ }
16
  //load the draggable script in post edit for the floating SLA
17
  wp_enqueue_script("jquery-ui-core");
18
  wp_enqueue_script("jquery-ui-draggable");
controllers/Ranking.php CHANGED
@@ -34,7 +34,13 @@ class SQ_Controllers_Ranking extends SQ_Classes_FrontController {
34
  }
35
 
36
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
37
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
38
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
39
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
40
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
@@ -203,7 +209,6 @@ class SQ_Controllers_Ranking extends SQ_Classes_FrontController {
203
 
204
  public function getScripts() {
205
  return '<script type="text/javascript">
206
- google.load("visualization", "1", {packages: ["corechart"]});
207
  function drawChart(id, values, reverse) {
208
  var data = google.visualization.arrayToDataTable(values);
209
 
34
  }
35
 
36
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
37
+ if(is_rtl()){
38
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
39
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
40
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
41
+ }else{
42
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
43
+ }
44
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
45
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
46
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
209
 
210
  public function getScripts() {
211
  return '<script type="text/javascript">
 
212
  function drawChart(id, values, reverse) {
213
  var data = google.visualization.arrayToDataTable(values);
214
 
controllers/Research.php CHANGED
@@ -41,7 +41,13 @@ class SQ_Controllers_Research extends SQ_Classes_FrontController {
41
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'research');
42
 
43
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
44
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
45
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
46
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
47
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
41
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'research');
42
 
43
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
44
+ if(is_rtl()){
45
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
46
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
47
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
48
+ }else{
49
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
50
+ }
51
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
52
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('datatables');
53
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
controllers/SeoSettings.php CHANGED
@@ -12,7 +12,13 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
12
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'automation');
13
 
14
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
15
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
 
 
 
 
 
 
16
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
17
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
18
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
12
  $tab = SQ_Classes_Helpers_Tools::getValue('tab', 'automation');
13
 
14
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap-reboot');
15
+ if(is_rtl()){
16
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('popper');
17
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap.rtl');
18
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl');
19
+ }else{
20
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('bootstrap');
21
+ }
22
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('switchery');
23
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome');
24
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('global');
controllers/Snippet.php CHANGED
@@ -28,7 +28,12 @@ class SQ_Controllers_Snippet extends SQ_Classes_FrontController {
28
  * @return mixed
29
  */
30
  public function init() {
31
- SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap', array('trigger' => true, 'media' => 'all'));
 
 
 
 
 
32
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome', array('trigger' => true, 'media' => 'all'));
33
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight', array('trigger' => true, 'media' => 'all'));
34
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('patterns', array('trigger' => true, 'media' => 'all'));
28
  * @return mixed
29
  */
30
  public function init() {
31
+ if(is_rtl()){
32
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap.rtl', array('trigger' => true, 'media' => 'all'));
33
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('rtl', array('trigger' => true, 'media' => 'all'));
34
+ }else{
35
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('sqbootstrap', array('trigger' => true, 'media' => 'all'));
36
+ }
37
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('fontawesome', array('trigger' => true, 'media' => 'all'));
38
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight', array('trigger' => true, 'media' => 'all'));
39
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('patterns', array('trigger' => true, 'media' => 'all'));
core/BlockAudits.php CHANGED
@@ -14,7 +14,6 @@ class SQ_Core_BlockAudits extends SQ_Classes_BlockController {
14
 
15
  public function getScripts() {
16
  return '<script>
17
- google.load("visualization", "1", {packages: ["corechart"]});
18
  function drawChart(id, values, reverse) {
19
  var data = google.visualization.arrayToDataTable(values);
20
 
14
 
15
  public function getScripts() {
16
  return '<script>
 
17
  function drawChart(id, values, reverse) {
18
  var data = google.visualization.arrayToDataTable(values);
19
 
core/BlockFocusPages.php CHANGED
@@ -36,7 +36,6 @@ class SQ_Core_BlockFocusPages extends SQ_Classes_BlockController {
36
 
37
  public function getScripts() {
38
  return '<script>
39
- google.load("visualization", "1", {packages: ["corechart"]});
40
  function drawChart(id, values, reverse) {
41
  var data = google.visualization.arrayToDataTable(values);
42
 
36
 
37
  public function getScripts() {
38
  return '<script>
 
39
  function drawChart(id, values, reverse) {
40
  var data = google.visualization.arrayToDataTable(values);
41
 
core/BlockRanks.php CHANGED
@@ -28,7 +28,6 @@ class SQ_Core_BlockRanks extends SQ_Classes_BlockController {
28
 
29
  public function getScripts() {
30
  return '<script>
31
- google.load("visualization", "1", {packages: ["corechart"]});
32
  function drawChart(id, values, reverse) {
33
  var data = google.visualization.arrayToDataTable(values);
34
 
28
 
29
  public function getScripts() {
30
  return '<script>
 
31
  function drawChart(id, values, reverse) {
32
  var data = google.visualization.arrayToDataTable(values);
33
 
models/CheckSeo.php CHANGED
@@ -1333,7 +1333,15 @@ class SQ_Models_CheckSeo {
1333
  //filter the array
1334
  $remote_tasks[$function] = array_filter($remote_tasks[$function]);
1335
  //make sure the complete param remains
1336
- if (!isset($remote_tasks[$function]['completed'])) $remote_tasks[$function]['completed'] = false;
 
 
 
 
 
 
 
 
1337
  //create the db taks if doesn't exist
1338
  if (!isset($this->dbtasks[$this->category_name][$function])) $this->dbtasks[$this->category_name][$function] = array();
1339
  //merge the local and remote task
@@ -1834,6 +1842,39 @@ class SQ_Models_CheckSeo {
1834
  );
1835
  }
1836
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1837
  public function getAMPWebsite() {
1838
  $valid = true;
1839
  if (function_exists('is_amp_endpoint') && is_amp_endpoint()) {
1333
  //filter the array
1334
  $remote_tasks[$function] = array_filter($remote_tasks[$function]);
1335
  //make sure the complete param remains
1336
+ if (!isset($remote_tasks[$function]['completed'])) {
1337
+ $remote_tasks[$function]['completed'] = false;
1338
+
1339
+ if (method_exists($this, $function)){
1340
+ if ($result = @call_user_func(array($this, $function))) {
1341
+ $remote_tasks[$function]['completed'] = $result['completed'];
1342
+ }
1343
+ }
1344
+ }
1345
  //create the db taks if doesn't exist
1346
  if (!isset($this->dbtasks[$this->category_name][$function])) $this->dbtasks[$this->category_name][$function] = array();
1347
  //merge the local and remote task
1842
  );
1843
  }
1844
 
1845
+ /**
1846
+ * Check Local Robots
1847
+ * @return array
1848
+ */
1849
+ public function getRobots(){
1850
+ if(SQ_Classes_Helpers_Tools::getOption('sq_auto_robots')) {
1851
+ return array(
1852
+ 'completed' => 1
1853
+ );
1854
+ }
1855
+
1856
+ return array();
1857
+ }
1858
+
1859
+ /**
1860
+ * Check Local Sitemap
1861
+ * @return array
1862
+ */
1863
+ public function getSitemap(){
1864
+ if(SQ_Classes_Helpers_Tools::getOption('sq_auto_sitemap')) {
1865
+ return array(
1866
+ 'completed' => 1
1867
+ );
1868
+ }
1869
+
1870
+ return array();
1871
+ }
1872
+
1873
+
1874
+ /**
1875
+ * Check AMP Website
1876
+ * @return array
1877
+ */
1878
  public function getAMPWebsite() {
1879
  $valid = true;
1880
  if (function_exists('is_amp_endpoint') && is_amp_endpoint()) {
models/ImportExport.php CHANGED
@@ -400,7 +400,9 @@ class SQ_Models_ImportExport {
400
  if (function_exists('mb_detect_encoding') && function_exists('iconv')) {
401
  if ($encoding = mb_detect_encoding($value)) {
402
  if ($encoding <> 'UTF-8') {
403
- $value = iconv($encoding, 'UTF-8', $value);
 
 
404
  if (strpos($value, '%%') !== false) {
405
  $value = preg_replace('/%%([^\%]+)%%/', '{{$1}}', $value);
406
  }
400
  if (function_exists('mb_detect_encoding') && function_exists('iconv')) {
401
  if ($encoding = mb_detect_encoding($value)) {
402
  if ($encoding <> 'UTF-8') {
403
+ if (function_exists('iconv')) {
404
+ $value = iconv($encoding, 'UTF-8', $value);
405
+ }
406
  if (strpos($value, '%%') !== false) {
407
  $value = preg_replace('/%%([^\%]+)%%/', '{{$1}}', $value);
408
  }
models/bulkseo/Metas.php CHANGED
@@ -246,7 +246,9 @@ class SQ_Models_Bulkseo_Metas extends SQ_Models_Abstract_Assistant {
246
  $keywords = preg_split('/,/', $this->_keyword);
247
  if (!empty($keywords)) {
248
  foreach ($keywords as $keyword) {
249
- if ($keyword <> '' && (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->title, trim($keyword)) !== false)) {
 
 
250
  $task['completed'] = true;
251
  return $task;
252
  }
@@ -357,16 +359,18 @@ class SQ_Models_Bulkseo_Metas extends SQ_Models_Abstract_Assistant {
357
 
358
  if ($this->_loadpatterns && $this->_post->sq->description <> '') {
359
  $keywords = preg_split('/,/', $this->_keyword);
 
360
  if (!empty($keywords)) {
361
  foreach ($keywords as $keyword) {
362
- if ($keyword <> '' && (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->description, trim($keyword)) !== false)) {
 
 
363
  $task['completed'] = true;
364
  return $task;
365
  }
366
  }
367
  }
368
  }
369
-
370
  $task['completed'] = false;
371
 
372
  return $task;
246
  $keywords = preg_split('/,/', $this->_keyword);
247
  if (!empty($keywords)) {
248
  foreach ($keywords as $keyword) {
249
+ $title = html_entity_decode(utf8_decode($this->_post->sq->title));
250
+ $keyword = html_entity_decode(utf8_decode($keyword));
251
+ if ($keyword <> '' && (SQ_Classes_Helpers_Tools::findStr($title, trim($keyword)) !== false)) {
252
  $task['completed'] = true;
253
  return $task;
254
  }
359
 
360
  if ($this->_loadpatterns && $this->_post->sq->description <> '') {
361
  $keywords = preg_split('/,/', $this->_keyword);
362
+
363
  if (!empty($keywords)) {
364
  foreach ($keywords as $keyword) {
365
+ $description = html_entity_decode(utf8_decode($this->_post->sq->description));
366
+ $keyword = html_entity_decode(utf8_decode($keyword));
367
+ if ($keyword <> '' && (SQ_Classes_Helpers_Tools::findStr($description, trim($keyword)) !== false)) {
368
  $task['completed'] = true;
369
  return $task;
370
  }
371
  }
372
  }
373
  }
 
374
  $task['completed'] = false;
375
 
376
  return $task;
models/focuspages/Image.php CHANGED
@@ -80,7 +80,7 @@ class SQ_Models_Focuspages_Image extends SQ_Models_Abstract_Assistant {
80
  $header .= '<div class="font-weight-bold text-black-50 mb-2 text-center">' . __('Keyword', _SQ_PLUGIN_NAME_) . ': <strong class="text-info">' . $this->_keyword . '</strong></div>';
81
  if (isset($this->_post->ID)) {
82
  if (isset($this->_post->ID)) {
83
- $edit_link = SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo', array('sid=' . $this->_post->ID, 'stype=' . $this->_post->post_type)) ;
84
  }
85
  $header .= '<a href="' . $edit_link . '" target="_blank" class="btn btn-success text-white col-sm-8 offset-2 mt-3">' . __('Edit your snippet', _SQ_PLUGIN_NAME_) . '</a>';
86
  }
@@ -126,7 +126,10 @@ class SQ_Models_Focuspages_Image extends SQ_Models_Abstract_Assistant {
126
  $task['error_message'] = __("No image found", _SQ_PLUGIN_NAME_);
127
  $task['completed'] = false;
128
  } elseif (!empty($this->_images)) {
129
- $words = explode(' ', $this->_keyword);
 
 
 
130
  foreach ($this->_images as $image) {
131
  //Check if all words are present in the image URL
132
  $allwords = true;
80
  $header .= '<div class="font-weight-bold text-black-50 mb-2 text-center">' . __('Keyword', _SQ_PLUGIN_NAME_) . ': <strong class="text-info">' . $this->_keyword . '</strong></div>';
81
  if (isset($this->_post->ID)) {
82
  if (isset($this->_post->ID)) {
83
+ $edit_link = SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo', array('sid=' . $this->_post->ID, 'stype=' . $this->_post->post_type));
84
  }
85
  $header .= '<a href="' . $edit_link . '" target="_blank" class="btn btn-success text-white col-sm-8 offset-2 mt-3">' . __('Edit your snippet', _SQ_PLUGIN_NAME_) . '</a>';
86
  }
126
  $task['error_message'] = __("No image found", _SQ_PLUGIN_NAME_);
127
  $task['completed'] = false;
128
  } elseif (!empty($this->_images)) {
129
+ $keyword = html_entity_decode(utf8_decode($this->_keyword));
130
+ $keyword = preg_replace('/[^a-zA-Z0-9\']/', ' ', $keyword);
131
+ $keyword = preg_replace('/\s{2,}/', ' ', $keyword);
132
+ $words = explode(' ', $keyword);
133
  foreach ($this->_images as $image) {
134
  //Check if all words are present in the image URL
135
  $allwords = true;
models/focuspages/Length.php CHANGED
@@ -18,10 +18,7 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
18
  return;
19
  }
20
 
21
- if (isset($this->_post->post_content)) {
22
- $content = SQ_Classes_Helpers_Sanitize::clearDescription($this->_post->post_content);
23
- $this->_words = str_word_count($content);
24
- } elseif (isset($this->_audit->data->sq_seo_meta->words)) {
25
  $this->_words = $this->_audit->data->sq_seo_meta->words;
26
  }
27
 
@@ -42,7 +39,7 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
42
  ),
43
  'avgtime' => array(
44
  'title' => __("Reader's Experience", _SQ_PLUGIN_NAME_),
45
- 'value' => ($this->_pagetime ? number_format(($this->_pagetime / 60), 0) : 0) . ' ' . __('minutes average', _SQ_PLUGIN_NAME_),
46
  'description' => sprintf(__("Get an average time on page of minimum 2 minutes for this focus page. You can do this by editing the content and making it more appealing to visitors. %s We're looking at the Average Time On Page for this page. %s Why? %s Because, sometimes website owners can be tempted to make the pages longer in order to get many words on a page. They make them longer by increasing wordiness. %s Over 1,500 words / page can give you much better SEO results. However, making it longer does not mean you should make it boring. %s In order to check that the length of the page was increased properly, we also take into account if website visitors love this page.", _SQ_PLUGIN_NAME_), '<br /><br />', '<br /><br />', '<br /><br />', '<br /><br />', '<br /><br />'),
47
  ),
48
  );
@@ -87,7 +84,7 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
87
 
88
  if ($this->_error && !$this->_audit->sq_analytics_google_connected) {
89
  $title = __("Connect to Google Analytics first.", _SQ_PLUGIN_NAME_);
90
- }else {
91
  foreach ($this->_tasks[$this->_category] as $task) {
92
  if ($task['completed'] === false) {
93
  return __("Click to open the Assistant in the right sidebar and follow the instructions.", _SQ_PLUGIN_NAME_);
@@ -102,7 +99,7 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
102
  * @return bool|WP_Error
103
  */
104
  public function checkWordcont($task) {
105
- if ($this->_words) {
106
  $task['completed'] = ($this->_words >= self::WORDCOUNT_MINVAL);
107
  return $task;
108
  }
@@ -116,12 +113,12 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
116
  * @return bool|WP_Error
117
  */
118
  public function checkAvgtime($task) {
119
- if ($this->_pagetime) {
120
  $task['completed'] = ($this->_pagetime >= self::PAGETIME_MINVAL);
121
  return $task;
122
  }
123
 
124
- if(!$this->_audit->sq_analytics_google_connected){
125
  $task['error_message'] = __("Connect Google Analytics first.", _SQ_PLUGIN_NAME_);
126
  }
127
 
18
  return;
19
  }
20
 
21
+ if (isset($this->_audit->data->sq_seo_meta->words)) {
 
 
 
22
  $this->_words = $this->_audit->data->sq_seo_meta->words;
23
  }
24
 
39
  ),
40
  'avgtime' => array(
41
  'title' => __("Reader's Experience", _SQ_PLUGIN_NAME_),
42
+ 'value' => ($this->_pagetime !== false ? number_format(($this->_pagetime / 60), 0) : 0) . ' ' . __('minutes average', _SQ_PLUGIN_NAME_),
43
  'description' => sprintf(__("Get an average time on page of minimum 2 minutes for this focus page. You can do this by editing the content and making it more appealing to visitors. %s We're looking at the Average Time On Page for this page. %s Why? %s Because, sometimes website owners can be tempted to make the pages longer in order to get many words on a page. They make them longer by increasing wordiness. %s Over 1,500 words / page can give you much better SEO results. However, making it longer does not mean you should make it boring. %s In order to check that the length of the page was increased properly, we also take into account if website visitors love this page.", _SQ_PLUGIN_NAME_), '<br /><br />', '<br /><br />', '<br /><br />', '<br /><br />', '<br /><br />'),
44
  ),
45
  );
84
 
85
  if ($this->_error && !$this->_audit->sq_analytics_google_connected) {
86
  $title = __("Connect to Google Analytics first.", _SQ_PLUGIN_NAME_);
87
+ } else {
88
  foreach ($this->_tasks[$this->_category] as $task) {
89
  if ($task['completed'] === false) {
90
  return __("Click to open the Assistant in the right sidebar and follow the instructions.", _SQ_PLUGIN_NAME_);
99
  * @return bool|WP_Error
100
  */
101
  public function checkWordcont($task) {
102
+ if ($this->_words !== false) {
103
  $task['completed'] = ($this->_words >= self::WORDCOUNT_MINVAL);
104
  return $task;
105
  }
113
  * @return bool|WP_Error
114
  */
115
  public function checkAvgtime($task) {
116
+ if ($this->_pagetime !== false) {
117
  $task['completed'] = ($this->_pagetime >= self::PAGETIME_MINVAL);
118
  return $task;
119
  }
120
 
121
+ if (!$this->_audit->sq_analytics_google_connected) {
122
  $task['error_message'] = __("Connect Google Analytics first.", _SQ_PLUGIN_NAME_);
123
  }
124
 
models/focuspages/Onpage.php CHANGED
@@ -18,7 +18,9 @@ class SQ_Models_Focuspages_Onpage extends SQ_Models_Abstract_Assistant {
18
  return;
19
  }
20
 
21
- if (isset($this->_audit->data->sq_seo_file_robots->value)) {
 
 
22
  $this->_robots = $this->_audit->data->sq_seo_file_robots->value;
23
  }
24
 
@@ -49,7 +51,7 @@ class SQ_Models_Focuspages_Onpage extends SQ_Models_Abstract_Assistant {
49
  $this->_tasks[$this->_category] = array(
50
  'sitemap' => array(
51
  'title' => __("Enhance your sitemap", _SQ_PLUGIN_NAME_),
52
- 'description' => sprintf(__("Add images / videos to your sitemap. It's important to have images / videos enabled. %s Squirrly SEO makes it super easy for you to enhance your XML sitemap. %s Just use the settings from %sSquirrly > SEO Settings > Sitemap XML%s. Find the XML sitemap section and use the settings from that panel. ", _SQ_PLUGIN_NAME_), '<br /><br />', '<br /><br />', '<a href="' . SQ_Classes_Helpers_Tools::getAdminUrl('sq_seosettings', 'sitemap') . '" target="_blank" >', '</a>'),
53
  ),
54
  'posttype' => array(
55
  'title' => __("Post Type settings activated", _SQ_PLUGIN_NAME_),
@@ -142,7 +144,7 @@ class SQ_Models_Focuspages_Onpage extends SQ_Models_Abstract_Assistant {
142
  *
143
  */
144
  public function checkRobots($task) {
145
- if ($this->_robots) {
146
  $task['completed'] = ($this->_robots <> '');
147
  return $task;
148
  }
18
  return;
19
  }
20
 
21
+ if (SQ_Classes_Helpers_Tools::getOption('sq_auto_robots')) {
22
+ $this->_robots = home_url('robots.txt');
23
+ }elseif (isset($this->_audit->data->sq_seo_file_robots->value)) {
24
  $this->_robots = $this->_audit->data->sq_seo_file_robots->value;
25
  }
26
 
51
  $this->_tasks[$this->_category] = array(
52
  'sitemap' => array(
53
  'title' => __("Enhance your sitemap", _SQ_PLUGIN_NAME_),
54
+ 'description' => sprintf(__("Add images / videos to your sitemap. It's important to have images / videos enabled. %s Squirrly SEO makes it super easy for you to enhance your XML sitemap. %s Just use the settings from %sSquirrly > SEO Settings > Sitemap XML%s. Find the XML sitemap section and use the settings from that panel. ", _SQ_PLUGIN_NAME_), '<br /><br />', '<br /><br />', '<a href="' . SQ_Classes_Helpers_Tools::getAdminUrl('sq_seosettings', 'sitemap') . '" target="_blank" >', '</a>'),
55
  ),
56
  'posttype' => array(
57
  'title' => __("Post Type settings activated", _SQ_PLUGIN_NAME_),
144
  *
145
  */
146
  public function checkRobots($task) {
147
+ if ($this->_robots !== false) {
148
  $task['completed'] = ($this->_robots <> '');
149
  return $task;
150
  }
models/focuspages/Snippet.php CHANGED
@@ -47,12 +47,12 @@ class SQ_Models_Focuspages_Snippet extends SQ_Models_Abstract_Assistant {
47
  }
48
 
49
  if ($this->_title && $this->_keyword) {
50
- if (!$this->_keyword_in_title = (stripos($this->_post->sq->title, $this->_keyword) !== false)) {
51
  if ($this->_post->sq->keywords <> '') {
52
  $keywords = explode(',', $this->_post->sq->keywords);
53
 
54
  foreach ($keywords as $keyword) {
55
- if ($this->_keyword_in_title = (stripos($this->_post->sq->title, trim($keyword)) !== false)) {
56
  break;
57
  }
58
  }
@@ -61,12 +61,12 @@ class SQ_Models_Focuspages_Snippet extends SQ_Models_Abstract_Assistant {
61
  }
62
 
63
  if ($this->_description && $this->_keyword) {
64
- if (!$this->_keyword_in_description = (stripos($this->_post->sq->description, $this->_keyword) !== false)) {
65
  if ($this->_post->sq->keywords <> '') {
66
  $keywords = explode(',', $this->_post->sq->keywords);
67
 
68
  foreach ($keywords as $keyword) {
69
- if ($this->_keyword_in_description = (stripos($this->_post->sq->description, trim($keyword)) !== false)) {
70
  break;
71
  }
72
  }
47
  }
48
 
49
  if ($this->_title && $this->_keyword) {
50
+ if (!$this->_keyword_in_title = (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->title, $this->_keyword) !== false)) {
51
  if ($this->_post->sq->keywords <> '') {
52
  $keywords = explode(',', $this->_post->sq->keywords);
53
 
54
  foreach ($keywords as $keyword) {
55
+ if ($this->_keyword_in_title = (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->title, trim($keyword)) !== false)) {
56
  break;
57
  }
58
  }
61
  }
62
 
63
  if ($this->_description && $this->_keyword) {
64
+ if (!$this->_keyword_in_description = (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->description, $this->_keyword) !== false)) {
65
  if ($this->_post->sq->keywords <> '') {
66
  $keywords = explode(',', $this->_post->sq->keywords);
67
 
68
  foreach ($keywords as $keyword) {
69
+ if ($this->_keyword_in_description = (SQ_Classes_Helpers_Tools::findStr($this->_post->sq->description, trim($keyword)) !== false)) {
70
  break;
71
  }
72
  }
readme.txt CHANGED
@@ -12,25 +12,39 @@ Squirrly 2020 is the First-Ever Non-Human SEO Consultant. In a Plugin. Powered b
12
 
13
  == Description ==
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  First-Ever Non-Human SEO Consultant Is Coming to WordPress. SEO Technology Meets SEO Marketing. Squirrly handles all tech requirements for rich snippets, social snippets, and more, while helping you get the best SEO Marketing.
16
 
17
  How does it do that? By acting as your private SEO Consultant. Watch the video:
18
 
19
  https://www.youtube.com/watch?v=m2R2d2Q4Sfk
20
 
21
- **Your next SEO Plugin is NOT an SEO Plugin.**
22
  It's a Non-Human Private SEO Consultant.
23
  Powered by Machine Learning and Cloud Services.
24
  It's the First of its kind.
25
  It's the new Squirrly 2020: Smart Strategy and it lives and works inside your WordPress.
26
 
27
- Squirrly 2020 will level the playing field for small and medium-sized businesses when it comes to Wordpress SEO marketing.
28
-
29
- We put advanced digital tools to work for you so that you become highly visible online and therefore can sell your products and services.
30
-
31
  We've made Expert-Level SEO Advice (the kind you'd pay consultants $2,500 USD / month) very accessible for WordPress site owners, small business owners, professional bloggers, freelancers, agencies.
32
 
33
- https://youtu.be/PQopm-dHpNI
 
 
34
 
35
  Having studied over 600,000 WordPress sites with performance metrics, growth metrics, this new Non-Human consultant has 7 years of experience and "knows" what you need in order to become successful. Just like all the people in our <a title="Squirrly SEO Success for WordPress Users" href="https://www.squirrly.co/successful/">Success Stories Who Followed Squirrly's Advice.</a>
36
 
@@ -127,7 +141,7 @@ It's time to rethink the old way of doing search engine optimization for WordPre
127
 
128
  Why? Because the old way of doing things is no longer relevant to how search engines work today. Because Google does NOT perceive your pages as being all the same.
129
 
130
- There is no “one size fits all” in SEO, so using an SEO plugin that treats all pages the same way is dangerous for your business.
131
 
132
  It's like applying a random treatment regardless of the symptoms, just because it had worked once (in another case) for another patient. Would YOU put your faith in that?
133
 
@@ -392,6 +406,31 @@ Type a keyword to the right of the screen and start using Squirrly Seo. Enjoy!
392
  Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many new features. If you don't want to change the current experience you have with Squirrly you can remain on the current stable version of Squirrly SEO.
393
 
394
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
395
  = 10.0.06 - 06/01/2020 =
396
  * Update - Inspect URL when the Audit can't be made
397
  * Update - Add all the Features Categories in the Overview
@@ -643,7 +682,7 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
643
  * Update - Platform SEO task description
644
  * Update - Import Keywords from CSV
645
  * Update - Add the option in SEO Settings > Tracking to load the tracking codes only for visitors
646
- * Fix - Parse error: syntax error, unexpected ‘::' Sitemaps.php on line 476
647
  * Fix - Responsive assistant view for pads and tiny desktops
648
  * Fix - Keyword in Bulk SEO
649
  * Fix - Don't inport the Journey Date
@@ -856,7 +895,7 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
856
  * SEO Update - Facebook Pixel amazing updates to control, tracking, and event-based actions
857
  * SEO Update - Rich Pins updates for WooCommerce based Pinterest profiles and Pinterest posts
858
  * SEO Update - more schema and json-ld updates
859
- * SEO Update - Custom Sidebars – Dynamic Widget Area Manager compatibility
860
 
861
  = 8.3.14 - 03/19/2018 =
862
  * SEO Update - Add a new pattern {{post_description}} to get only the description from Post Content
@@ -907,7 +946,7 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
907
  * SEO Update - Link Checker works to improve compatibility
908
  * SEO Update - Open Graph for Facebook, Google+ and Twitter Card Tags
909
  * SEO Update - Open Graph for Facebook, Google+ and Twitter Card Tags plugin works
910
- * SEO Update - WordPress Share Buttons Plugin – AddThis compatiblity
911
  * SEO Update - Social Media Share Buttons & Social Sharing Icons works
912
  * SEO Update - AddToAny Share Buttons compatibility
913
 
@@ -919,12 +958,12 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
919
  * SEO Update - Contact Widgets works
920
  * SEO Update - Social Icons compatible
921
  * SEO Update - OG
922
- * SEO Update - Wordfence Security – Firewall & Malware Scan compatible
923
  * SEO Update - Google Analytics Dashboard for WP (GADWP) compatible
924
  * SEO Update - Jetpack by WordPress.com backups and imports
925
  * SEO Update - Elementor Page Builder compatible
926
  * SEO Update - Elementor Page Builder SEO Live Assistant now checks it better
927
- * SEO Update - Ninja Forms – The Easy and Powerful Forms Builder compatibility
928
 
929
  = 8.3.08 - 02/15/2018 =
930
  * SEO Update - Update the article:tag Meta for Facebook Open Graph (SEO update)
@@ -944,7 +983,7 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
944
  * SEO Update - WooCommerce PayPal Express Checkout Payment Gateway compatible
945
  * SEO Update - All In One SEO Pack backup data and imports
946
  * SEO Update - Nextend Social Login and Register (Facebook, Google, Twitter) compatible
947
- * SEO Update - Revive Old Posts – Auto Post to Social Media compatible
948
  * SEO Update - WP to Twitter
949
 
950
  = 8.3.06 - 02/09/2018 =
@@ -1040,30 +1079,30 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
1040
  * SEO Fix - Fixed the Doublin Core name error on line 29
1041
  * Squirrly SEO is now compatible with WP 4.8.3
1042
 
1043
- = 8.2.20 – 11/02/2017 =
1044
  * SEO Fix - Fixed the Excerpt Only patterh
1045
  * SEO Fix - Fixed Squirrly Snippet in case is empty or has special chars
1046
 
1047
- = 8.2.19 – 10/30/2017 =
1048
  * SEO Update - Update Squirrly Live Assistant to use less resources and work faster
1049
  * SEO Update - Added the Post Publish option in Squirrly Split Window
1050
  * SEO Fix - Fixed Greeck keywords optimization fixed
1051
  * SEO Fix - Fixed the Keyword Research not to display the error message and to be able to redo the search
1052
  * SEO Fix - Fixed the Squirrly Snippet's Title snd Description when using special chars
1053
 
1054
- = 8.2.18 – 10/27/2017 =
1055
  * SEO Update - Update compatibility with Polylang plugin
1056
  * SEO Fix - Increased connection time with out API in case of slow internet access
1057
  * SEO Fix - Fixed the yellow highlight in frontend
1058
  * SEO Fix - Fixed Squirrly SLA loading in post edit
1059
  * SEO Fix - Fixed small bugs with article optimization in my.squirrly.co
1060
 
1061
- = 8.2.17 – 10/24/2017 =
1062
  * SEO Fix - Fixed the SLA loading issue for older WP versions
1063
  * SEO Fix - Fixed the Keyword one letter when loading a new post/page
1064
  * SEO Fix - Corrected the Facebook App ID
1065
 
1066
- = 8.2.15 – 10/18/2017 =
1067
  * SEO Update - Increased the loading speed for favicon.icon and robots.txt
1068
  * SEO Update - Update the SEO Audit with the latest METAs
1069
  * SEO Update - Register the Subservers for WP Multisite
@@ -1071,32 +1110,32 @@ Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many n
1071
  * SEO Fix - Fixed the Squirrly Snippet in frontend in case the js and css are not loading
1072
  * SEO Fix - Show error message in case SLA is not loading
1073
 
1074
- = 8.2.14 – 10/12/2017 =
1075
  * SEO Fix - Fixed compatibility with Beaver Builder
1076
  * SEO Fix - Increased security on SEO restore in Import SEO section
1077
 
1078
- = 8.2.13 – 10/11/2017 =
1079
  * SEO Fix - Fixed the snippet preview in case some features are disabled
1080
  * SEO Fix - Fixed the Title and Description Lenght in Frontend
1081
  * SEO Fix - Added the option to import the old SEO settings from Squirrly SEO
1082
 
1083
- = 8.2.11 – 10/10/2017 =
1084
  * SEO Fix - Fixed remove meta from Elementor
1085
  * SEO Fix - Fixed small bugs for Squirrly Split Window
1086
 
1087
- = 8.2.10 – 10/10/2017 =
1088
  * SEO Update - Launching Squirrly 2018 Steve
1089
  * See all the new features here: https://howto.squirrly.co/kb/slides/
1090
 
1091
- = 8.0.5 – 08/14/2017 =
1092
  * SEO Fix - Fixed HTTPS jquery load in sitemap.xml
1093
  * SEO Squirrly is compatible with WP 4.8.1
1094
 
1095
- = 8.0.4 – 07/24/2017 =
1096
  * SEO Fix - Fixed minor bugs
1097
  * SEO Fix - Fixed loading https classes in SSL backend
1098
 
1099
- = 8.0.2 – 05/20/2017 =
1100
  * SEO Update - Update the JSON-LD with the last update from google
1101
  * Squirrly SEO is compatible with WP 4.8
1102
 
12
 
13
  == Description ==
14
 
15
+ A.I.-based Private SEO Consultant. In a Plugin. Powered by Machine Learning and Cloud Services.
16
+
17
+ Offers the same level of advice as a Human consultant would, yet with greater precision and customization.
18
+
19
+ Over 300 functionalities for SEO now available when you need them. (if you're using the Non-SEO expert mode: then our A.I. will tell you when you need to use each of them and in which order; so it's not important for you to learn everything if you don't want to).
20
+
21
+ I've been interviewed by Startup Valley and <a title="Squirrly Business Products and Digital Assistants" href="https://www.startupvalley.news/uk/squirrly/">talked at length about how we built this A.I. consultant</a> on top of Squirrly's existing SEO features (the likes of which you can only get from SEMrush, Moz, Ahrefs)
22
+
23
+ Checks your traffic, how well people engage with content on your site, sees your positions for all pages inside the Google search engine, tells you how to bring more traffic and how to make more of your pages visible, gives you solid advice for getting more clicks and more.
24
+
25
+ Insanely Great Support with Facebook Community, Huge Knowledge base, Multiple Support Channels, Free Academy Access (Education Cloud 2020), Podcast, Youtube videos and more. <a title="Find All Support Options Here" href="https://fourhourseo.com/">See all of them here. (click and scroll down)</a>
26
+
27
+ We've built this so that YOU become successful. Learn more about our vision here.
28
+
29
+ https://www.youtube.com/watch?v=__PPtpPIcCI
30
+
31
  First-Ever Non-Human SEO Consultant Is Coming to WordPress. SEO Technology Meets SEO Marketing. Squirrly handles all tech requirements for rich snippets, social snippets, and more, while helping you get the best SEO Marketing.
32
 
33
  How does it do that? By acting as your private SEO Consultant. Watch the video:
34
 
35
  https://www.youtube.com/watch?v=m2R2d2Q4Sfk
36
 
37
+ **Your next SEO Plugin is NOT just an SEO Plugin.**
38
  It's a Non-Human Private SEO Consultant.
39
  Powered by Machine Learning and Cloud Services.
40
  It's the First of its kind.
41
  It's the new Squirrly 2020: Smart Strategy and it lives and works inside your WordPress.
42
 
 
 
 
 
43
  We've made Expert-Level SEO Advice (the kind you'd pay consultants $2,500 USD / month) very accessible for WordPress site owners, small business owners, professional bloggers, freelancers, agencies.
44
 
45
+ How can you start getting the advice?
46
+
47
+ https://www.youtube.com/watch?v=drRVRBFYUKA
48
 
49
  Having studied over 600,000 WordPress sites with performance metrics, growth metrics, this new Non-Human consultant has 7 years of experience and "knows" what you need in order to become successful. Just like all the people in our <a title="Squirrly SEO Success for WordPress Users" href="https://www.squirrly.co/successful/">Success Stories Who Followed Squirrly's Advice.</a>
50
 
141
 
142
  Why? Because the old way of doing things is no longer relevant to how search engines work today. Because Google does NOT perceive your pages as being all the same.
143
 
144
+ There is no "one size fits all" in SEO, so using an SEO plugin that treats all pages the same way is dangerous for your business.
145
 
146
  It's like applying a random treatment regardless of the symptoms, just because it had worked once (in another case) for another patient. Would YOU put your faith in that?
147
 
406
  Squirrly SEO 10.0.0 it's a big update. We've re-designed the UX and added many new features. If you don't want to change the current experience you have with Squirrly you can remain on the current stable version of Squirrly SEO.
407
 
408
  == Changelog ==
409
+ = 10.0.10 - 06/18/2020 =
410
+ * Fixed - Focus Page Words Count
411
+ * Fixed - Focus Page SEO Image
412
+ * Fixed - Goals tasks for SEO Image, SEO in METAs, Robots and Sitemap
413
+ * Fixed - Google charts error Uncaught TypeError: Cannot read property 'arrayToDataTable' of undefined
414
+ * Fixed - Load Squirrly.js in body for Live Assistant
415
+
416
+ = 10.0.09 - 06/15/2020 =
417
+ * Update - SEO compatible with WP 5.4.2
418
+ * Update - Compatible with Custom Post Slug plugin
419
+ * Update - Compatible with Hummingbird plugin and Cachify plugin
420
+ * Update - Added Inspect URL option on each Focus Page and Audit Page
421
+ * Update - Added help in Focus Page > Add new page
422
+ * Fixed - Small CSS issues
423
+
424
+ = 10.0.08 - 06/08/2020 =
425
+ * Update - Right To Left (RTL) Support in Squirrly SEO
426
+ * Update - Reduce the plugin archive size by removing dev files
427
+ * Fixed - Show the Goals on first load without ajax
428
+ * Fixed - Remove sq_nonce duplicate ids in HTML
429
+ * Fixed - Iconv error if the PHP iconv extension is not installed
430
+ * Fixed - Remove the bootstra map link from js
431
+ * Fixed - The CSS bor both RTL and LTR support
432
+ * Fixed CSS for Dashboard when the offer is visible
433
+
434
  = 10.0.06 - 06/01/2020 =
435
  * Update - Inspect URL when the Audit can't be made
436
  * Update - Add all the Features Categories in the Overview
682
  * Update - Platform SEO task description
683
  * Update - Import Keywords from CSV
684
  * Update - Add the option in SEO Settings > Tracking to load the tracking codes only for visitors
685
+ * Fix - Parse error: syntax error, unexpected Sitemaps.php on line 476
686
  * Fix - Responsive assistant view for pads and tiny desktops
687
  * Fix - Keyword in Bulk SEO
688
  * Fix - Don't inport the Journey Date
895
  * SEO Update - Facebook Pixel amazing updates to control, tracking, and event-based actions
896
  * SEO Update - Rich Pins updates for WooCommerce based Pinterest profiles and Pinterest posts
897
  * SEO Update - more schema and json-ld updates
898
+ * SEO Update - Custom Sidebars - Dynamic Widget Area Manager compatibility
899
 
900
  = 8.3.14 - 03/19/2018 =
901
  * SEO Update - Add a new pattern {{post_description}} to get only the description from Post Content
946
  * SEO Update - Link Checker works to improve compatibility
947
  * SEO Update - Open Graph for Facebook, Google+ and Twitter Card Tags
948
  * SEO Update - Open Graph for Facebook, Google+ and Twitter Card Tags plugin works
949
+ * SEO Update - WordPress Share Buttons Plugin - AddThis compatiblity
950
  * SEO Update - Social Media Share Buttons & Social Sharing Icons works
951
  * SEO Update - AddToAny Share Buttons compatibility
952
 
958
  * SEO Update - Contact Widgets works
959
  * SEO Update - Social Icons compatible
960
  * SEO Update - OG
961
+ * SEO Update - Wordfence Security - Firewall & Malware Scan compatible
962
  * SEO Update - Google Analytics Dashboard for WP (GADWP) compatible
963
  * SEO Update - Jetpack by WordPress.com backups and imports
964
  * SEO Update - Elementor Page Builder compatible
965
  * SEO Update - Elementor Page Builder SEO Live Assistant now checks it better
966
+ * SEO Update - Ninja Forms - The Easy and Powerful Forms Builder compatibility
967
 
968
  = 8.3.08 - 02/15/2018 =
969
  * SEO Update - Update the article:tag Meta for Facebook Open Graph (SEO update)
983
  * SEO Update - WooCommerce PayPal Express Checkout Payment Gateway compatible
984
  * SEO Update - All In One SEO Pack backup data and imports
985
  * SEO Update - Nextend Social Login and Register (Facebook, Google, Twitter) compatible
986
+ * SEO Update - Revive Old Posts - Auto Post to Social Media compatible
987
  * SEO Update - WP to Twitter
988
 
989
  = 8.3.06 - 02/09/2018 =
1079
  * SEO Fix - Fixed the Doublin Core name error on line 29
1080
  * Squirrly SEO is now compatible with WP 4.8.3
1081
 
1082
+ = 8.2.20 - 11/02/2017 =
1083
  * SEO Fix - Fixed the Excerpt Only patterh
1084
  * SEO Fix - Fixed Squirrly Snippet in case is empty or has special chars
1085
 
1086
+ = 8.2.19 - 10/30/2017 =
1087
  * SEO Update - Update Squirrly Live Assistant to use less resources and work faster
1088
  * SEO Update - Added the Post Publish option in Squirrly Split Window
1089
  * SEO Fix - Fixed Greeck keywords optimization fixed
1090
  * SEO Fix - Fixed the Keyword Research not to display the error message and to be able to redo the search
1091
  * SEO Fix - Fixed the Squirrly Snippet's Title snd Description when using special chars
1092
 
1093
+ = 8.2.18 - 10/27/2017 =
1094
  * SEO Update - Update compatibility with Polylang plugin
1095
  * SEO Fix - Increased connection time with out API in case of slow internet access
1096
  * SEO Fix - Fixed the yellow highlight in frontend
1097
  * SEO Fix - Fixed Squirrly SLA loading in post edit
1098
  * SEO Fix - Fixed small bugs with article optimization in my.squirrly.co
1099
 
1100
+ = 8.2.17 - 10/24/2017 =
1101
  * SEO Fix - Fixed the SLA loading issue for older WP versions
1102
  * SEO Fix - Fixed the Keyword one letter when loading a new post/page
1103
  * SEO Fix - Corrected the Facebook App ID
1104
 
1105
+ = 8.2.15 - 10/18/2017 =
1106
  * SEO Update - Increased the loading speed for favicon.icon and robots.txt
1107
  * SEO Update - Update the SEO Audit with the latest METAs
1108
  * SEO Update - Register the Subservers for WP Multisite
1110
  * SEO Fix - Fixed the Squirrly Snippet in frontend in case the js and css are not loading
1111
  * SEO Fix - Show error message in case SLA is not loading
1112
 
1113
+ = 8.2.14 - 10/12/2017 =
1114
  * SEO Fix - Fixed compatibility with Beaver Builder
1115
  * SEO Fix - Increased security on SEO restore in Import SEO section
1116
 
1117
+ = 8.2.13 - 10/11/2017 =
1118
  * SEO Fix - Fixed the snippet preview in case some features are disabled
1119
  * SEO Fix - Fixed the Title and Description Lenght in Frontend
1120
  * SEO Fix - Added the option to import the old SEO settings from Squirrly SEO
1121
 
1122
+ = 8.2.11 - 10/10/2017 =
1123
  * SEO Fix - Fixed remove meta from Elementor
1124
  * SEO Fix - Fixed small bugs for Squirrly Split Window
1125
 
1126
+ = 8.2.10 - 10/10/2017 =
1127
  * SEO Update - Launching Squirrly 2018 Steve
1128
  * See all the new features here: https://howto.squirrly.co/kb/slides/
1129
 
1130
+ = 8.0.5 - 08/14/2017 =
1131
  * SEO Fix - Fixed HTTPS jquery load in sitemap.xml
1132
  * SEO Squirrly is compatible with WP 4.8.1
1133
 
1134
+ = 8.0.4 - 07/24/2017 =
1135
  * SEO Fix - Fixed minor bugs
1136
  * SEO Fix - Fixed loading https classes in SSL backend
1137
 
1138
+ = 8.0.2 - 05/20/2017 =
1139
  * SEO Update - Update the JSON-LD with the last update from google
1140
  * Squirrly SEO is compatible with WP 4.8
1141
 
squirrly.php CHANGED
@@ -8,7 +8,7 @@
8
  * Description: SEO By Squirrly is for the NON-SEO experts. Get Excellent Seo with Better Content, Ranking and Analytics. For Both Humans and Search Bots.<BR> <a href="http://cloud.squirrly.co/user" target="_blank"><strong>Check your profile</strong></a>
9
  * Author: Squirrly SEO
10
  * Author URI: https://plugin.squirrly.co
11
- * Version: 10.0.06
12
  * License: GPLv2 or later
13
  * License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
14
  * Text Domain: squirrly-seo
@@ -16,9 +16,9 @@
16
  */
17
  if (!defined('SQ_VERSION')) {
18
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
19
- define('SQ_VERSION', '10.0.06');
20
  //The last stable version
21
- define('SQ_STABLE_VERSION', '10.0.04');
22
  // Call config files
23
  try {
24
  require_once(dirname(__FILE__) . '/config/config.php');
8
  * Description: SEO By Squirrly is for the NON-SEO experts. Get Excellent Seo with Better Content, Ranking and Analytics. For Both Humans and Search Bots.<BR> <a href="http://cloud.squirrly.co/user" target="_blank"><strong>Check your profile</strong></a>
9
  * Author: Squirrly SEO
10
  * Author URI: https://plugin.squirrly.co
11
+ * Version: 10.0.10
12
  * License: GPLv2 or later
13
  * License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
14
  * Text Domain: squirrly-seo
16
  */
17
  if (!defined('SQ_VERSION')) {
18
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
19
+ define('SQ_VERSION', '10.0.10');
20
  //The last stable version
21
+ define('SQ_STABLE_VERSION', '10.0.06');
22
  // Call config files
23
  try {
24
  require_once(dirname(__FILE__) . '/config/config.php');
view/Assistant/Assistant.php CHANGED
@@ -26,7 +26,7 @@
26
  <div class="col-sm-12 my-3 p-0 text-right">
27
  <?php if (current_user_can('sq_manage_snippet')) { ?>
28
  <form method="POST">
29
- <?php wp_nonce_field('sq_create_demo', 'sq_nonce'); ?>
30
  <input type="hidden" name="action" value="sq_create_demo"/>
31
  <button type="submit" class="btn rounded-0 btn-green btn-lg px-5 mx-4" style="min-width: 300px"><?php _e('Practice/Test Round', _SQ_PLUGIN_NAME_); ?></button>
32
  </form>
26
  <div class="col-sm-12 my-3 p-0 text-right">
27
  <?php if (current_user_can('sq_manage_snippet')) { ?>
28
  <form method="POST">
29
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_create_demo', 'sq_nonce'); ?>
30
  <input type="hidden" name="action" value="sq_create_demo"/>
31
  <button type="submit" class="btn rounded-0 btn-green btn-lg px-5 mx-4" style="min-width: 300px"><?php _e('Practice/Test Round', _SQ_PLUGIN_NAME_); ?></button>
32
  </form>
view/Assistant/Settings.php CHANGED
@@ -13,7 +13,7 @@
13
  <div class="flex-grow-1 mr-3 sq_flex">
14
  <?php do_action('sq_form_notices'); ?>
15
  <form method="POST">
16
- <?php wp_nonce_field('sq_settings_assistant', 'sq_nonce'); ?>
17
  <input type="hidden" name="action" value="sq_settings_assistant"/>
18
 
19
  <div class="card col-sm-12 p-0">
13
  <div class="flex-grow-1 mr-3 sq_flex">
14
  <?php do_action('sq_form_notices'); ?>
15
  <form method="POST">
16
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_settings_assistant', 'sq_nonce'); ?>
17
  <input type="hidden" name="action" value="sq_settings_assistant"/>
18
 
19
  <div class="card col-sm-12 p-0">
view/Audits/Addpage.php CHANGED
@@ -161,7 +161,7 @@
161
  <td style="width: 140px; text-align: center; vertical-align: middle">
162
  <?php if (!$active) { ?>
163
  <form method="post" class="p-0 m-0">
164
- <?php wp_nonce_field('sq_audits_addnew', 'sq_nonce'); ?>
165
  <input type="hidden" name="action" value="sq_audits_addnew"/>
166
 
167
  <input type="hidden" name="url" value="<?php echo $post->url; ?>">
161
  <td style="width: 140px; text-align: center; vertical-align: middle">
162
  <?php if (!$active) { ?>
163
  <form method="post" class="p-0 m-0">
164
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_audits_addnew', 'sq_nonce'); ?>
165
  <input type="hidden" name="action" value="sq_audits_addnew"/>
166
 
167
  <input type="hidden" name="url" value="<?php echo $post->url; ?>">
view/Audits/Audit.php CHANGED
@@ -124,7 +124,7 @@
124
  <td rowspan="2" class="sq_first_header_column text-center">
125
  <span class="<?php echo ((int)$task->complete == 1) ? 'sq_audit_tasks_pass' : 'sq_audit_tasks_fail' ?>"></span>
126
  </td>
127
- <td style="vertical-align: middle" class="sq_second_header_column">
128
  <span class="sq_audit_tasks_title"><?php echo $task->title ?></span>
129
  <span class="sq_audit_tasks_value sq_audit_tasks_value<?php echo ((int)$task->complete == 1) ? '_pass' : '_fail' ?>">
130
  <?php echo ($task->complete) ? $task->success : $task->fail ?>
124
  <td rowspan="2" class="sq_first_header_column text-center">
125
  <span class="<?php echo ((int)$task->complete == 1) ? 'sq_audit_tasks_pass' : 'sq_audit_tasks_fail' ?>"></span>
126
  </td>
127
+ <td style="vertical-align: middle" class="sq_second_header_column text-left">
128
  <span class="sq_audit_tasks_title"><?php echo $task->title ?></span>
129
  <span class="sq_audit_tasks_value sq_audit_tasks_value<?php echo ((int)$task->complete == 1) ? '_pass' : '_fail' ?>">
130
  <?php echo ($task->complete) ? $task->success : $task->fail ?>
view/Audits/AuditPageRow.php CHANGED
@@ -62,8 +62,8 @@ if (strtotime($view->auditpage->audit_datetime)) {
62
  <div class="sq_sm_dropdown">
63
  <ul class="p-2 m-0 text-left">
64
  <li class="m-0 p-1 py-2">
65
- <form method="post" class="p-0 m-0">
66
- <?php wp_nonce_field('sq_audits_delete', 'sq_nonce'); ?>
67
  <input type="hidden" name="action" value="sq_audits_delete"/>
68
  <input type="hidden" name="id" value="<?php echo $view->auditpage->user_post_id ?>"/>
69
  <i class="sq_icons_small fa fa-trash-o" style="padding: 2px"></i>
@@ -72,6 +72,10 @@ if (strtotime($view->auditpage->audit_datetime)) {
72
  </button>
73
  </form>
74
  </li>
 
 
 
 
75
  </ul>
76
  </div>
77
  </div>
62
  <div class="sq_sm_dropdown">
63
  <ul class="p-2 m-0 text-left">
64
  <li class="m-0 p-1 py-2">
65
+ <form method="post" class="p-0 m-0" onSubmit="return confirm('<?php echo __('Do you want to delete the Audit Page?',_SQ_ASSETS_URL_) ?>') ">
66
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_audits_delete', 'sq_nonce'); ?>
67
  <input type="hidden" name="action" value="sq_audits_delete"/>
68
  <input type="hidden" name="id" value="<?php echo $view->auditpage->user_post_id ?>"/>
69
  <i class="sq_icons_small fa fa-trash-o" style="padding: 2px"></i>
72
  </button>
73
  </form>
74
  </li>
75
+ <li class="m-0 p-1 py-2">
76
+ <i class="sq_icons_small fa fa-info-circle" style="padding: 2px"></i>
77
+ <button class="btn btn-sm bg-transparent p-0 m-0" onclick="jQuery('#sq_previewurl_modal').attr('data-post_id', '<?php echo $view->auditpage->user_post_id ?>'); jQuery('#sq_previewurl_modal').sq_inspectURL()" data-dismiss="modal"><?php _e('Inspect URL', _SQ_PLUGIN_NAME_); ?></button>
78
+ </li>
79
  </ul>
80
  </div>
81
  </div>
view/Audits/AuditStats.php CHANGED
@@ -71,7 +71,7 @@
71
  <span class="text-danger"><?php echo $audit_timestamp ?></span>
72
  </div>
73
  <form method="post" class="sq_auditpages_request p-0 m-0">
74
- <?php wp_nonce_field('sq_audits_update', 'sq_nonce'); ?>
75
  <input type="hidden" name="action" value="sq_audits_update"/>
76
  <button type="submit" class="btn btn-sm bg-warning text-white inline p-0 px-2 m-0" <?php if ($call_timestamp > time() - 3600) {
77
  echo 'disabled="disabled"' . ' title="' . __('You can refresh the audit once every hour', _SQ_PLUGIN_NAME_) . '"';
@@ -95,7 +95,7 @@
95
  <?php echo __('Audit not ready yet', _SQ_PLUGIN_NAME_) ?>
96
  </div>
97
  <form method="post" class="sq_auditpages_request p-0 m-0">
98
- <?php wp_nonce_field('sq_audits_update', 'sq_nonce'); ?>
99
  <input type="hidden" name="action" value="sq_audits_update"/>
100
  <button type="submit" class="btn btn-sm bg-warning text-white inline p-0 px-2 m-0" <?php if ($call_timestamp > time() - 3600) {
101
  echo 'disabled="disabled"' . ' title="' . __('You can refresh the audit once every hour', _SQ_PLUGIN_NAME_) . '"';
@@ -171,9 +171,13 @@
171
  <div class="media-right py-3 media-middle ">
172
  <div class="col-sm-12 px-0">
173
  <div id="sq_chart_score" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
174
- <script>jQuery(document).ready(function () {
175
- drawScoreChart("sq_chart_score", <?php echo json_encode($scores) ?> , false);
176
- }); </script>
 
 
 
 
177
  </div>
178
  </div>
179
  </div>
71
  <span class="text-danger"><?php echo $audit_timestamp ?></span>
72
  </div>
73
  <form method="post" class="sq_auditpages_request p-0 m-0">
74
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_audits_update', 'sq_nonce'); ?>
75
  <input type="hidden" name="action" value="sq_audits_update"/>
76
  <button type="submit" class="btn btn-sm bg-warning text-white inline p-0 px-2 m-0" <?php if ($call_timestamp > time() - 3600) {
77
  echo 'disabled="disabled"' . ' title="' . __('You can refresh the audit once every hour', _SQ_PLUGIN_NAME_) . '"';
95
  <?php echo __('Audit not ready yet', _SQ_PLUGIN_NAME_) ?>
96
  </div>
97
  <form method="post" class="sq_auditpages_request p-0 m-0">
98
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_audits_update', 'sq_nonce'); ?>
99
  <input type="hidden" name="action" value="sq_audits_update"/>
100
  <button type="submit" class="btn btn-sm bg-warning text-white inline p-0 px-2 m-0" <?php if ($call_timestamp > time() - 3600) {
101
  echo 'disabled="disabled"' . ' title="' . __('You can refresh the audit once every hour', _SQ_PLUGIN_NAME_) . '"';
171
  <div class="media-right py-3 media-middle ">
172
  <div class="col-sm-12 px-0">
173
  <div id="sq_chart_score" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
174
+ <script>
175
+ if (typeof google !== 'undefined') {
176
+ google.setOnLoadCallback(function () {
177
+ drawScoreChart("sq_chart_score", <?php echo json_encode($scores) ?> , false);
178
+ });
179
+ }
180
+ </script>
181
  </div>
182
  </div>
183
  </div>
view/Audits/Audits.php CHANGED
@@ -51,7 +51,14 @@
51
 
52
  <div class="card col-sm-12 border-0 m-0 p-0">
53
  <div class="sq_auditpages_content">
54
- <?php echo iconv('UTF-8', 'UTF-8//IGNORE', $view->getView('Audits/AuditPages')); ?> </div>
 
 
 
 
 
 
 
55
  </div>
56
 
57
  <div class="card-body">
51
 
52
  <div class="card col-sm-12 border-0 m-0 p-0">
53
  <div class="sq_auditpages_content">
54
+ <?php
55
+ $content = $view->getView('Audits/AuditPages');
56
+ if (function_exists('iconv')) {
57
+ $content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
58
+ }
59
+ echo $content;
60
+ ?>
61
+ </div>
62
  </div>
63
 
64
  <div class="card-body">
view/Audits/Compare.php CHANGED
@@ -50,7 +50,7 @@
50
  <table>
51
  <tr>
52
 
53
- <td style="vertical-align: middle" class="sq_second_header_column px-3">
54
  <span class="sq_audit_tasks_title"><?php echo __('Scores') ?></span>
55
  </td>
56
 
@@ -122,7 +122,7 @@
122
  <table>
123
  <tr>
124
 
125
- <td style="vertical-align: middle" class="sq_second_header_column px-3">
126
  <span class="sq_audit_tasks_title"><?php echo $task->title ?></span>
127
  </td>
128
 
@@ -149,7 +149,7 @@
149
  <h4 style="display: none"><?php echo $audit_task->title ?></h4>
150
  <div class="description" style="display: none">
151
  <div class="sq_audit_tasks_row">
152
- <div class="sq_audit_tasks_title"><?php echo $audit_task->title ?>
153
  <span class="sq_audit_tasks_value sq_audit_tasks_value<?php echo ((int)$audit_task->complete == 1) ? '_pass' : '_fail' ?>">
154
  <?php echo ($audit_task->complete) ? $audit_task->success : $audit_task->fail ?>
155
  </span>
50
  <table>
51
  <tr>
52
 
53
+ <td style="vertical-align: middle" class="sq_second_header_column px-3 text-left">
54
  <span class="sq_audit_tasks_title"><?php echo __('Scores') ?></span>
55
  </td>
56
 
122
  <table>
123
  <tr>
124
 
125
+ <td style="vertical-align: middle" class="sq_second_header_column px-3 text-left">
126
  <span class="sq_audit_tasks_title"><?php echo $task->title ?></span>
127
  </td>
128
 
149
  <h4 style="display: none"><?php echo $audit_task->title ?></h4>
150
  <div class="description" style="display: none">
151
  <div class="sq_audit_tasks_row">
152
+ <div class="sq_audit_tasks_title text-left"><?php echo $audit_task->title ?>
153
  <span class="sq_audit_tasks_value sq_audit_tasks_value<?php echo ((int)$audit_task->complete == 1) ? '_pass' : '_fail' ?>">
154
  <?php echo ($audit_task->complete) ? $audit_task->success : $audit_task->fail ?>
155
  </span>
view/Audits/Settings.php CHANGED
@@ -18,7 +18,7 @@
18
 
19
  <form method="POST">
20
  <?php do_action('sq_form_notices'); ?>
21
- <?php wp_nonce_field('sq_audits_settings', 'sq_nonce'); ?>
22
  <input type="hidden" name="action" value="sq_audits_settings"/>
23
 
24
  <div class="card col-sm-12 p-0">
18
 
19
  <form method="POST">
20
  <?php do_action('sq_form_notices'); ?>
21
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_audits_settings', 'sq_nonce'); ?>
22
  <input type="hidden" name="action" value="sq_audits_settings"/>
23
 
24
  <div class="card col-sm-12 p-0">
view/Blocks/Connect.php CHANGED
@@ -7,7 +7,7 @@
7
  <?php if (!SQ_Classes_Helpers_Tools::getOption('sq_cloud_connect')) { ?>
8
 
9
  <li class="sq_task row border-0" style="cursor: default">
10
- <?php wp_nonce_field('sq_cloud_connect', 'sq_nonce'); ?>
11
  <input type="hidden" name="action" value="sq_cloud_connect"/>
12
  <i class="fa fa-check" title="ssss" data-original-title=""></i>
13
  <div class="message" style="display: none"></div>
@@ -21,7 +21,7 @@
21
  <?php } else { ?>
22
 
23
  <li class="sq_task row completed border-0" style="cursor: default">
24
- <?php wp_nonce_field('sq_cloud_disconnect', 'sq_nonce'); ?>
25
  <input type="hidden" name="action" value="sq_cloud_disconnect"/>
26
  <i class="fa fa-check" title="" data-original-title=""></i>
27
  <div class="message" style="display: none"></div>
7
  <?php if (!SQ_Classes_Helpers_Tools::getOption('sq_cloud_connect')) { ?>
8
 
9
  <li class="sq_task row border-0" style="cursor: default">
10
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_cloud_connect', 'sq_nonce'); ?>
11
  <input type="hidden" name="action" value="sq_cloud_connect"/>
12
  <i class="fa fa-check" title="ssss" data-original-title=""></i>
13
  <div class="message" style="display: none"></div>
21
  <?php } else { ?>
22
 
23
  <li class="sq_task row completed border-0" style="cursor: default">
24
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_cloud_disconnect', 'sq_nonce'); ?>
25
  <input type="hidden" name="action" value="sq_cloud_disconnect"/>
26
  <i class="fa fa-check" title="" data-original-title=""></i>
27
  <div class="message" style="display: none"></div>
view/Blocks/Dashboard.php CHANGED
@@ -3,6 +3,13 @@ $tasks_completed = SQ_Classes_ObjController::getClass('SQ_Controllers_CheckSeo')
3
  $tasks_incompleted = SQ_Classes_ObjController::getClass('SQ_Controllers_CheckSeo')->getNotifications();
4
  ?>
5
  <style>
 
 
 
 
 
 
 
6
  #sq_dashboard_content {
7
  min-height: 150px;
8
  }
3
  $tasks_incompleted = SQ_Classes_ObjController::getClass('SQ_Controllers_CheckSeo')->getNotifications();
4
  ?>
5
  <style>
6
+ .sq_offer{
7
+ color: #721c24;
8
+ background-color: #f8d7da;
9
+ border-color: #f5c6cb;
10
+ padding: 7px;
11
+ margin-bottom: 15px;
12
+ }
13
  #sq_dashboard_content {
14
  min-height: 150px;
15
  }
view/Blocks/Features.php CHANGED
@@ -286,7 +286,7 @@ $features = array(
286
  </div>
287
  <div class="my-2 text-black-50" style="min-height: 70px"><?php echo $feature['description'] ?></div>
288
  <div class="row my-2 px-3">
289
- <div class="col-sm-6 p-0">
290
  <a href="<?php echo $feature['link'] ?>" target="_blank">
291
  <?php if ($feature['option'] === 'na') { ?>
292
  <strong class="text-info"><?php echo __('Go to feature', _SQ_PLUGIN_NAME_) ?></strong>
286
  </div>
287
  <div class="my-2 text-black-50" style="min-height: 70px"><?php echo $feature['description'] ?></div>
288
  <div class="row my-2 px-3">
289
+ <div class="col-sm-6 p-0 text-left">
290
  <a href="<?php echo $feature['link'] ?>" target="_blank">
291
  <?php if ($feature['option'] === 'na') { ?>
292
  <strong class="text-info"><?php echo __('Go to feature', _SQ_PLUGIN_NAME_) ?></strong>
view/Blocks/Jorney.php CHANGED
@@ -49,7 +49,7 @@
49
  <em class="text-black-50"><?php echo __("If you missed a day, click on it and read the SEO recipe for it.", _SQ_PLUGIN_NAME_); ?></em>
50
  <div class="small text-center my-2">
51
  <form method="post" class="p-0 m-0">
52
- <?php wp_nonce_field('sq_journey_close', 'sq_nonce'); ?>
53
  <input type="hidden" name="action" value="sq_journey_close"/>
54
  <button type="submit" class="btn btn-sm text-info btn-link bg-transparent p-0 m-0">
55
  <?php echo __("I'm all done. Hide this block.", _SQ_PLUGIN_NAME_) ?>
49
  <em class="text-black-50"><?php echo __("If you missed a day, click on it and read the SEO recipe for it.", _SQ_PLUGIN_NAME_); ?></em>
50
  <div class="small text-center my-2">
51
  <form method="post" class="p-0 m-0">
52
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_journey_close', 'sq_nonce'); ?>
53
  <input type="hidden" name="action" value="sq_journey_close"/>
54
  <button type="submit" class="btn btn-sm text-info btn-link bg-transparent p-0 m-0">
55
  <?php echo __("I'm all done. Hide this block.", _SQ_PLUGIN_NAME_) ?>
view/Blocks/KnowledgeBase.php CHANGED
@@ -12,17 +12,17 @@
12
  <?php if ($page == 'sq_dashboard') { ?>
13
  <ul class="list-group list-group-flush">
14
  <?php if (SQ_Classes_Helpers_Tools::getOption('sq_api') == '') { ?>
15
- <li class="list-group-item">
16
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#connect_to_cloud" target="_blank">Why do I need to connect to Squirrly Cloud?</a>
17
  </li>
18
- <li class="list-group-item">
19
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#connect_to_cloud" target="_blank">How to connect to Squirrly Cloud.</a>
20
  </li>
21
  <?php } ?>
22
- <li class="list-group-item">
23
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#import_seo" target="_blank">How to Import SEO from other SEO plugins.</a>
24
  </li>
25
- <li class="list-group-item">
26
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#top_10_race" target="_blank">How to get on TOP 10 Google?</a>
27
  </li>
28
  </ul>
@@ -31,22 +31,22 @@
31
  <?php } ?>
32
  <?php if ($page == 'sq_research') { ?>
33
  <ul class="list-group list-group-flush">
34
- <li class="list-group-item">
35
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#find_new_keywords" target="_blank">How to do a Keyword Research.</a>
36
  </li>
37
- <li class="list-group-item">
38
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#find_new_keywords" target="_blank">How to do a Keyword Research.</a>
39
  </li>
40
- <li class="list-group-item">
41
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_add_keyword" target="_blank">How to add Keywords into Briefcase.</a>
42
  </li>
43
- <li class="list-group-item">
44
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_label" target="_blank">How to add Labels to Keywords.</a>
45
  </li>
46
- <li class="list-group-item">
47
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_optimize_sla" target="_blank">How to optimize a post with Briefcase.</a>
48
  </li>
49
- <li class="list-group-item">
50
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_backup_keywords" target="_blank">How to backup/restore Briefcase Keywords.</a>
51
  </li>
52
  </ul>
@@ -55,16 +55,16 @@
55
  <?php } ?>
56
  <?php if ($page == 'sq_assistant') { ?>
57
  <ul class="list-group list-group-flush">
58
- <li class="list-group-item">
59
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#all_tasks_green" target="_blank">How to 100% optimize a post, page or product with Squirrly Live Assistant.</a>
60
  </li>
61
- <li class="list-group-item">
62
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#add_keyword" target="_blank">How to add Copyright Free Images.</a>
63
  </li>
64
- <li class="list-group-item">
65
  <a href="https://howto.squirrly.co/faq/why-is-the-squirrly-live-assistant-not-loading-in-the-post-editor/" target="_blank">Squirrly Live Assistant not showing.</a>
66
  </li>
67
- <li class="list-group-item">
68
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#after_optimization" target="_blank">What to do after I optimize a post.</a>
69
  </li>
70
  </ul>
@@ -73,13 +73,13 @@
73
  <?php } ?>
74
  <?php if ($page == 'sq_seosettings') { ?>
75
  <ul class="list-group list-group-flush">
76
- <li class="list-group-item">
77
  <a href="https://howto.squirrly.co/kb/seo-automation/" target="_blank">How to set the SEO in just 2 minutes.</a>
78
  </li>
79
- <li class="list-group-item">
80
  <a href="https://howto.squirrly.co/kb/bulk-seo/#bulk_seo_snippet_og" target="_blank">How to optimize Social Media for each post.</a>
81
  </li>
82
- <li class="list-group-item">
83
  <a href="https://howto.squirrly.co/kb/bulk-seo/#bulk_seo_snippet_jsonld" target="_blank">How to activate Rich Snippets for Google.</a>
84
  </li>
85
  </ul>
@@ -88,16 +88,16 @@
88
  <?php } ?>
89
  <?php if ($page == 'sq_focuspages') { ?>
90
  <ul class="list-group list-group-flush">
91
- <li class="list-group-item">
92
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#add_new_focus_page" target="_blank">How to add a New Focus Page.</a>
93
  </li>
94
- <li class="list-group-item">
95
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#remove_focus_page" target="_blank">How to remove a Focus Page.</a>
96
  </li>
97
- <li class="list-group-item">
98
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#chance_to_rank" target="_blank">What is Chance to Rank.</a>
99
  </li>
100
- <li class="list-group-item">
101
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#keyword" target="_blank">How to add a keyword in a Focus Page.</a>
102
  </li>
103
  </ul>
@@ -106,19 +106,19 @@
106
  <?php } ?>
107
  <?php if ($page == 'sq_audits') { ?>
108
  <ul class="list-group list-group-flush">
109
- <li class="list-group-item">
110
  <a href="https://howto.squirrly.co/kb/seo-audit/#how_seo_audit_works" target="_blank">How does the Audit work?</a>
111
  </li>
112
- <li class="list-group-item">
113
  <a href="https://howto.squirrly.co/kb/seo-audit/" target="_blank">How to add a Page in Audits.</a>
114
  </li>
115
- <li class="list-group-item">
116
  <a href="https://howto.squirrly.co/kb/seo-audit/" target="_blank">How to remove a page from Audits.</a>
117
  </li>
118
- <li class="list-group-item">
119
  <a href="https://howto.squirrly.co/kb/seo-audit/#google_search_console" target="_blank">Connect to Google Search Console.</a>
120
  </li>
121
- <li class="list-group-item">
122
  <a href="https://howto.squirrly.co/kb/seo-audit/#google_analytics" target="_blank">Connect to Google Analytics.</a>
123
  </li>
124
  </ul>
@@ -127,16 +127,16 @@
127
  <?php } ?>
128
  <?php if ($page == 'sq_rankings') { ?>
129
  <ul class="list-group list-group-flush">
130
- <li class="list-group-item">
131
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#add_keyword_ranking" target="_blank">How to add a Keyword in Rankings.</a>
132
  </li>
133
- <li class="list-group-item">
134
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#remove_keyword_ranking" target="_blank">How to remove a keyword from Rankings.</a>
135
  </li>
136
- <li class="list-group-item">
137
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#check_keyword_information" target="_blank">Check the Keyword Impressions, Clicks and Optimization.</a>
138
  </li>
139
- <li class="list-group-item">
140
  <a href="https://fourhourseo.com/why-does-neil-patel-use-squirrly-seo-for-every-blog-post-that-he-publishes/" target="_blank">Why Does Neil Patel Use Squirrly SEO For Every Blog Post that He Publishes?</a>
141
  </li>
142
  </ul>
12
  <?php if ($page == 'sq_dashboard') { ?>
13
  <ul class="list-group list-group-flush">
14
  <?php if (SQ_Classes_Helpers_Tools::getOption('sq_api') == '') { ?>
15
+ <li class="list-group-item text-left">
16
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#connect_to_cloud" target="_blank">Why do I need to connect to Squirrly Cloud?</a>
17
  </li>
18
+ <li class="list-group-item" text-left>
19
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#connect_to_cloud" target="_blank">How to connect to Squirrly Cloud.</a>
20
  </li>
21
  <?php } ?>
22
+ <li class="list-group-item text-left">
23
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#import_seo" target="_blank">How to Import SEO from other SEO plugins.</a>
24
  </li>
25
+ <li class="list-group-item text-left">
26
  <a href="https://howto.squirrly.co/kb/install-squirrly-seo-plugin/#top_10_race" target="_blank">How to get on TOP 10 Google?</a>
27
  </li>
28
  </ul>
31
  <?php } ?>
32
  <?php if ($page == 'sq_research') { ?>
33
  <ul class="list-group list-group-flush">
34
+ <li class="list-group-item text-left">
35
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#find_new_keywords" target="_blank">How to do a Keyword Research.</a>
36
  </li>
37
+ <li class="list-group-item text-left">
38
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#find_new_keywords" target="_blank">How to do a Keyword Research.</a>
39
  </li>
40
+ <li class="list-group-item text-left">
41
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_add_keyword" target="_blank">How to add Keywords into Briefcase.</a>
42
  </li>
43
+ <li class="list-group-item text-left">
44
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_label" target="_blank">How to add Labels to Keywords.</a>
45
  </li>
46
+ <li class="list-group-item text-left">
47
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_optimize_sla" target="_blank">How to optimize a post with Briefcase.</a>
48
  </li>
49
+ <li class="list-group-item text-left">
50
  <a href="https://howto.squirrly.co/kb/keyword-research-and-seo-strategy/#briefcase_backup_keywords" target="_blank">How to backup/restore Briefcase Keywords.</a>
51
  </li>
52
  </ul>
55
  <?php } ?>
56
  <?php if ($page == 'sq_assistant') { ?>
57
  <ul class="list-group list-group-flush">
58
+ <li class="list-group-item text-left">
59
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#all_tasks_green" target="_blank">How to 100% optimize a post, page or product with Squirrly Live Assistant.</a>
60
  </li>
61
+ <li class="list-group-item text-left">
62
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#add_keyword" target="_blank">How to add Copyright Free Images.</a>
63
  </li>
64
+ <li class="list-group-item text-left">
65
  <a href="https://howto.squirrly.co/faq/why-is-the-squirrly-live-assistant-not-loading-in-the-post-editor/" target="_blank">Squirrly Live Assistant not showing.</a>
66
  </li>
67
+ <li class="list-group-item text-left">
68
  <a href="https://howto.squirrly.co/kb/squirrly-live-assistant/#after_optimization" target="_blank">What to do after I optimize a post.</a>
69
  </li>
70
  </ul>
73
  <?php } ?>
74
  <?php if ($page == 'sq_seosettings') { ?>
75
  <ul class="list-group list-group-flush">
76
+ <li class="list-group-item text-left">
77
  <a href="https://howto.squirrly.co/kb/seo-automation/" target="_blank">How to set the SEO in just 2 minutes.</a>
78
  </li>
79
+ <li class="list-group-item text-left">
80
  <a href="https://howto.squirrly.co/kb/bulk-seo/#bulk_seo_snippet_og" target="_blank">How to optimize Social Media for each post.</a>
81
  </li>
82
+ <li class="list-group-item text-left">
83
  <a href="https://howto.squirrly.co/kb/bulk-seo/#bulk_seo_snippet_jsonld" target="_blank">How to activate Rich Snippets for Google.</a>
84
  </li>
85
  </ul>
88
  <?php } ?>
89
  <?php if ($page == 'sq_focuspages') { ?>
90
  <ul class="list-group list-group-flush">
91
+ <li class="list-group-item text-left">
92
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#add_new_focus_page" target="_blank">How to add a New Focus Page.</a>
93
  </li>
94
+ <li class="list-group-item text-left">
95
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#remove_focus_page" target="_blank">How to remove a Focus Page.</a>
96
  </li>
97
+ <li class="list-group-item text-left">
98
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#chance_to_rank" target="_blank">What is Chance to Rank.</a>
99
  </li>
100
+ <li class="list-group-item text-left">
101
  <a href="https://howto.squirrly.co/kb/focus-pages-page-audits/#keyword" target="_blank">How to add a keyword in a Focus Page.</a>
102
  </li>
103
  </ul>
106
  <?php } ?>
107
  <?php if ($page == 'sq_audits') { ?>
108
  <ul class="list-group list-group-flush">
109
+ <li class="list-group-item text-left">
110
  <a href="https://howto.squirrly.co/kb/seo-audit/#how_seo_audit_works" target="_blank">How does the Audit work?</a>
111
  </li>
112
+ <li class="list-group-item text-left">
113
  <a href="https://howto.squirrly.co/kb/seo-audit/" target="_blank">How to add a Page in Audits.</a>
114
  </li>
115
+ <li class="list-group-item text-left">
116
  <a href="https://howto.squirrly.co/kb/seo-audit/" target="_blank">How to remove a page from Audits.</a>
117
  </li>
118
+ <li class="list-group-item text-left">
119
  <a href="https://howto.squirrly.co/kb/seo-audit/#google_search_console" target="_blank">Connect to Google Search Console.</a>
120
  </li>
121
+ <li class="list-group-item text-left">
122
  <a href="https://howto.squirrly.co/kb/seo-audit/#google_analytics" target="_blank">Connect to Google Analytics.</a>
123
  </li>
124
  </ul>
127
  <?php } ?>
128
  <?php if ($page == 'sq_rankings') { ?>
129
  <ul class="list-group list-group-flush">
130
+ <li class="list-group-item text-left">
131
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#add_keyword_ranking" target="_blank">How to add a Keyword in Rankings.</a>
132
  </li>
133
+ <li class="list-group-item text-left">
134
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#remove_keyword_ranking" target="_blank">How to remove a keyword from Rankings.</a>
135
  </li>
136
+ <li class="list-group-item text-left">
137
  <a href="https://howto.squirrly.co/kb/ranking-serp-checker/#check_keyword_information" target="_blank">Check the Keyword Impressions, Clicks and Optimization.</a>
138
  </li>
139
+ <li class="list-group-item text-left">
140
  <a href="https://fourhourseo.com/why-does-neil-patel-use-squirrly-seo-for-every-blog-post-that-he-publishes/" target="_blank">Why Does Neil Patel Use Squirrly SEO For Every Blog Post that He Publishes?</a>
141
  </li>
142
  </ul>
view/Blocks/Login.php CHANGED
@@ -5,7 +5,7 @@
5
 
6
  <?php if ($tab == 'login') { ?>
7
  <form method="post" action="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_dashboard', 'login') ?>">
8
- <?php wp_nonce_field('sq_login', 'sq_nonce'); ?>
9
  <input type="hidden" name="action" value="sq_login"/>
10
  <div class="form-group">
11
  <label for="email"><?php _e('Email:', _SQ_PLUGIN_NAME_); ?></label>
@@ -23,7 +23,7 @@
23
  </form>
24
  <?php } elseif ($tab == 'register') { ?>
25
  <form id="sq_register" method="post" action="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_dashboard', 'register') ?>">
26
- <?php wp_nonce_field('sq_register', 'sq_nonce'); ?>
27
  <input type="hidden" name="action" value="sq_register"/>
28
  <div class="form-group">
29
  <label for="email"><?php _e('Email:', _SQ_PLUGIN_NAME_); ?></label>
5
 
6
  <?php if ($tab == 'login') { ?>
7
  <form method="post" action="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_dashboard', 'login') ?>">
8
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_login', 'sq_nonce'); ?>
9
  <input type="hidden" name="action" value="sq_login"/>
10
  <div class="form-group">
11
  <label for="email"><?php _e('Email:', _SQ_PLUGIN_NAME_); ?></label>
23
  </form>
24
  <?php } elseif ($tab == 'register') { ?>
25
  <form id="sq_register" method="post" action="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_dashboard', 'register') ?>">
26
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_register', 'sq_nonce'); ?>
27
  <input type="hidden" name="action" value="sq_register"/>
28
  <div class="form-group">
29
  <label for="email"><?php _e('Email:', _SQ_PLUGIN_NAME_); ?></label>
view/Blocks/Ranks.php CHANGED
@@ -86,7 +86,13 @@
86
  <div class="card-text mt-2">
87
  <div class="col-sm-7" style="padding: 2px 0; border-left: 1px solid #eee; border-bottom: 1px solid #eee;">
88
  <div id="sq_chart" class="sq_chart no-p" style="width: 450px; height: 260px;"></div>
89
- <script>var sq_chart_val = drawChart("sq_chart", [["date", "average"], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0],], true); </script>
 
 
 
 
 
 
90
  </div>
91
  </div>
92
  </div>
86
  <div class="card-text mt-2">
87
  <div class="col-sm-7" style="padding: 2px 0; border-left: 1px solid #eee; border-bottom: 1px solid #eee;">
88
  <div id="sq_chart" class="sq_chart no-p" style="width: 450px; height: 260px;"></div>
89
+ <script>
90
+ if (typeof google !== 'undefined') {
91
+ google.setOnLoadCallback(function () {
92
+ var sq_chart_val = drawChart("sq_chart", [["date", "average"], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0]], true);
93
+ }
94
+ }
95
+ </script>
96
  </div>
97
  </div>
98
  </div>
view/Blocks/SEOIssues.php CHANGED
@@ -4,7 +4,7 @@
4
  <div class="sq_icons sq_audit_icon m-2"></div>
5
  <h3 class="card-title"><?php _e('SEO Issues', _SQ_PLUGIN_NAME_); ?>:</h3>
6
  <form method="post" class="p-0 m-0">
7
- <?php wp_nonce_field('sq_checkseo', 'sq_nonce'); ?>
8
  <input type="hidden" name="action" value="sq_checkseo"/>
9
  <button type="submit" class="btn btn-warning m-2" style="max-height: 35px;">
10
  <?php echo __('Run new test', _SQ_PLUGIN_NAME_) ?>
@@ -59,7 +59,7 @@
59
  <td style="width: 100px">
60
  <?php if (isset($row['name']) && isset($row['value'])) { ?>
61
  <form method="post" class="p-0 m-0">
62
- <?php wp_nonce_field('sq_fixsettings', 'sq_nonce'); ?>
63
  <input type="hidden" name="action" value="sq_fixsettings"/>
64
  <input type="hidden" name="name" value="<?php echo $row['name'] ?>"/>
65
  <input type="hidden" name="value" value="<?php echo $row['value'] ?>"/>
4
  <div class="sq_icons sq_audit_icon m-2"></div>
5
  <h3 class="card-title"><?php _e('SEO Issues', _SQ_PLUGIN_NAME_); ?>:</h3>
6
  <form method="post" class="p-0 m-0">
7
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_checkseo', 'sq_nonce'); ?>
8
  <input type="hidden" name="action" value="sq_checkseo"/>
9
  <button type="submit" class="btn btn-warning m-2" style="max-height: 35px;">
10
  <?php echo __('Run new test', _SQ_PLUGIN_NAME_) ?>
59
  <td style="width: 100px">
60
  <?php if (isset($row['name']) && isset($row['value'])) { ?>
61
  <form method="post" class="p-0 m-0">
62
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_fixsettings', 'sq_nonce'); ?>
63
  <input type="hidden" name="action" value="sq_fixsettings"/>
64
  <input type="hidden" name="name" value="<?php echo $row['name'] ?>"/>
65
  <input type="hidden" name="value" value="<?php echo $row['value'] ?>"/>
view/Blocks/Toolbar.php CHANGED
@@ -28,8 +28,13 @@
28
  ?>
29
  <li class="nav-item" style=" padding-top: 8px;">
30
  <svg class="separator" height="40" width="20" xmlns="http://www.w3.org/2000/svg">
31
- <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="0" y2="20"></line>
32
- <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="40" y2="20"></line>
 
 
 
 
 
33
  </svg>
34
  </li>
35
  <?php } ?>
28
  ?>
29
  <li class="nav-item" style=" padding-top: 8px;">
30
  <svg class="separator" height="40" width="20" xmlns="http://www.w3.org/2000/svg">
31
+ <?php if(is_rtl()){ ?>
32
+ <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="40" y2="20"></line>
33
+ <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="0" y2="20"></line>
34
+ <?php }else{ ?>
35
+ <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="0" y2="20"></line>
36
+ <line stroke="lightgray" stroke-width="1" x1="0" x2="19" y1="40" y2="20"></line>
37
+ <?php } ?>
38
  </svg>
39
  </li>
40
  <?php } ?>
view/Blocks/VersionBar.php CHANGED
@@ -7,7 +7,7 @@
7
  <?php if ($view->checkin->subscription_serpcheck) { ?>
8
  <div class="alert alert-success text-center m-0 p-1 small">
9
  <?php echo sprintf(__("%sSERP Checker %s:%s We update the best ranks for each keyword, daily. 100%% accurate and objective.", _SQ_PLUGIN_NAME_), '<strong>', $view->checkin->product_type, '</strong>'); ?>
10
- <?php if (!$view->checkin->subscription_serps) { ?>
11
  <div class="alert alert-warning text-center m-0 p-1">
12
  <?php echo sprintf(__("%sNo SERP queries remained.%s Please check your %saccount status and limits%s", _SQ_PLUGIN_NAME_), '<strong>', '</strong>', '<a href="' . SQ_Classes_RemoteController::getMySquirrlyLink('account') . '" target="_blank"><strong>', '</strong></a>'); ?>
13
  </div>
7
  <?php if ($view->checkin->subscription_serpcheck) { ?>
8
  <div class="alert alert-success text-center m-0 p-1 small">
9
  <?php echo sprintf(__("%sSERP Checker %s:%s We update the best ranks for each keyword, daily. 100%% accurate and objective.", _SQ_PLUGIN_NAME_), '<strong>', $view->checkin->product_type, '</strong>'); ?>
10
+ <?php if (!$view->checkin->subscription_serps && !$view->checkin->subscription_devkit) { ?>
11
  <div class="alert alert-warning text-center m-0 p-1">
12
  <?php echo sprintf(__("%sNo SERP queries remained.%s Please check your %saccount status and limits%s", _SQ_PLUGIN_NAME_), '<strong>', '</strong>', '<a href="' . SQ_Classes_RemoteController::getMySquirrlyLink('account') . '" target="_blank"><strong>', '</strong></a>'); ?>
13
  </div>
view/Connect/GoogleAnalytics.php CHANGED
@@ -14,7 +14,7 @@ $connect = json_decode(json_encode(SQ_Classes_Helpers_Tools::getOption('connect'
14
  <h6 class="col-sm-7 py-3 m-0 text-black-50"><?php echo __('You are connected to Google Analytics', _SQ_PLUGIN_NAME_) ?></h6>
15
  <div class="col-sm-5">
16
  <form method="post" class="p-0 m-0" onsubmit="if(!confirm('Are you sure?')){return false;}">
17
- <?php wp_nonce_field('sq_seosettings_ga_revoke', 'sq_nonce'); ?>
18
  <input type="hidden" name="action" value="sq_seosettings_ga_revoke"/>
19
  <button type="submit" class="btn btn-block btn-social btn-google text-info connect-button connect btn-lg">
20
  <?php echo __('Disconnect', _SQ_PLUGIN_NAME_) ?>
14
  <h6 class="col-sm-7 py-3 m-0 text-black-50"><?php echo __('You are connected to Google Analytics', _SQ_PLUGIN_NAME_) ?></h6>
15
  <div class="col-sm-5">
16
  <form method="post" class="p-0 m-0" onsubmit="if(!confirm('Are you sure?')){return false;}">
17
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_seosettings_ga_revoke', 'sq_nonce'); ?>
18
  <input type="hidden" name="action" value="sq_seosettings_ga_revoke"/>
19
  <button type="submit" class="btn btn-block btn-social btn-google text-info connect-button connect btn-lg">
20
  <?php echo __('Disconnect', _SQ_PLUGIN_NAME_) ?>
view/Connect/GoogleSearchConsole.php CHANGED
@@ -12,7 +12,7 @@
12
  <h6 class="col-sm-7 py-3 m-0 text-black-50"><?php echo __('You are connected to Google Search Console', _SQ_PLUGIN_NAME_) ?></h6>
13
  <div class="col-sm-5">
14
  <form method="post" class="p-0 m-0" onsubmit="if(!confirm('Are you sure?')){return false;}">
15
- <?php wp_nonce_field('sq_seosettings_gsc_revoke', 'sq_nonce'); ?>
16
  <input type="hidden" name="action" value="sq_seosettings_gsc_revoke"/>
17
  <button type="submit" class="btn btn-block btn-social btn-google text-info btn-lg">
18
  <?php echo __('Disconnect', _SQ_PLUGIN_NAME_) ?>
12
  <h6 class="col-sm-7 py-3 m-0 text-black-50"><?php echo __('You are connected to Google Search Console', _SQ_PLUGIN_NAME_) ?></h6>
13
  <div class="col-sm-5">
14
  <form method="post" class="p-0 m-0" onsubmit="if(!confirm('Are you sure?')){return false;}">
15
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_seosettings_gsc_revoke', 'sq_nonce'); ?>
16
  <input type="hidden" name="action" value="sq_seosettings_gsc_revoke"/>
17
  <button type="submit" class="btn btn-block btn-social btn-google text-info btn-lg">
18
  <?php echo __('Disconnect', _SQ_PLUGIN_NAME_) ?>
view/FocusPages/Addpage.php CHANGED
@@ -162,7 +162,7 @@
162
  if (isset($post->ID) && $post->ID > 0) {
163
  ?>
164
  <form method="post" class="p-0 m-0">
165
- <?php wp_nonce_field('sq_focuspages_addnew', 'sq_nonce'); ?>
166
  <input type="hidden" name="action" value="sq_focuspages_addnew"/>
167
 
168
  <input type="hidden" name="url" value="<?php echo $post->url; ?>">
162
  if (isset($post->ID) && $post->ID > 0) {
163
  ?>
164
  <form method="post" class="p-0 m-0">
165
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_focuspages_addnew', 'sq_nonce'); ?>
166
  <input type="hidden" name="action" value="sq_focuspages_addnew"/>
167
 
168
  <input type="hidden" name="url" value="<?php echo $post->url; ?>">
view/FocusPages/FocusPageRow.php CHANGED
@@ -48,7 +48,7 @@ if ($view->focuspage->id <> '') {
48
  <?php } ?>
49
 
50
  <?php if ($view->post) { ?>
51
- <div class="sq_focuspages_title col-sm-12 px-0 mx-0 font-weight-bold">
52
  <?php echo $view->post->sq->title ?> <?php echo(($view->post->post_status <> 'publish' && $view->post->post_status <> 'inherit' && $view->post->post_status <> '') ? ' <spam style="font-weight: normal">(' . $view->post->post_status . ')</spam>' : '') ?>
53
  <?php if ($edit_link) { ?>
54
  <a href="<?php echo $edit_link ?>" target="_blank">
@@ -58,12 +58,12 @@ if ($view->focuspage->id <> '') {
58
  </div>
59
  <?php } ?>
60
 
61
- <div class="sq_focuspages_url small"><?php echo '<a href="' . $view->post->url . '" class="text-link" rel="permalink" target="_blank">' . urldecode($view->post->url) . '</a>' ?></div>
62
  <div class="sq_focuspages_lastaudited small my-1"><?php echo __('Audited', _SQ_PLUGIN_NAME_) ?>:
63
  <span class="text-danger"><?php echo $audit_timestamp ?></span>
64
  </div>
65
  <form method="post" class="sq_focuspages_request p-0 m-0">
66
- <?php wp_nonce_field('sq_focuspages_update', 'sq_nonce'); ?>
67
  <input type="hidden" name="action" value="sq_focuspages_update"/>
68
 
69
  <input type="hidden" name="post_id" value="<?php echo (int)$view->post->ID; ?>">
@@ -156,8 +156,8 @@ if ($view->focuspage->id <> '') {
156
  <div class="sq_sm_dropdown">
157
  <ul class="p-2 m-0 text-left">
158
  <li class="m-0 p-1 py-2">
159
- <form method="post" class="p-0 m-0">
160
- <?php wp_nonce_field('sq_focuspages_delete', 'sq_nonce'); ?>
161
  <input type="hidden" name="action" value="sq_focuspages_delete"/>
162
  <input type="hidden" name="id" value="<?php echo $view->focuspage->user_post_id ?>"/>
163
  <i class="sq_icons_small fa fa-trash-o" style="padding: 2px"></i>
@@ -166,6 +166,10 @@ if ($view->focuspage->id <> '') {
166
  </button>
167
  </form>
168
  </li>
 
 
 
 
169
  </ul>
170
  </div>
171
  </div>
48
  <?php } ?>
49
 
50
  <?php if ($view->post) { ?>
51
+ <div class="sq_focuspages_title col-sm-12 px-0 mx-0 font-weight-bold text-left">
52
  <?php echo $view->post->sq->title ?> <?php echo(($view->post->post_status <> 'publish' && $view->post->post_status <> 'inherit' && $view->post->post_status <> '') ? ' <spam style="font-weight: normal">(' . $view->post->post_status . ')</spam>' : '') ?>
53
  <?php if ($edit_link) { ?>
54
  <a href="<?php echo $edit_link ?>" target="_blank">
58
  </div>
59
  <?php } ?>
60
 
61
+ <div class="sq_focuspages_url small text-left"><?php echo '<a href="' . $view->post->url . '" class="text-link" rel="permalink" target="_blank">' . urldecode($view->post->url) . '</a>' ?></div>
62
  <div class="sq_focuspages_lastaudited small my-1"><?php echo __('Audited', _SQ_PLUGIN_NAME_) ?>:
63
  <span class="text-danger"><?php echo $audit_timestamp ?></span>
64
  </div>
65
  <form method="post" class="sq_focuspages_request p-0 m-0">
66
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_focuspages_update', 'sq_nonce'); ?>
67
  <input type="hidden" name="action" value="sq_focuspages_update"/>
68
 
69
  <input type="hidden" name="post_id" value="<?php echo (int)$view->post->ID; ?>">
156
  <div class="sq_sm_dropdown">
157
  <ul class="p-2 m-0 text-left">
158
  <li class="m-0 p-1 py-2">
159
+ <form method="post" class="p-0 m-0" onSubmit="return confirm('<?php echo __('Do you want to delete the Focus Page?',_SQ_ASSETS_URL_) ?>') ">
160
+ <?php SQ_Classes_Helpers_Tools::setNonce('sq_focuspages_delete', 'sq_nonce'); ?>
161
  <input type="hidden" name="action" value="sq_focuspages_delete"/>
162
  <input type="hidden" name="id" value="<?php echo $view->focuspage->user_post_id ?>"/>
163
  <i class="sq_icons_small fa fa-trash-o" style="padding: 2px"></i>
166
  </button>
167
  </form>
168
  </li>
169
+ <li class="m-0 p-1 py-2">
170
+ <i class="sq_icons_small fa fa-info-circle" style="padding: 2px"></i>
171
+ <button class="btn btn-sm bg-transparent p-0 m-0" onclick="jQuery('#sq_previewurl_modal').attr('data-post_id', '<?php echo$view->focuspage->user_post_id ?>'); jQuery('#sq_previewurl_modal').sq_inspectURL()" data-dismiss="modal"><?php _e('Inspect URL', _SQ_PLUGIN_NAME_); ?></button>
172
+ </li>
173
  </ul>
174
  </div>
175
  </div>
view/FocusPages/FocusPageStats.php CHANGED
@@ -5,7 +5,7 @@
5
  $scores[] = array('date', 'score');
6
  $progress = array();
7
 
8
- if($stats = $focuspage->stats) {
9
  $stats_progress = $stats->progress;
10
 
11
  if (!empty($stats)) {
@@ -116,9 +116,13 @@
116
  <div class="media-right py-3 media-middle ">
117
  <div class="col-sm-12 px-0">
118
  <div id="sq_chart_score" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
119
- <script>jQuery(document).ready(function () {
120
- drawScoreChart("sq_chart_score", <?php echo json_encode($scores) ?> , false);
121
- }); </script>
 
 
 
 
122
  </div>
123
  </div>
124
  </div>
@@ -168,9 +172,13 @@
168
  <div class="media-right py-3 media-middle ">
169
  <div class="col-sm-12 px-0">
170
  <div id="sq_chart_serp" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
171
- <script>jQuery(document).ready(function () {
172
- drawRankingChart("sq_chart_serp", <?php echo json_encode($serp) ?> , true);
173
- }); </script>
 
 
 
 
174
  </div>
175
  </div>
176
  </div>
@@ -190,9 +198,13 @@
190
  <div class="media-right py-3 media-middle ">
191
  <div class="col-sm-12 px-0">
192
  <div id="sq_chart_views" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
193
- <script>jQuery(document).ready(function () {
194
- drawTrafficChart("sq_chart_views", <?php echo json_encode($views) ?> , false);
195
- }); </script>
 
 
 
 
196
  </div>
197
  </div>
198
  </div>
5
  $scores[] = array('date', 'score');
6
  $progress = array();
7
 
8
+ if ($stats = $focuspage->stats) {
9
  $stats_progress = $stats->progress;
10
 
11
  if (!empty($stats)) {
116
  <div class="media-right py-3 media-middle ">
117
  <div class="col-sm-12 px-0">
118
  <div id="sq_chart_score" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
119
+ <script>
120
+ if (typeof google !== 'undefined') {
121
+ google.setOnLoadCallback(function () {
122
+ drawScoreChart("sq_chart_score", <?php echo json_encode($scores) ?> , false);
123
+ });
124
+ }
125
+ </script>
126
  </div>
127
  </div>
128
  </div>
172
  <div class="media-right py-3 media-middle ">
173
  <div class="col-sm-12 px-0">
174
  <div id="sq_chart_serp" class="sq_chart no-p" style="width:95%; height: 90px;"></div>
175
+ <script>
176
+ if (typeof google !== 'undefined') {
177
+ google.setOnLoadCallback(function () {
178
+ drawRankingChart("sq_chart_serp", <?php echo json_encode($serp) ?> , true);
179
+ });
180
+ }
181
+ </script>
182
  </div>
183
  </div>
184