SEO SQUIRRLY™ - Version 10.0.11

Version Description

  • 06/25/2020 =
  • Update - Focus Page Words Length check based on Readability algorithm
  • Update - Request a new SEO Check on settings changed to make sure the goals are updated every time
  • Fixed - Small SEO Check warnings when the communication with Squirrlu Cloud is not working
  • Fixed - SEO Image task in Focus Pages for RTL languages
  • Fixed - JSON-LD identifier in SEO Audit
  • Fixed - Corrected the UI in SEO Audit regarding Open Graph and Twitter Card
  • Fixed - Corrected the Page Loading Speed in SEO Audit to not include JS files
Download this release

Release Info

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

Code changes from version 10.0.10 to 10.0.11

controllers/SeoSettings.php CHANGED
@@ -12,11 +12,11 @@ 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
- 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');
@@ -48,45 +48,45 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
48
  }
49
 
50
  public function automation() {
51
- add_action('sq_form_notices', array($this,'getNotificationBar'));
52
 
53
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight');
54
  SQ_Classes_ObjController::getClass('SQ_Controllers_Patterns')->init();
55
  }
56
 
57
  public function metas() {
58
- add_action('sq_form_notices', array($this,'getNotificationBar'));
59
 
60
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight');
61
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('snippet');
62
  }
63
 
64
  public function jsonld() {
65
- add_action('sq_form_notices', array($this,'getNotificationBar'));
66
  }
67
 
68
- public function social(){
69
- add_action('sq_form_notices', array($this,'getNotificationBar'));
70
  }
71
 
72
- public function tracking(){
73
- add_action('sq_form_notices', array($this,'getNotificationBar'));
74
  }
75
 
76
- public function webmaster(){
77
- add_action('sq_form_notices', array($this,'getNotificationBar'));
78
  }
79
 
80
- public function sitemap(){
81
- add_action('sq_form_notices', array($this,'getNotificationBar'));
82
  }
83
 
84
- public function robots(){
85
- add_action('sq_form_notices', array($this,'getNotificationBar'));
86
  }
87
 
88
- public function favicon(){
89
- add_action('sq_form_notices', array($this,'getNotificationBar'));
90
  }
91
 
92
  public function backup() {
@@ -151,6 +151,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
151
  gmdate('Y-m-d H:i:s')
152
  );
153
 
 
 
 
154
  //show the saved message
155
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
156
 
@@ -189,6 +192,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
189
  //save the options in database
190
  SQ_Classes_Helpers_Tools::saveOptions();
191
 
 
 
 
192
  //show the saved message
193
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
194
 
@@ -226,6 +232,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
226
 
227
  }
228
 
 
 
 
229
  //show the saved message
230
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
231
 
@@ -252,6 +261,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
252
  //save the options in database
253
  SQ_Classes_Helpers_Tools::saveOptions();
254
 
 
 
 
255
  //show the saved message
256
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
257
 
@@ -280,6 +292,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
280
  //save the options in database
281
  SQ_Classes_Helpers_Tools::saveOptions();
282
 
 
 
 
283
  //show the saved message
284
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
285
 
@@ -388,6 +403,9 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
388
  //Check if there is an old backup from Squirrly
389
  SQ_Classes_Helpers_Tools::getOptions();
390
 
 
 
 
391
  SQ_Classes_Error::setError(__('Great! The backup is restored.', _SQ_PLUGIN_NAME_) . " <br /> ", 'success');
392
  } else {
393
  SQ_Classes_Error::setError(__('Error! The backup is not valid.', _SQ_PLUGIN_NAME_) . " <br /> ");
@@ -472,7 +490,7 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
472
  }
473
 
474
  SQ_Classes_Error::setMessage(sprintf(__('Success! The import from %s was completed successfully and your SEO is safe!', _SQ_PLUGIN_NAME_), SQ_Classes_ObjController::getClass('SQ_Models_ImportExport')->getName($platform)));
475
- }catch (Exception $e){
476
  SQ_Classes_Error::setMessage(__('Error! An error occured while import. Please try again.', _SQ_PLUGIN_NAME_));
477
  }
478
  }
@@ -527,7 +545,7 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
527
 
528
  $rollback->set_plugin(array(
529
  'version' => SQ_STABLE_VERSION,
530
- 'plugin_name' => _SQ_ROOT_DIR_ ,
531
  'plugin_slug' => $plugin_slug,
532
  'package_url' => sprintf('https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, SQ_STABLE_VERSION),
533
  ));
@@ -668,7 +686,7 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
668
  $code = SQ_Classes_RemoteController::getGSCToken();
669
 
670
  if (!is_wp_error($code) && $code) {
671
- $response['code'] = SQ_Classes_Helpers_Sanitize::checkGoogleWTCode($code);
672
  } else {
673
  $response['error'] = SQ_Classes_Error::showNotices(__('Error! Could not get the code. Connect to Google Search Console and validate the connection.', _SQ_PLUGIN_NAME_), 'sq_error');
674
  }
@@ -689,7 +707,7 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController {
689
  //remove connection with Google Analytics
690
  $code = SQ_Classes_RemoteController::getGAToken();
691
  if (!is_wp_error($code) && $code) {
692
- $response['code'] = $code;
693
  } else {
694
  $response['error'] = SQ_Classes_Error::showNotices(__('Error! Could not get the tracking code. Connect to Google Analytics and get the website tracking code from Admin area.', _SQ_PLUGIN_NAME_), 'sq_error');
695
  }
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');
48
  }
49
 
50
  public function automation() {
51
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
52
 
53
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight');
54
  SQ_Classes_ObjController::getClass('SQ_Controllers_Patterns')->init();
55
  }
56
 
57
  public function metas() {
58
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
59
 
60
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('highlight');
61
  SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('snippet');
62
  }
63
 
64
  public function jsonld() {
65
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
66
  }
67
 
68
+ public function social() {
69
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
70
  }
71
 
72
+ public function tracking() {
73
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
74
  }
75
 
76
+ public function webmaster() {
77
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
78
  }
79
 
80
+ public function sitemap() {
81
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
82
  }
83
 
84
+ public function robots() {
85
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
86
  }
87
 
88
+ public function favicon() {
89
+ add_action('sq_form_notices', array($this, 'getNotificationBar'));
90
  }
91
 
92
  public function backup() {
151
  gmdate('Y-m-d H:i:s')
152
  );
153
 
154
+ //reset the report time
155
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
156
+
157
  //show the saved message
158
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
159
 
192
  //save the options in database
193
  SQ_Classes_Helpers_Tools::saveOptions();
194
 
195
+ //reset the report time
196
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
197
+
198
  //show the saved message
199
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
200
 
232
 
233
  }
234
 
235
+ //reset the report time
236
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
237
+
238
  //show the saved message
239
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
240
 
261
  //save the options in database
262
  SQ_Classes_Helpers_Tools::saveOptions();
263
 
264
+ //reset the report time
265
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
266
+
267
  //show the saved message
268
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
269
 
292
  //save the options in database
293
  SQ_Classes_Helpers_Tools::saveOptions();
294
 
295
+ //reset the report time
296
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
297
+
298
  //show the saved message
299
  if (!SQ_Classes_Error::isError()) SQ_Classes_Error::setMessage(__('Saved', _SQ_PLUGIN_NAME_));
300
 
403
  //Check if there is an old backup from Squirrly
404
  SQ_Classes_Helpers_Tools::getOptions();
405
 
406
+ //reset the report time
407
+ SQ_Classes_Helpers_Tools::saveOptions('seoreport_time', false);
408
+
409
  SQ_Classes_Error::setError(__('Great! The backup is restored.', _SQ_PLUGIN_NAME_) . " <br /> ", 'success');
410
  } else {
411
  SQ_Classes_Error::setError(__('Error! The backup is not valid.', _SQ_PLUGIN_NAME_) . " <br /> ");
490
  }
491
 
492
  SQ_Classes_Error::setMessage(sprintf(__('Success! The import from %s was completed successfully and your SEO is safe!', _SQ_PLUGIN_NAME_), SQ_Classes_ObjController::getClass('SQ_Models_ImportExport')->getName($platform)));
493
+ } catch (Exception $e) {
494
  SQ_Classes_Error::setMessage(__('Error! An error occured while import. Please try again.', _SQ_PLUGIN_NAME_));
495
  }
496
  }
545
 
546
  $rollback->set_plugin(array(
547
  'version' => SQ_STABLE_VERSION,
548
+ 'plugin_name' => _SQ_ROOT_DIR_,
549
  'plugin_slug' => $plugin_slug,
550
  'package_url' => sprintf('https://downloads.wordpress.org/plugin/%s.%s.zip', $plugin_slug, SQ_STABLE_VERSION),
551
  ));
686
  $code = SQ_Classes_RemoteController::getGSCToken();
687
 
688
  if (!is_wp_error($code) && $code) {
689
+ $response['code'] = SQ_Classes_Helpers_Sanitize::checkGoogleWTCode($code);
690
  } else {
691
  $response['error'] = SQ_Classes_Error::showNotices(__('Error! Could not get the code. Connect to Google Search Console and validate the connection.', _SQ_PLUGIN_NAME_), 'sq_error');
692
  }
707
  //remove connection with Google Analytics
708
  $code = SQ_Classes_RemoteController::getGAToken();
709
  if (!is_wp_error($code) && $code) {
710
+ $response['code'] = $code;
711
  } else {
712
  $response['error'] = SQ_Classes_Error::showNotices(__('Error! Could not get the tracking code. Connect to Google Analytics and get the website tracking code from Admin area.', _SQ_PLUGIN_NAME_), 'sq_error');
713
  }
models/Audits.php CHANGED
@@ -315,7 +315,7 @@ class SQ_Models_Audits {
315
  'title' => __("Open Graph protocol?", _SQ_PLUGIN_NAME_),
316
  'success' => __("Yes") . '!',
317
  'fail' => __("No") . '!' . '<div class="sq_list_error_title">' . __("The pages without Open Graph metas", _SQ_PLUGIN_NAME_) . ':</div><div class="sq_list_error">%s</div>',
318
- 'description' => sprintf(htmlentities(__("How can we fix the Open Graph of the website? %s You need to make sure you're going to fix the Open Graph image AS WELL AS all the other open graph elements. The third bullet point in this section offers you the examples you need to implement in the <head> section of your page's code. Make sure you replace the elements inside content=\" \" with your own stuff: your own titles, own image URLs, etc. %s If you're on WordPress, you're easily getting all the settings you need from the Squirrly SEO . Make sure you use it. %s <meta property=“og:url” content=“{site}/product/expectation-marketing-ebook/“ /> %s <meta property=“og:title” content=“Expectation Marketing [Book]” /> %s <meta property=“og:description” content=“If you&#039;re wondering why your marketing strategy isn&#039;t bringing the results you expected this is the right ebook for you. Expectation Marketing is about giving you an acti” /> %s <meta property=“og:type” content=“product” /> %s <meta property=“og:image” content=“{site}/image.jpg” /> %s <meta property=“og:image:width” content=“700” /> %s <meta property=“og:image:height” content=“536” /> %s <meta property=“og:image:type” content=“image/jpeg” /> %s <meta property=“og:site_name” content=“Expectation Marketing” /> %s <meta property=“og:locale” content=“en” />%s", _SQ_PLUGIN_NAME_)), '<ul><li>', '</li><li>', '</li></ul>', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />'),
319
  'protip' => __("Fixing this will improve Click Through Rates on Facebook, Google Plus, LinkedIN. Guaranteed. Make sure you use this to control how your pages look on social media when people share them.", _SQ_PLUGIN_NAME_),
320
  'solution' => __("Add the meta Open Graph tag in your page's header.", _SQ_PLUGIN_NAME_),
321
  'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo'),
@@ -325,7 +325,7 @@ class SQ_Models_Audits {
325
  'title' => __("Twitter Card?", _SQ_PLUGIN_NAME_),
326
  'success' => __("Yes") . '!',
327
  'fail' => __("No") . '!' . '<div class="sq_list_error_title">' . __("The pages without Twitter Card metas", _SQ_PLUGIN_NAME_) . ':</div><div class="sq_list_error">%s</div>',
328
- 'description' => sprintf(htmlentities(__("How can we fix the Twitter Cards of the website? %s You need to make sure you're going to fix the Twitter Card image AS WELL AS all the other twitter card elements. The third bullet point in this section offers you the examples you need to implement in the <head> section of your page's code. Make sure you replace the elements inside content=\" \" with your own stuff: your own titles, own image URLs, etc. %s If you're on WordPress, you're easily getting all the settings you need from the Squirrly SEO . Make sure you use it. %s <meta property=“twitter:url” content=“{site}/product/expectation-marketing-ebook/“ /> %s <meta property=“twitter:title” content=“Expectation Marketing [Book]” /> %s <meta property=“twitter:description” content=“If you&#039;re wondering why your marketing strategy isn&#039;t bringing the results you expected this is the right ebook for you. Expectation Marketing is about giving you an acti” /> %s <meta property=“twitter:image” content=“{site}/image.jpg” /> %s <meta property=“twitter:domain” content=“Expectation Marketing” /> %s <meta property=“twitter:card” content=“summary” />%s", _SQ_PLUGIN_NAME_)), '<ul><li>', '</li><li>', '</li></ul>', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />'),
329
  'protip' => __("Fixing this will improve Click Through Rates on Twitter. Guaranteed. Make sure you use this to control how your pages look on social media when people share them.", _SQ_PLUGIN_NAME_),
330
  'solution' => __("Add Twitter Card to make your articles look better on Twitter.", _SQ_PLUGIN_NAME_),
331
  'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo'),
315
  'title' => __("Open Graph protocol?", _SQ_PLUGIN_NAME_),
316
  'success' => __("Yes") . '!',
317
  'fail' => __("No") . '!' . '<div class="sq_list_error_title">' . __("The pages without Open Graph metas", _SQ_PLUGIN_NAME_) . ':</div><div class="sq_list_error">%s</div>',
318
+ 'description' => sprintf(htmlentities(__("How can we fix the Open Graph of the website? %s You need to make sure you're going to fix the Open Graph image AS WELL AS all the other open graph elements. The third bullet point in this section offers you the examples you need to implement in the <head> section of your page's code. Make sure you replace the elements inside content=\" \" with your own stuff: your own titles, own image URLs, etc. %s If you're on WordPress, you're easily getting all the settings you need from the Squirrly SEO . Make sure you use it. %s <meta property=“og:url” content=“{site}/product/expectation-marketing-ebook/“ /> %s <meta property=“og:title” content=“Expectation Marketing [Book]” /> %s <meta property=“og:description” content=“If you`re wondering why your marketing strategy isn`t bringing the results you expected this is the right ebook for you. Expectation Marketing is about giving you an acti” /> %s <meta property=“og:type” content=“product” /> %s <meta property=“og:image” content=“{site}/image.jpg” /> %s <meta property=“og:image:width” content=“700” /> %s <meta property=“og:image:height” content=“536” /> %s <meta property=“og:image:type” content=“image/jpeg” /> %s <meta property=“og:site_name” content=“Expectation Marketing” /> %s <meta property=“og:locale” content=“en” />%s", _SQ_PLUGIN_NAME_)), '<ul><li>', '</li><li>', '</li></ul><pre style="white-space: initial !important;">', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '<br />', '</pre>'),
319
  'protip' => __("Fixing this will improve Click Through Rates on Facebook, Google Plus, LinkedIN. Guaranteed. Make sure you use this to control how your pages look on social media when people share them.", _SQ_PLUGIN_NAME_),
320
  'solution' => __("Add the meta Open Graph tag in your page's header.", _SQ_PLUGIN_NAME_),
321
  'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo'),
325
  'title' => __("Twitter Card?", _SQ_PLUGIN_NAME_),
326
  'success' => __("Yes") . '!',
327
  'fail' => __("No") . '!' . '<div class="sq_list_error_title">' . __("The pages without Twitter Card metas", _SQ_PLUGIN_NAME_) . ':</div><div class="sq_list_error">%s</div>',
328
+ 'description' => sprintf(htmlentities(__("How can we fix the Twitter Cards of the website? %s You need to make sure you're going to fix the Twitter Card image AS WELL AS all the other twitter card elements. The third bullet point in this section offers you the examples you need to implement in the <head> section of your page's code. Make sure you replace the elements inside content=\" \" with your own stuff: your own titles, own image URLs, etc. %s If you're on WordPress, you're easily getting all the settings you need from the Squirrly SEO . Make sure you use it. %s <meta property=“twitter:url” content=“{site}/product/expectation-marketing-ebook/“ /> %s <meta property=“twitter:title” content=“Expectation Marketing [Book]” /> %s <meta property=“twitter:description” content=“If you`re wondering why your marketing strategy isn`t bringing the results you expected this is the right ebook for you. Expectation Marketing is about giving you an acti” /> %s <meta property=“twitter:image” content=“{site}/image.jpg” /> %s <meta property=“twitter:domain” content=“Expectation Marketing” /> %s <meta property=“twitter:card” content=“summary” />%s", _SQ_PLUGIN_NAME_)), '<ul><li>', '</li><li>', '</li></ul><pre style="white-space: initial!important;">', '<br />', '<br />', '<br />', '<br />', '<br />', '</pre>'),
329
  'protip' => __("Fixing this will improve Click Through Rates on Twitter. Guaranteed. Make sure you use this to control how your pages look on social media when people share them.", _SQ_PLUGIN_NAME_),
330
  'solution' => __("Add Twitter Card to make your articles look better on Twitter.", _SQ_PLUGIN_NAME_),
331
  'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_bulkseo', 'bulkseo'),
models/CheckSeo.php CHANGED
@@ -1319,12 +1319,14 @@ class SQ_Models_CheckSeo {
1319
  $tasks = $this->getTasks();
1320
  foreach ($tasks as $function => $task) {
1321
  //For Dev Kit
1322
- if (in_array('Audits', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_audit')) {
1323
- continue;
1324
- } elseif (in_array('Rankings', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_rankings')) {
1325
- continue;
1326
- } elseif (in_array('Focus Pages', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_focuspages')) {
1327
- continue;
 
 
1328
  }
1329
 
1330
  ///////////////////DEV ONLY
@@ -1343,14 +1345,22 @@ class SQ_Models_CheckSeo {
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
1348
- $this->dbtasks[$this->category_name][$function] = array_merge($this->dbtasks[$this->category_name][$function], $remote_tasks[$function]);
 
 
1349
  } elseif (method_exists($this, $function)) {
1350
  //Call the local function if exists
1351
  if ($result = @call_user_func(array($this, $function))) {
1352
- if (!isset($this->dbtasks[$this->category_name][$function])) $this->dbtasks[$this->category_name][$function] = array();
1353
- $this->dbtasks[$this->category_name][$function] = array_merge($this->dbtasks[$this->category_name][$function], $result);
 
 
 
 
1354
  }
1355
  } elseif (isset($this->dbtasks[$this->category_name][$function])) {
1356
  //remove the task if is not linked to anything
1319
  $tasks = $this->getTasks();
1320
  foreach ($tasks as $function => $task) {
1321
  //For Dev Kit
1322
+ if(is_array($task['tools']) && !empty($task['tools'])) {
1323
+ if (in_array('Audits', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_audit')) {
1324
+ continue;
1325
+ } elseif (in_array('Rankings', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_rankings')) {
1326
+ continue;
1327
+ } elseif (in_array('Focus Pages', $task['tools']) && !SQ_Classes_Helpers_Tools::getMenuVisible('show_focuspages')) {
1328
+ continue;
1329
+ }
1330
  }
1331
 
1332
  ///////////////////DEV ONLY
1345
  }
1346
  }
1347
  //create the db taks if doesn't exist
1348
+ if (!isset($this->dbtasks[$this->category_name][$function]) || !is_array($this->dbtasks[$this->category_name][$function])) {
1349
+ $this->dbtasks[$this->category_name][$function] = array();
1350
+ }
1351
  //merge the local and remote task
1352
+ if(is_array($remote_tasks[$function]) && !empty($remote_tasks[$function])) {
1353
+ $this->dbtasks[$this->category_name][$function] = array_merge($this->dbtasks[$this->category_name][$function], $remote_tasks[$function]);
1354
+ }
1355
  } elseif (method_exists($this, $function)) {
1356
  //Call the local function if exists
1357
  if ($result = @call_user_func(array($this, $function))) {
1358
+ if (!isset($this->dbtasks[$this->category_name][$function]) || !is_array($this->dbtasks[$this->category_name][$function])) {
1359
+ $this->dbtasks[$this->category_name][$function] = array();
1360
+ }
1361
+ if(is_array($result) && !empty($result)) {
1362
+ $this->dbtasks[$this->category_name][$function] = array_merge($this->dbtasks[$this->category_name][$function], $result);
1363
+ }
1364
  }
1365
  } elseif (isset($this->dbtasks[$this->category_name][$function])) {
1366
  //remove the task if is not linked to anything
models/focuspages/Image.php CHANGED
@@ -126,8 +126,8 @@ 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
- $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) {
126
  $task['error_message'] = __("No image found", _SQ_PLUGIN_NAME_);
127
  $task['completed'] = false;
128
  } elseif (!empty($this->_images)) {
129
+ $keyword = html_entity_decode($this->_keyword);
130
+ $keyword = preg_replace( '|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', ' ', $keyword );
131
  $keyword = preg_replace('/\s{2,}/', ' ', $keyword);
132
  $words = explode(' ', $keyword);
133
  foreach ($this->_images as $image) {
models/focuspages/Length.php CHANGED
@@ -22,6 +22,7 @@ class SQ_Models_Focuspages_Length extends SQ_Models_Abstract_Assistant {
22
  $this->_words = $this->_audit->data->sq_seo_meta->words;
23
  }
24
 
 
25
  if ($this->_audit->sq_analytics_google_connected && isset($this->_audit->data->sq_analytics_google->page_time)) {
26
  $this->_pagetime = $this->_audit->data->sq_analytics_google->page_time;
27
  }
22
  $this->_words = $this->_audit->data->sq_seo_meta->words;
23
  }
24
 
25
+
26
  if ($this->_audit->sq_analytics_google_connected && isset($this->_audit->data->sq_analytics_google->page_time)) {
27
  $this->_pagetime = $this->_audit->data->sq_analytics_google->page_time;
28
  }
readme.txt CHANGED
@@ -406,6 +406,16 @@ Type a keyword to the right of the screen and start using Squirrly Seo. Enjoy!
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
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.11 - 06/25/2020 =
410
+ * Update - Focus Page Words Length check based on Readability algorithm
411
+ * Update - Request a new SEO Check on settings changed to make sure the goals are updated every time
412
+ * Fixed - Small SEO Check warnings when the communication with Squirrlu Cloud is not working
413
+ * Fixed - SEO Image task in Focus Pages for RTL languages
414
+ * Fixed - JSON-LD identifier in SEO Audit
415
+ * Fixed - Corrected the UI in SEO Audit regarding Open Graph and Twitter Card
416
+ * Fixed - Corrected the Page Loading Speed in SEO Audit to not include JS files
417
+
418
+
419
  = 10.0.10 - 06/18/2020 =
420
  * Fixed - Focus Page Words Count
421
  * Fixed - Focus Page SEO Image
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.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,9 +16,9 @@
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');
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.11
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.11');
20
  //The last stable version
21
+ define('SQ_STABLE_VERSION', '10.0.10');
22
  // Call config files
23
  try {
24
  require_once(dirname(__FILE__) . '/config/config.php');
view/Blocks/Snippet.php CHANGED
@@ -63,6 +63,7 @@ if (SQ_Classes_Helpers_Tools::getOption('sq_api') <> '') {
63
  <input type="hidden" name="sq_term_id" value="<?php echo (int)$view->post->term_id; ?>">
64
  <input type="hidden" name="sq_taxonomy" value="<?php echo $view->post->taxonomy; ?>">
65
  <input type="hidden" name="sq_hash" id="sq_hash" value="<?php echo $view->post->hash; ?>">
 
66
 
67
  <?php
68
  //Run only is frontend admin and ajax call
63
  <input type="hidden" name="sq_term_id" value="<?php echo (int)$view->post->term_id; ?>">
64
  <input type="hidden" name="sq_taxonomy" value="<?php echo $view->post->taxonomy; ?>">
65
  <input type="hidden" name="sq_hash" id="sq_hash" value="<?php echo $view->post->hash; ?>">
66
+ <input type="hidden" name="sq_keyword" id="sq_keyword" value="">
67
 
68
  <?php
69
  //Run only is frontend admin and ajax call
view/Goals/CheckSeo.php CHANGED
@@ -127,9 +127,9 @@ $category_name = apply_filters('sq_page', SQ_Classes_Helpers_Tools::getValue('pa
127
 
128
  <?php if (!empty($view->congratulations) && !$refresh) { //if there are congratulations and is checked today
129
  $seosuccess_time = SQ_Classes_ObjController::getClass('SQ_Models_CheckSeo')->getDbTask('seosuccess_time');
130
-
131
  foreach ($view->congratulations as $index => $row) {
132
- if (!empty($seosuccess_time) && (time() - (int)$seosuccess_time) < (3600 * 12)) {
133
  break;
134
  }
135
  if ($row['completed']) { ?>
127
 
128
  <?php if (!empty($view->congratulations) && !$refresh) { //if there are congratulations and is checked today
129
  $seosuccess_time = SQ_Classes_ObjController::getClass('SQ_Models_CheckSeo')->getDbTask('seosuccess_time');
130
+ shuffle($view->congratulations);
131
  foreach ($view->congratulations as $index => $row) {
132
+ if (!empty($seosuccess_time) && (time() - (int)$seosuccess_time) < (3600 * 24 * 6 )) {
133
  break;
134
  }
135
  if ($row['completed']) { ?>