SEO SQUIRRLY™ - Version 12.1.09

Version Description

  • 07/15/2022 = Update - SLA compatibility with Divi Builder Update - SLA compatibility with Thrive Architect Update - Focus Page SEO Image to detect keywords with special chars Fix - Warning: Undefined array key "media" in DisplayController.php on line 74 Fix - Translation error on frech language on Focus Pages Fix - Importing emoticons from other SEO plugins on utf8 tabel encoding Fix - SEO Audit for detecting the twitter card and OG with more accuracy for non WordPress websites
Download this release

Release Info

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

Code changes from version 12.1.07 to 12.1.09

classes/helpers/Sanitize.php CHANGED
@@ -24,6 +24,13 @@ class SQ_Classes_Helpers_Sanitize
24
  public static function clearTitle($title)
25
  {
26
  if ($title <> '') {
 
 
 
 
 
 
 
27
  if (function_exists('preg_replace')) {
28
  $search = array(
29
  "/[\n\r]/si",
@@ -38,6 +45,7 @@ class SQ_Classes_Helpers_Sanitize
38
  $title = SQ_Classes_Helpers_Sanitize::i18n(trim(esc_html(ent2ncr(strip_tags($title)))));
39
 
40
  }
 
41
  return $title;
42
  }
43
 
@@ -50,6 +58,13 @@ class SQ_Classes_Helpers_Sanitize
50
  public static function clearDescription($description)
51
  {
52
  if ($description <> '') {
 
 
 
 
 
 
 
53
  if (function_exists('preg_replace')) {
54
  $search = array(
55
  "'<!--(.*?)-->'is",
24
  public static function clearTitle($title)
25
  {
26
  if ($title <> '') {
27
+
28
+ $seps = json_decode(SQ_ALL_SEP, true);
29
+ $title = str_replace(
30
+ array_values($seps),
31
+ array_map(function($value){return html_entity_decode($value);},$seps),
32
+ $title);
33
+
34
  if (function_exists('preg_replace')) {
35
  $search = array(
36
  "/[\n\r]/si",
45
  $title = SQ_Classes_Helpers_Sanitize::i18n(trim(esc_html(ent2ncr(strip_tags($title)))));
46
 
47
  }
48
+
49
  return $title;
50
  }
51
 
58
  public static function clearDescription($description)
59
  {
60
  if ($description <> '') {
61
+
62
+ $seps = json_decode(SQ_ALL_SEP, true);
63
+ $description = str_replace(
64
+ array_values($seps),
65
+ array_map(function($value){return html_entity_decode($value);},$seps),
66
+ $description);
67
+
68
  if (function_exists('preg_replace')) {
69
  $search = array(
70
  "'<!--(.*?)-->'is",
controllers/SeoSettings.php CHANGED
@@ -190,12 +190,15 @@ class SQ_Controllers_SeoSettings extends SQ_Classes_FrontController
190
  }
191
  $options = json_decode($options, true);
192
  if (is_array($options) && isset($options['sq_api'])) {
193
- if (SQ_Classes_Helpers_Tools::getOption('sq_api') <> '') {
194
- $options['sq_api'] = SQ_Classes_Helpers_Tools::getOption('sq_api');
195
- }
196
- if (SQ_Classes_Helpers_Tools::getOption('sq_seojourney') <> '') {
197
- $options['sq_seojourney'] = SQ_Classes_Helpers_Tools::getOption('sq_seojourney');
198
- }
 
 
 
199
  SQ_Classes_Helpers_Tools::$options = $options;
200
  SQ_Classes_Helpers_Tools::saveOptions();
201
 
190
  }
191
  $options = json_decode($options, true);
192
  if (is_array($options) && isset($options['sq_api'])) {
193
+ $options['sq_api'] = SQ_Classes_Helpers_Tools::getOption('sq_api');
194
+ $options['sq_seojourney'] = SQ_Classes_Helpers_Tools::getOption('sq_seojourney');
195
+ $options['menu'] = SQ_Classes_Helpers_Tools::getOption('menu');
196
+ $options['sq_auto_devkit'] = SQ_Classes_Helpers_Tools::getOption('sq_auto_devkit');
197
+ $options['sq_devkit_logo'] = SQ_Classes_Helpers_Tools::getOption('sq_devkit_logo');
198
+ $options['sq_devkit_name'] = SQ_Classes_Helpers_Tools::getOption('sq_devkit_name');
199
+ $options['sq_devkit_menu_name'] = SQ_Classes_Helpers_Tools::getOption('sq_devkit_menu_name');
200
+ $options['sq_devkit_audit_success'] = SQ_Classes_Helpers_Tools::getOption('sq_devkit_audit_success');
201
+ $options['sq_devkit_audit_fail'] = SQ_Classes_Helpers_Tools::getOption('sq_devkit_audit_fail');
202
  SQ_Classes_Helpers_Tools::$options = $options;
203
  SQ_Classes_Helpers_Tools::saveOptions();
204
 
core/BlockFeatures.php CHANGED
@@ -301,7 +301,7 @@ class SQ_Core_BlockFeatures extends SQ_Classes_BlockController
301
  'show' => (SQ_Classes_Helpers_Tools::isPluginInstalled('oxygen/functions.php') && SQ_Classes_Helpers_Tools::getMenuVisible('show_assistant')),
302
  ),//Live Assistant Oxygen
303
  array(
304
- 'title' => "Divi Builder (BETA)",
305
  'description' => "The SEO Live Assistant <strong>works on the front-end of Divi</strong>, just as you're creating or editing your Divi page.",
306
  'category' => "Assistants",
307
  'mainfeature' => false,
@@ -314,6 +314,20 @@ class SQ_Core_BlockFeatures extends SQ_Classes_BlockController
314
  'details' => 'https://howto12.squirrly.co/kb/squirrly-live-assistant/#divi',
315
  'show' => (SQ_Classes_Helpers_Tools::isPluginInstalled('divi-builder/divi-builder.php') || SQ_Classes_Helpers_Tools::isThemeActive('Divi')),
316
  ),//Live Assistant Divi
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
  array(
318
  'title' => "Blogging Assistant",
319
  'description' => "Add relevant <strong>Copyright-Free images, Tweets, Wikis, Blog Excerpts</strong> in your posts.",
@@ -695,6 +709,21 @@ class SQ_Core_BlockFeatures extends SQ_Classes_BlockController
695
  'keywords' => 'rich,snippets,jsonld,video',
696
  'show' => true,
697
  ), //JSON-LD Optimizaition
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
698
  array(
699
  'title' => "Robots.txt File",
700
  'description' => "Tell search engine crawlers which pages or files the crawler can or can't request from your site.",
301
  'show' => (SQ_Classes_Helpers_Tools::isPluginInstalled('oxygen/functions.php') && SQ_Classes_Helpers_Tools::getMenuVisible('show_assistant')),
302
  ),//Live Assistant Oxygen
303
  array(
304
+ 'title' => "Divi Builder",
305
  'description' => "The SEO Live Assistant <strong>works on the front-end of Divi</strong>, just as you're creating or editing your Divi page.",
306
  'category' => "Assistants",
307
  'mainfeature' => false,
314
  'details' => 'https://howto12.squirrly.co/kb/squirrly-live-assistant/#divi',
315
  'show' => (SQ_Classes_Helpers_Tools::isPluginInstalled('divi-builder/divi-builder.php') || SQ_Classes_Helpers_Tools::isThemeActive('Divi')),
316
  ),//Live Assistant Divi
317
+ array(
318
+ 'title' => "Thrive Architect (BETA)",
319
+ 'description' => "The SEO Live Assistant <strong>works on the front-end of Thrive Architect</strong>, just as you're creating or editing your Thrive Architect page.",
320
+ 'category' => "Assistants",
321
+ 'mainfeature' => false,
322
+ 'option' => 'sq_sla_frontend',
323
+ 'active' => SQ_Classes_Helpers_Tools::getOption('sq_sla_frontend'),
324
+ 'optional' => true,
325
+ 'connection' => false,
326
+ 'logo' => 'fa-solid fa-message',
327
+ 'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_assistant', 'settings'),
328
+ 'details' => 'https://howto12.squirrly.co/kb/squirrly-live-assistant/#thrive',
329
+ 'show' => SQ_Classes_Helpers_Tools::isPluginInstalled('thrive-visual-editor/thrive-visual-editor.php'),
330
+ ),//Live Assistant Thrive Architect
331
  array(
332
  'title' => "Blogging Assistant",
333
  'description' => "Add relevant <strong>Copyright-Free images, Tweets, Wikis, Blog Excerpts</strong> in your posts.",
709
  'keywords' => 'rich,snippets,jsonld,video',
710
  'show' => true,
711
  ), //JSON-LD Optimizaition
712
+ array(
713
+ 'title' => "Personal Brand Rich Snippets",
714
+ 'description' => "Edit your website's personal brand Schema with Squirrly's powerful <strong>semantic SEO Markup Solution</strong>. If your website is a personal website, you need to add the author data to build a valid JSON-LD.",
715
+ 'category' => "Miscellaneous Features",
716
+ 'mainfeature' => false,
717
+ 'option' => 'sq_jsonld_personal',
718
+ 'active' => SQ_Classes_Helpers_Tools::getOption('sq_jsonld_personal'),
719
+ 'optional' => true,
720
+ 'connection' => false,
721
+ 'logo' => 'fa-solid fa-barcode-read',
722
+ 'link' => SQ_Classes_Helpers_Tools::getAdminUrl('sq_seosettings', 'jsonld#tab=personal'),
723
+ 'details' => 'https://howto12.squirrly.co/kb/json-ld-structured-data/#Add-JSON-LD-Profile',
724
+ 'keywords' => 'rich,snippets,jsonld,personal,video',
725
+ 'show' => true,
726
+ ), //JSON-LD Optimizaition
727
  array(
728
  'title' => "Robots.txt File",
729
  'description' => "Tell search engine crawlers which pages or files the crawler can or can't request from your site.",
models/Compatibility.php CHANGED
@@ -167,20 +167,16 @@ class SQ_Models_Compatibility
167
  // }
168
 
169
  //Load SLA in Thrive Backend
170
- // if (SQ_Classes_Helpers_Tools::isPluginInstalled('thrive-visual-editor/thrive-visual-editor.php')) {
171
- // if (SQ_Classes_Helpers_Tools::getValue('action') == 'architect') {
172
- // //activate frontend SLA
173
- // add_filter('sq_load_frontend_sla', '__return_true');
174
- //
175
- // wp_enqueue_script('jquery');
176
- // wp_enqueue_script('jquery-ui-core');
177
- // wp_enqueue_script('jquery-ui-draggable');
178
- // wp_print_scripts(array('jquery', 'jquery-ui-core', 'jquery-ui-draggable'));
179
- //
180
- // //activate SLA for Thrive on frontend
181
- // add_action('tcb_editor_iframe_after', array(SQ_Classes_ObjController::getClass('SQ_Models_LiveAssistant'), 'loadFrontent'), 99);
182
- // }
183
- // }
184
 
185
  //Load SLA in Zion Backend
186
  // if (SQ_Classes_Helpers_Tools::isPluginInstalled('zionbuilder/zionbuilder.php')) {
@@ -259,15 +255,16 @@ class SQ_Models_Compatibility
259
  // }
260
 
261
  //Load the SLA for Elementor Editor
262
- // if (SQ_Classes_Helpers_Tools::isPluginInstalled('thrive-visual-editor/thrive-visual-editor.php')) {
263
- //
264
- // if (SQ_Classes_Helpers_Tools::getValue('tve')) {
265
- //
266
- // //Load the style for builders
267
- // SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('builders');
268
- //
269
- // }
270
- // }
 
271
 
272
 
273
 
167
  // }
168
 
169
  //Load SLA in Thrive Backend
170
+ if (SQ_Classes_Helpers_Tools::isPluginInstalled('thrive-visual-editor/thrive-visual-editor.php')) {
171
+ if (SQ_Classes_Helpers_Tools::getValue('action') == 'architect') {
172
+ //activate frontend SLA
173
+ add_filter('sq_load_frontend_sla', '__return_true');
174
+
175
+ //activate SLA for Thrive on frontend
176
+ add_action('tcb_editor_iframe_after', array(SQ_Classes_ObjController::getClass('SQ_Models_LiveAssistant'), 'loadFrontent'), 99);
177
+
178
+ }
179
+ }
 
 
 
 
180
 
181
  //Load SLA in Zion Backend
182
  // if (SQ_Classes_Helpers_Tools::isPluginInstalled('zionbuilder/zionbuilder.php')) {
255
  // }
256
 
257
  //Load the SLA for Elementor Editor
258
+ if (SQ_Classes_Helpers_Tools::isPluginInstalled('thrive-visual-editor/thrive-visual-editor.php')) {
259
+
260
+ if (SQ_Classes_Helpers_Tools::getValue('tve')) {
261
+
262
+ //Load the style for builders
263
+ add_action('wp_enqueue_scripts', function () {
264
+ SQ_Classes_ObjController::getClass('SQ_Classes_DisplayController')->loadMedia('builders');
265
+ });
266
+ }
267
+ }
268
 
269
 
270
 
models/Frontend.php CHANGED
@@ -137,7 +137,12 @@ class SQ_Models_Frontend
137
  $header_str = preg_replace('/<!--(.*)-->/Uis', '', $header_str);
138
  }
139
 
140
- $buffer = preg_replace('/(<head(\s[^>]*|)>)/si', "$1" . "\n" . $header_str . "\n", $buffer, 1);
 
 
 
 
 
141
 
142
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_links')) {
143
  if (SQ_Classes_Helpers_Tools::getOption('sq_external_nofollow') || SQ_Classes_Helpers_Tools::getOption('sq_external_blank')) {
@@ -164,6 +169,9 @@ class SQ_Models_Frontend
164
  {
165
  //Build the Header
166
  $header = array();
 
 
 
167
  $header['sq_title'] = apply_filters('sq_title', false);
168
 
169
  //Get all header in array
@@ -195,6 +203,8 @@ class SQ_Models_Frontend
195
  $header['sq_json_ld'] = apply_filters('sq_json_ld', false);
196
  $header['sq_end'] = $this->setEnd();
197
 
 
 
198
  //flush the header
199
  if (count($header)) {
200
  $header = array_filter($header);
@@ -252,6 +262,8 @@ class SQ_Models_Frontend
252
 
253
  //load all services
254
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_metas')) {
 
 
255
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_title')) {
256
  SQ_Classes_ObjController::getClass('SQ_Models_Services_Title');
257
  }
137
  $header_str = preg_replace('/<!--(.*)-->/Uis', '', $header_str);
138
  }
139
 
140
+ //load squirrly metas last or first
141
+ if(SQ_Classes_Helpers_Tools::getOption('sq_laterload')){
142
+ $buffer = preg_replace('/(<\/head>)/si', $header_str . "\n" . "$1", $buffer, 1);
143
+ }else{
144
+ $buffer = preg_replace('/(<head(\s[^>]*|)>)/si', "$1" . "\n" . $header_str . "\n", $buffer, 1);
145
+ }
146
 
147
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_links')) {
148
  if (SQ_Classes_Helpers_Tools::getOption('sq_external_nofollow') || SQ_Classes_Helpers_Tools::getOption('sq_external_blank')) {
169
  {
170
  //Build the Header
171
  $header = array();
172
+
173
+ $header['sq_beforemeta'] = apply_filters('sq_beforemeta', false); //
174
+
175
  $header['sq_title'] = apply_filters('sq_title', false);
176
 
177
  //Get all header in array
203
  $header['sq_json_ld'] = apply_filters('sq_json_ld', false);
204
  $header['sq_end'] = $this->setEnd();
205
 
206
+ $header['sq_aftermeta'] = apply_filters('sq_aftermeta', false);
207
+
208
  //flush the header
209
  if (count($header)) {
210
  $header = array_filter($header);
262
 
263
  //load all services
264
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_metas')) {
265
+ SQ_Classes_ObjController::getClass('SQ_Models_Services_CustomMetas');
266
+
267
  if (SQ_Classes_Helpers_Tools::getOption('sq_auto_title')) {
268
  SQ_Classes_ObjController::getClass('SQ_Models_Services_Title');
269
  }
models/LiveAssistant.php CHANGED
@@ -137,14 +137,10 @@ class SQ_Models_LiveAssistant
137
 
138
  if (in_array($post->post_type, (array)$types)) {
139
  //Load the assistant for frontend
140
- if (!wp_script_is('jquery')) {
141
- wp_enqueue_script('jquery');
142
- }
143
- //load the draggable script in post edit for the floating SLA
144
- if (!wp_script_is('jquery-ui-core') || !wp_script_is('jquery-ui-draggable')) {
145
- wp_enqueue_script("jquery-ui-core");
146
- wp_enqueue_script("jquery-ui-draggable");
147
- }
148
 
149
  //Load media in frontend
150
  $args = array('trigger'=>true);
137
 
138
  if (in_array($post->post_type, (array)$types)) {
139
  //Load the assistant for frontend
140
+ wp_enqueue_script('jquery');
141
+ wp_enqueue_script('jquery-ui-core');
142
+ wp_enqueue_script('jquery-ui-draggable');
143
+ wp_print_scripts(array('jquery', 'jquery-ui-core', 'jquery-ui-draggable'));
 
 
 
 
144
 
145
  //Load media in frontend
146
  $args = array('trigger'=>true);
models/Menu.php CHANGED
@@ -654,15 +654,15 @@ class SQ_Models_Menu
654
  'icon' => 'fa-solid fa-barcode-read',
655
  'show' => SQ_Classes_Helpers_Tools::getOption('sq_auto_jsonld'),
656
  'tabs' => array(
 
 
 
 
657
  array(
658
  'title' => esc_html__("Personal Brand / Author", 'hide-my-wp') ,
659
  'tab' =>'personal',
660
  'show' => SQ_Classes_Helpers_Tools::getOption('sq_jsonld_personal'),
661
  ),
662
- array(
663
- 'title' => esc_html__("Company", 'hide-my-wp') ,
664
- 'tab' =>'company',
665
- ),
666
  array(
667
  'title' => esc_html__("WooCommerce", 'hide-my-wp') ,
668
  'tab' =>'woocommerce',
654
  'icon' => 'fa-solid fa-barcode-read',
655
  'show' => SQ_Classes_Helpers_Tools::getOption('sq_auto_jsonld'),
656
  'tabs' => array(
657
+ array(
658
+ 'title' => esc_html__("Company", 'hide-my-wp') ,
659
+ 'tab' =>'company',
660
+ ),
661
  array(
662
  'title' => esc_html__("Personal Brand / Author", 'hide-my-wp') ,
663
  'tab' =>'personal',
664
  'show' => SQ_Classes_Helpers_Tools::getOption('sq_jsonld_personal'),
665
  ),
 
 
 
 
666
  array(
667
  'title' => esc_html__("WooCommerce", 'hide-my-wp') ,
668
  'tab' =>'woocommerce',
models/Settings.php CHANGED
@@ -43,7 +43,7 @@ class SQ_Models_Settings
43
  $robots = str_replace("\r", "", $robots);
44
 
45
  if (!empty($robots)) {
46
- SQ_Classes_Helpers_Tools::$options['sq_robots_permission'] = array_unique($robots);
47
  }
48
  }
49
 
43
  $robots = str_replace("\r", "", $robots);
44
 
45
  if (!empty($robots)) {
46
+ SQ_Classes_Helpers_Tools::$options['sq_robots_permission'] = $robots;
47
  }
48
  }
49
 
models/domain/Patterns.php CHANGED
@@ -9,7 +9,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
9
  protected $_post_type;
10
  protected $_guid; //Replaced with the post/page slug
11
 
12
- public function setId($id)
13
  {
14
  $this->_id = $id;
15
  }
@@ -17,28 +17,28 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
17
  /*********************************************************************************/
18
  protected $_date; //Replaced with the date of the post/page
19
 
20
- public function setPost_date($value)
21
  {
22
  $this->_date = $value;
23
  }
24
 
25
  protected $_post_day; //Replaced with the date of the post/page
26
 
27
- public function getPost_day()
28
  {
29
  return date('y', strtotime($this->_date));
30
  }
31
 
32
  protected $_post_month; //Replaced with the date of the post/page
33
 
34
- public function getPost_month()
35
  {
36
  return date('m', strtotime($this->_date));
37
  }
38
 
39
  protected $_post_year; //Replaced with the date of the post/page
40
 
41
- public function getPost_year()
42
  {
43
  return date('Y', strtotime($this->_date));
44
  }
@@ -46,14 +46,14 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
46
  //
47
  protected $_title; //Replaced with the title of the post/page
48
 
49
- public function setPost_title($value)
50
  {
51
  if ($value <> '') {
52
  $this->_title = $value;
53
  }
54
  }
55
 
56
- public function getTitle()
57
  {
58
  if (!isset($this->_title) || $this->_title == '') {
59
  if ((int)$this->_term_id > 0) {
@@ -69,14 +69,14 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
69
  }
70
 
71
  $this->_title = SQ_Classes_Helpers_Sanitize::clearTitle($this->_title);
72
- return $this->truncate($this->_title, 10, $this->getDescription_maxlength());
73
  }
74
 
75
  //
76
  protected $_post_parent;
77
  protected $_parent_title; //Replaced with the title of the parent page of the current page
78
 
79
- public function getParent_title()
80
  {
81
  if (isset($this->_post_parent) && (int)$this->_post_parent > 0) {
82
  if ($post = $this->_getPost($this->_post_parent)) {
@@ -89,7 +89,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
89
 
90
  protected $_sitename; //The site's name
91
 
92
- public function getSitename()
93
  {
94
  return get_bloginfo('name');
95
  }
@@ -97,7 +97,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
97
  //
98
  protected $_sitedesc; //The site's tag line / description
99
 
100
- public function getSitedesc()
101
  {
102
  $description = SQ_Classes_Helpers_Sanitize::clearDescription(get_bloginfo('description'));
103
  return $this->truncate($description, 10, $this->getDescription_maxlength());
@@ -106,7 +106,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
106
  //
107
  protected $_excerpt; //Replaced with the post/page excerpt (or auto-generated if it does not exist)
108
 
109
- public function setPost_excerpt($value)
110
  {
111
  if ($value <> '') {
112
  $this->_excerpt = trim($value);
@@ -115,7 +115,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
115
 
116
  protected $_excludedText = array('This is a Page excerpt. It will be displayed for search results', 'Auto Draft');
117
 
118
- public function getExcerpt()
119
  {
120
  if (!isset($this->_excerpt) || $this->_excerpt == '') {
121
  if ((int)$this->_term_id > 0) {
@@ -142,7 +142,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
142
 
143
  protected $_post_description; //Replaced with the post/page content description (or auto-generated if it does not exist)
144
 
145
- public function getPost_description()
146
  {
147
  if ($post = $this->currentpost) {
148
 
@@ -157,7 +157,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
157
 
158
  protected $_excerpt_only; //Replaced with the post/page excerpt (without auto-generation)
159
 
160
- public function getExcerpt_only()
161
  {
162
  if ($post = $this->currentpost) {
163
 
@@ -177,7 +177,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
177
  //
178
  protected $_category; //Replaced with the post categories (comma separated)
179
 
180
- public function getCategory()
181
  {
182
  if (!isset($this->_category) || $this->_category == '') {
183
  if ($this->_post_type == 'category') {
@@ -195,7 +195,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
195
  protected $_primary_category; //Replaced with the primary category of the post/page
196
  protected $_primary_category_id;
197
 
198
- public function getPrimary_category()
199
  {
200
  if (!isset($this->_primary_category) || $this->_primary_category == '') {
201
  if ($this->_id > 0) {
@@ -212,7 +212,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
212
  //
213
  protected $_category_description; //Replaced with the category description
214
 
215
- public function getCategory_description()
216
  {
217
  if (!isset($this->_category_description) || $this->_category_description == '') {
218
  if ($this->_post_type == 'category') {
@@ -248,7 +248,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
248
 
249
  protected $_tag; //Replaced with the current tag/tags
250
 
251
- public function getTag()
252
  {
253
  if (!isset($this->_tag) || $this->_tag == '') {
254
  if ($this->_post_type == 'tag') {
@@ -281,7 +281,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
281
 
282
  protected $_tag_description; //Replaced with the tag description
283
 
284
- public function getTag_description()
285
  {
286
  if (!isset($this->_tag_description) || $this->_tag_description == '') {
287
  if ($this->_post_type == 'tag') {
@@ -314,7 +314,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
314
 
315
  protected $_term_title; //Replaced with the term name
316
 
317
- public function getTerm_title()
318
  {
319
  if (!isset($this->_term_title) || $this->_term_title == '') {
320
  if ((int)$this->_term_id > 0) {
@@ -328,7 +328,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
328
 
329
  protected $_term_description; //Replaced with the term description
330
 
331
- public function getTerm_description()
332
  {
333
  if (!isset($this->_term_description) || $this->_term_description == '') {
334
  if ((int)$this->_term_id > 0) {
@@ -343,7 +343,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
343
  //
344
  protected $_searchphrase; //Replaced with the current search phrase
345
 
346
- public function getSearchphrase()
347
  {
348
  if (!isset($this->_searchphrase)) {
349
  $search = get_query_var('s');
@@ -361,14 +361,14 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
361
  //
362
  protected $_sep; //The separator defined in your theme's wp_title tag
363
 
364
- public function setSep($sep = null)
365
  {
366
  if (isset($sep) && $sep <> '') {
367
  $this->_sep = $sep;
368
  }
369
  }
370
 
371
- public function getSep()
372
  {
373
  if (!isset($this->_sep)) {
374
  $this->_sep = '-';
@@ -387,7 +387,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
387
  //
388
  protected $_page; //Replaced with the current page number with context (i.e. page 2 of 4)
389
 
390
- public function getPage()
391
  {
392
  if (is_paged()) {
393
  return $this->sep . ' ' . esc_html__("Page", 'squirrly-seo') . ' ' . (int)get_query_var('paged') . ' ' .
@@ -399,7 +399,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
399
  //
400
  protected $_pagetotal; //Replaced with the current page total
401
 
402
- public function getPagetotal()
403
  {
404
  global $wp_query;
405
  if (isset($wp_query->max_num_pages))
@@ -411,7 +411,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
411
  protected $_pagenumber; //Replaced with the current page number
412
 
413
  //
414
- public function getPagenumber()
415
  {
416
  if (is_paged()) {
417
  return (int)get_query_var('paged');
@@ -430,7 +430,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
430
  *
431
  * @return stdClass|string
432
  */
433
- public function getPt_single()
434
  {
435
  return $this->getSingle();
436
 
@@ -441,7 +441,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
441
  *
442
  * @return stdClass|string
443
  */
444
- public function getPt_plural()
445
  {
446
  return $this->getPlural();
447
  }
@@ -451,7 +451,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
451
  *
452
  * @return string
453
  */
454
- public function getSingle()
455
  {
456
  if (function_exists('get_post_type_object')) {
457
  $post_type = $this->post_type;
@@ -472,7 +472,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
472
  *
473
  * @return string
474
  */
475
- public function getPlural()
476
  {
477
  if (function_exists('get_post_type_object')) {
478
  $post_type = $this->post_type;
@@ -490,7 +490,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
490
 
491
  protected $_modified; //Replaced with the post/page modified time
492
 
493
- public function setPost_modified($value)
494
  {
495
  if ($value <> '') {
496
  $this->_modified = $value;
@@ -500,7 +500,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
500
 
501
  protected $_name; //Replaced with the post/page author's 'nicename'
502
 
503
- public function setPost_author($value)
504
  {
505
  if ($value <> '') {
506
  if (is_numeric($value)) {
@@ -513,7 +513,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
513
 
514
  protected $_user_description; //Replaced with the post/page author's 'Biographical Info'
515
 
516
- public function getUser_description()
517
  {
518
  if (!isset($this->_user_description) || $this->_user_description == '') {
519
  if ($this->_post_type == 'profile') {
@@ -528,35 +528,35 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
528
  protected $_userid; //Replaced with the post/page author's userid
529
  protected $_currenttime; //Replaced with the current time
530
 
531
- public function getCurrenttime()
532
  {
533
  return date(get_option('time_format'));
534
  }
535
 
536
  protected $_currentdate; //Replaced with the current date
537
 
538
- public function getCurrentdate()
539
  {
540
  return date(get_option('date_format'));
541
  }
542
 
543
  protected $_currentday; //Replaced with the current day
544
 
545
- public function getCurrentday()
546
  {
547
  return date('d');
548
  }
549
 
550
  protected $_currentmonth; //Replaced with the current month
551
 
552
- public function getCurrentmonth()
553
  {
554
  return date('F');
555
  }
556
 
557
  protected $_currentyear; //Replaced with the current year
558
 
559
- public function getCurrentyear()
560
  {
561
  return date('Y');
562
  }
@@ -568,17 +568,17 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
568
  protected $_keyword; //Replaced with the posts focus keyword
569
  protected $_focuskw; //Same as keyword
570
 
571
- public function setKeywords($value)
572
  {
573
  $this->_focuskw = $this->_keyword = $value;
574
  }
575
 
576
- public function getKeyword()
577
  {
578
  return $this->_keyword;
579
  }
580
 
581
- public function getFocuskw()
582
  {
583
  return $this->_focuskw;
584
  }
@@ -587,7 +587,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
587
  /*********************************************************************************/
588
 
589
  ///////////
590
- public function getPatterns()
591
  {
592
  $patterns = array();
593
 
@@ -603,7 +603,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
603
 
604
  protected $_currentpost;
605
 
606
- public function getCurrentPost()
607
  {
608
  if (!isset($this->_currentpost)) {
609
  if (isset($this->id) && (int)$this->id > 0) {
@@ -616,7 +616,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
616
  return $this->_currentpost;
617
  }
618
 
619
- private function _getPost($id = null)
620
  {
621
  $post = false;
622
 
@@ -629,7 +629,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
629
  return $post;
630
  }
631
 
632
- public function truncate($text, $min = 100, $max = 110)
633
  {
634
 
635
  if ($text <> '' && strlen($text) > $max) {
@@ -645,13 +645,13 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
645
  return $text;
646
  }
647
 
648
- public function getTitle_maxlength()
649
  {
650
  $metas = SQ_Classes_Helpers_Tools::getOption('sq_metas');
651
  return $metas['title_maxlength'];
652
  }
653
 
654
- public function getDescription_maxlength()
655
  {
656
  $metas = SQ_Classes_Helpers_Tools::getOption('sq_metas');
657
  return $metas['description_maxlength'];
@@ -659,7 +659,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
659
 
660
  protected $_product_name;
661
 
662
- public function getProduct_name()
663
  {
664
  global $product;
665
 
@@ -693,7 +693,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
693
  protected $_product_price;
694
 
695
 
696
- public function getProduct_price()
697
  {
698
  global $product;
699
 
@@ -723,7 +723,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
723
 
724
  protected $_product_price_with_tax;
725
 
726
- public function getProduct_price_with_tax()
727
  {
728
  global $product;
729
 
@@ -760,7 +760,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
760
 
761
  protected $_product_brand;
762
 
763
- public function getProduct_brand()
764
  {
765
  global $product;
766
 
@@ -821,7 +821,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
821
 
822
  protected $_product_sale;
823
 
824
- public function getProduct_sale()
825
  {
826
  global $product;
827
 
@@ -852,7 +852,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
852
 
853
  protected $_product_currency;
854
 
855
- public function getProduct_currency()
856
  {
857
  global $product;
858
 
@@ -882,7 +882,7 @@ class SQ_Models_Domain_Patterns extends SQ_Models_Abstract_Domain
882
 
883
  protected $_custom_field;
884
 
885
- public function getCustom_field()
886
  {
887
  return '';
888
  }
9
  protected $_post_type;
10
  protected $_guid; //Replaced with the post/page slug
11
 
12
+ public function setId($id)
13
  {
14
  $this->_id = $id;
15
  }
17
  /*********************************************************************************/
18
  protected $_date; //Replaced with the date of the post/page
19
 
20
+ public function setPost_date($value)
21
  {
22
  $this->_date = $value;
23
  }
24
 
25
  protected $_post_day; //Replaced with the date of the post/page
26
 
27
+ public function getPost_day()
28
  {
29
  return date('y', strtotime($this->_date));
30
  }
31
 
32
  protected $_post_month; //Replaced with the date of the post/page
33
 
34
+ public function getPost_month()
35
  {
36
  return date('m', strtotime($this->_date));
37
  }
38
 
39
  protected $_post_year; //Replaced with the date of the post/page
40
 
41
+ public function getPost_year()
42
  {
43
  return date('Y', strtotime($this->_date));
44
  }
46
  //
47
  protected $_title; //Replaced with the title of the post/page
48
 
49
+ public function setPost_title($value)
50
  {
51
  if ($value <> '') {
52
  $this->_title = $value;
53
  }
54
  }
55
 
56
+ public function getTitle()
57
  {
58
  if (!isset($this->_title) || $this->_title == '') {
59
  if ((int)$this->_term_id > 0) {
69
  }
70
 
71
  $this->_title = SQ_Classes_Helpers_Sanitize::clearTitle($this->_title);
72
+ return $this->truncate($this->_title, 10, $this->getTitle_maxlength());
73
  }
74
 
75
  //
76
  protected $_post_parent;
77
  protected $_parent_title; //Replaced with the title of the parent page of the current page
78
 
79
+ public function getParent_title()
80
  {
81
  if (isset($this->_post_parent) && (int)$this->_post_parent > 0) {
82
  if ($post = $this->_getPost($this->_post_parent)) {
89
 
90
  protected $_sitename; //The site's name
91
 
92
+ public function getSitename()
93
  {
94
  return get_bloginfo('name');
95
  }
97
  //
98
  protected $_sitedesc; //The site's tag line / description
99
 
100
+ public function getSitedesc()
101
  {
102
  $description = SQ_Classes_Helpers_Sanitize::clearDescription(get_bloginfo('description'));
103
  return $this->truncate($description, 10, $this->getDescription_maxlength());
106
  //
107
  protected $_excerpt; //Replaced with the post/page excerpt (or auto-generated if it does not exist)
108
 
109
+ public function setPost_excerpt($value)
110
  {
111
  if ($value <> '') {
112
  $this->_excerpt = trim($value);
115
 
116
  protected $_excludedText = array('This is a Page excerpt. It will be displayed for search results', 'Auto Draft');
117
 
118
+ public function getExcerpt()
119
  {
120
  if (!isset($this->_excerpt) || $this->_excerpt == '') {
121
  if ((int)$this->_term_id > 0) {
142
 
143
  protected $_post_description; //Replaced with the post/page content description (or auto-generated if it does not exist)
144
 
145
+ public function getPost_description()
146
  {
147
  if ($post = $this->currentpost) {
148
 
157
 
158
  protected $_excerpt_only; //Replaced with the post/page excerpt (without auto-generation)
159
 
160
+ public function getExcerpt_only()
161
  {
162
  if ($post = $this->currentpost) {
163
 
177
  //
178
  protected $_category; //Replaced with the post categories (comma separated)
179
 
180
+ public function getCategory()
181
  {
182
  if (!isset($this->_category) || $this->_category == '') {
183
  if ($this->_post_type == 'category') {
195
  protected $_primary_category; //Replaced with the primary category of the post/page
196
  protected $_primary_category_id;
197
 
198
+ public function getPrimary_category()
199
  {
200
  if (!isset($this->_primary_category) || $this->_primary_category == '') {
201
  if ($this->_id > 0) {
212
  //
213
  protected $_category_description; //Replaced with the category description
214
 
215
+ public function getCategory_description()
216
  {
217
  if (!isset($this->_category_description) || $this->_category_description == '') {
218
  if ($this->_post_type == 'category') {
248
 
249
  protected $_tag; //Replaced with the current tag/tags
250
 
251
+ public function getTag()
252
  {
253
  if (!isset($this->_tag) || $this->_tag == '') {
254
  if ($this->_post_type == 'tag') {
281
 
282
  protected $_tag_description; //Replaced with the tag description
283
 
284
+ public function getTag_description()
285
  {
286
  if (!isset($this->_tag_description) || $this->_tag_description == '') {
287
  if ($this->_post_type == 'tag') {
314
 
315
  protected $_term_title; //Replaced with the term name
316
 
317
+ public function getTerm_title()
318
  {
319
  if (!isset($this->_term_title) || $this->_term_title == '') {
320
  if ((int)$this->_term_id > 0) {
328
 
329
  protected $_term_description; //Replaced with the term description
330
 
331
+ public function getTerm_description()
332
  {
333
  if (!isset($this->_term_description) || $this->_term_description == '') {
334
  if ((int)$this->_term_id > 0) {
343
  //
344
  protected $_searchphrase; //Replaced with the current search phrase
345
 
346
+ public function getSearchphrase()
347
  {
348
  if (!isset($this->_searchphrase)) {
349
  $search = get_query_var('s');
361
  //
362
  protected $_sep; //The separator defined in your theme's wp_title tag
363
 
364
+ public function setSep($sep = null)
365
  {
366
  if (isset($sep) && $sep <> '') {
367
  $this->_sep = $sep;
368
  }
369
  }
370
 
371
+ public function getSep()
372
  {
373
  if (!isset($this->_sep)) {
374
  $this->_sep = '-';
387
  //
388
  protected $_page; //Replaced with the current page number with context (i.e. page 2 of 4)
389
 
390
+ public function getPage()
391
  {
392
  if (is_paged()) {
393
  return $this->sep . ' ' . esc_html__("Page", 'squirrly-seo') . ' ' . (int)get_query_var('paged') . ' ' .
399
  //
400
  protected $_pagetotal; //Replaced with the current page total
401
 
402
+ public function getPagetotal()
403
  {
404
  global $wp_query;
405
  if (isset($wp_query->max_num_pages))
411
  protected $_pagenumber; //Replaced with the current page number
412
 
413
  //
414
+ public function getPagenumber()
415
  {
416
  if (is_paged()) {
417
  return (int)get_query_var('paged');
430
  *
431
  * @return stdClass|string
432
  */
433
+ public function getPt_single()
434
  {
435
  return $this->getSingle();
436
 
441
  *
442
  * @return stdClass|string
443
  */
444
+ public function getPt_plural()
445
  {
446
  return $this->getPlural();
447
  }
451
  *
452
  * @return string
453
  */
454
+ public function getSingle()
455
  {
456
  if (function_exists('get_post_type_object')) {
457
  $post_type = $this->post_type;
472
  *
473
  * @return string
474
  */
475
+ public function getPlural()
476
  {
477
  if (function_exists('get_post_type_object')) {
478
  $post_type = $this->post_type;
490
 
491
  protected $_modified; //Replaced with the post/page modified time
492
 
493
+ public function setPost_modified($value)
494
  {
495
  if ($value <> '') {
496
  $this->_modified = $value;
500
 
501
  protected $_name; //Replaced with the post/page author's 'nicename'
502
 
503
+ public function setPost_author($value)
504
  {
505
  if ($value <> '') {
506
  if (is_numeric($value)) {
513
 
514
  protected $_user_description; //Replaced with the post/page author's 'Biographical Info'
515
 
516
+ public function getUser_description()
517
  {
518
  if (!isset($this->_user_description) || $this->_user_description == '') {
519
  if ($this->_post_type == 'profile') {
528
  protected $_userid; //Replaced with the post/page author's userid
529
  protected $_currenttime; //Replaced with the current time
530
 
531
+ public function getCurrenttime()
532
  {
533
  return date(get_option('time_format'));
534
  }
535
 
536
  protected $_currentdate; //Replaced with the current date
537
 
538
+ public function getCurrentdate()
539
  {
540
  return date(get_option('date_format'));
541
  }
542
 
543
  protected $_currentday; //Replaced with the current day
544
 
545
+ public function getCurrentday()
546
  {
547
  return date('d');
548
  }
549
 
550
  protected $_currentmonth; //Replaced with the current month
551
 
552
+ public function getCurrentmonth()
553
  {
554
  return date('F');
555
  }
556
 
557
  protected $_currentyear; //Replaced with the current year
558
 
559
+ public function getCurrentyear()
560
  {
561
  return date('Y');
562
  }
568
  protected $_keyword; //Replaced with the posts focus keyword
569
  protected $_focuskw; //Same as keyword
570
 
571
+ public function setKeywords($value)
572
  {
573
  $this->_focuskw = $this->_keyword = $value;
574
  }
575
 
576
+ public function getKeyword()
577
  {
578
  return $this->_keyword;
579
  }
580
 
581
+ public function getFocuskw()
582
  {
583
  return $this->_focuskw;
584
  }
587
  /*********************************************************************************/
588
 
589
  ///////////
590
+ public function getPatterns()
591
  {
592
  $patterns = array();
593
 
603
 
604
  protected $_currentpost;
605
 
606
+ public function getCurrentPost()
607
  {
608
  if (!isset($this->_currentpost)) {
609
  if (isset($this->id) && (int)$this->id > 0) {
616
  return $this->_currentpost;
617
  }
618
 
619
+ private function _getPost($id = null)
620
  {
621
  $post = false;
622
 
629
  return $post;
630
  }
631
 
632
+ public function truncate($text, $min = 100, $max = 110)
633
  {
634
 
635
  if ($text <> '' && strlen($text) > $max) {
645
  return $text;
646
  }
647
 
648
+ public function getTitle_maxlength()
649
  {
650
  $metas = SQ_Classes_Helpers_Tools::getOption('sq_metas');
651
  return $metas['title_maxlength'];
652
  }
653
 
654
+ public function getDescription_maxlength()
655
  {
656
  $metas = SQ_Classes_Helpers_Tools::getOption('sq_metas');
657
  return $metas['description_maxlength'];
659
 
660
  protected $_product_name;
661
 
662
+ public function getProduct_name()
663
  {
664
  global $product;
665
 
693
  protected $_product_price;
694
 
695
 
696
+ public function getProduct_price()
697
  {
698
  global $product;
699
 
723
 
724
  protected $_product_price_with_tax;
725
 
726
+ public function getProduct_price_with_tax()
727
  {
728
  global $product;
729
 
760
 
761
  protected $_product_brand;
762
 
763
+ public function getProduct_brand()
764
  {
765
  global $product;
766
 
821
 
822
  protected $_product_sale;
823
 
824
+ public function getProduct_sale()
825
  {
826
  global $product;
827
 
852
 
853
  protected $_product_currency;
854
 
855
+ public function getProduct_currency()
856
  {
857
  global $product;
858
 
882
 
883
  protected $_custom_field;
884
 
885
+ public function getCustom_field()
886
  {
887
  return '';
888
  }
models/services/CustomMetas.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class SQ_Models_Services_CustomMetas extends SQ_Models_Abstract_Seo
4
+ {
5
+
6
+
7
+ public function __construct()
8
+ {
9
+ parent::__construct();
10
+
11
+ if (isset($this->_post->sq->doseo) && $this->_post->sq->doseo) {
12
+ if (!$this->_post->sq->do_metas) {
13
+ return;
14
+ }
15
+
16
+ add_filter('sq_beforemeta', array($this, 'beforeMetas'));
17
+ add_filter('sq_beforemeta', array($this, 'packMetas'), 99);
18
+ add_filter('sq_aftermeta', array($this, 'afterMetas'));
19
+ add_filter('sq_aftermeta', array($this, 'packMetas'), 99);
20
+
21
+ } else {
22
+ add_filter('sq_title', array($this, 'returnFalse'));
23
+ }
24
+
25
+ }
26
+
27
+ public function beforeMetas($meta = '')
28
+ {
29
+ return SQ_Classes_Helpers_Tools::getOption('sq_beforemeta');
30
+ }
31
+
32
+ public function afterMetas($meta = '')
33
+ {
34
+ return SQ_Classes_Helpers_Tools::getOption('sq_aftermeta');
35
+ }
36
+
37
+ public function packMetas($meta = '')
38
+ {
39
+ if ($meta <> '') {
40
+ return html_entity_decode($meta);
41
+ }
42
+
43
+ return false;
44
+ }
45
+
46
+ }
models/services/Title.php CHANGED
@@ -4,7 +4,7 @@ class SQ_Models_Services_Title extends SQ_Models_Abstract_Seo
4
  {
5
 
6
 
7
- public function __construct()
8
  {
9
  parent::__construct();
10
 
@@ -23,7 +23,7 @@ class SQ_Models_Services_Title extends SQ_Models_Abstract_Seo
23
 
24
  }
25
 
26
- public function generateTitle($title = '')
27
  {
28
  if ($this->_post->sq->title <> '') {
29
  $title = $this->_post->sq->title;
@@ -34,7 +34,7 @@ class SQ_Models_Services_Title extends SQ_Models_Abstract_Seo
34
  return $title ;
35
  }
36
 
37
- public function packTitle($title = '')
38
  {
39
  if ($title <> '') {
40
  return sprintf("<title>%s</title>", $title);
4
  {
5
 
6
 
7
+ public function __construct()
8
  {
9
  parent::__construct();
10
 
23
 
24
  }
25
 
26
+ public function generateTitle($title = '')
27
  {
28
  if ($this->_post->sq->title <> '') {
29
  $title = $this->_post->sq->title;
34
  return $title ;
35
  }
36
 
37
+ public function packTitle($title = '')
38
  {
39
  if ($title <> '') {
40
  return sprintf("<title>%s</title>", $title);
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://plugin.squirrly.co/squirrly-seo-pricing/
4
  Tags: SEO, SEO Plugin, XML sitemap, WooCommerce SEO, Search Engine, Open Graph, Video Sitemap, Google News Sitemap, Rich Snippets, Robotx.txt, SEO Automation, Local SEO, SEO Content analysis, SEO Content, SEO Optimization, WordPress SEO, Yoast, Yoast Compatible, Yoast Import, SEO Redirection, Redirection, SEO Sitemap, SEO Caching, Meta Title, Meta Description, Performance, SEO Audit, SEO Keyword Research, SEO Rank Math import, Google Search Console, Schema
5
  Requires at least: 4.3
6
  Tested up to: 6.0
7
- Stable tag: 12.1.07
8
  Requires PHP: 7.0
9
  License: GPLv2 or later
10
 
@@ -667,6 +667,15 @@ Type a keyword to the right of the screen and start using Squirrly Seo. Enjoy!
667
  7. Squirrly SEO - SEO Briefcase
668
 
669
  == Changelog ==
 
 
 
 
 
 
 
 
 
670
  = 12.1.07 - 06/23/2022 =
671
  Update - Show Frontend SLA option in Squirrly > Live Assistant > Settings for SEO Experts when a builder is not installed
672
  Update - SLA with Divi Builder load sequence
4
  Tags: SEO, SEO Plugin, XML sitemap, WooCommerce SEO, Search Engine, Open Graph, Video Sitemap, Google News Sitemap, Rich Snippets, Robotx.txt, SEO Automation, Local SEO, SEO Content analysis, SEO Content, SEO Optimization, WordPress SEO, Yoast, Yoast Compatible, Yoast Import, SEO Redirection, Redirection, SEO Sitemap, SEO Caching, Meta Title, Meta Description, Performance, SEO Audit, SEO Keyword Research, SEO Rank Math import, Google Search Console, Schema
5
  Requires at least: 4.3
6
  Tested up to: 6.0
7
+ Stable tag: 12.1.09
8
  Requires PHP: 7.0
9
  License: GPLv2 or later
10
 
667
  7. Squirrly SEO - SEO Briefcase
668
 
669
  == Changelog ==
670
+ = 12.1.09 - 07/15/2022 =
671
+ Update - SLA compatibility with Divi Builder
672
+ Update - SLA compatibility with Thrive Architect
673
+ Update - Focus Page SEO Image to detect keywords with special chars
674
+ Fix - Warning: Undefined array key "media" in DisplayController.php on line 74
675
+ Fix - Translation error on frech language on Focus Pages
676
+ Fix - Importing emoticons from other SEO plugins on utf8 tabel encoding
677
+ Fix - SEO Audit for detecting the twitter card and OG with more accuracy for non WordPress websites
678
+
679
  = 12.1.07 - 06/23/2022 =
680
  Update - Show Frontend SLA option in Squirrly > Live Assistant > Settings for SEO Experts when a builder is not installed
681
  Update - SLA with Divi Builder load sequence
squirrly.php CHANGED
@@ -8,7 +8,7 @@
8
  * Description: A.I.-based Private SEO Consultant. In a Plugin. Powered by Machine Learning and Cloud Services. Over 300 functionalities for SEO available when you need them.
9
  * Author: Squirrly
10
  * Author URI: https://plugin.squirrly.co
11
- * Version: 12.1.07
12
  * License: GPLv2 or later
13
  * License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
14
  * Text Domain: squirrly-seo
@@ -17,9 +17,9 @@
17
 
18
  if (!defined('SQ_VERSION')) {
19
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
20
- define('SQ_VERSION', '12.1.07');
21
  //The last stable version
22
- define('SQ_STABLE_VERSION', '12.1.06');
23
  // Call config files
24
  try {
25
  include_once dirname(__FILE__) . '/config/config.php';
8
  * Description: A.I.-based Private SEO Consultant. In a Plugin. Powered by Machine Learning and Cloud Services. Over 300 functionalities for SEO available when you need them.
9
  * Author: Squirrly
10
  * Author URI: https://plugin.squirrly.co
11
+ * Version: 12.1.09
12
  * License: GPLv2 or later
13
  * License URI: http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
14
  * Text Domain: squirrly-seo
17
 
18
  if (!defined('SQ_VERSION')) {
19
  /* SET THE CURRENT VERSION ABOVE AND BELOW */
20
+ define('SQ_VERSION', '12.1.09');
21
  //The last stable version
22
+ define('SQ_STABLE_VERSION', '12.1.07');
23
  // Call config files
24
  try {
25
  include_once dirname(__FILE__) . '/config/config.php';
view/Assistant/Settings.php CHANGED
@@ -104,7 +104,8 @@
104
  <div class="small text-black-50 ml-5"><?php echo esc_html__("Load Squirrly Live Assistant in Frontend to customize the posts and pages with Builders.", 'squirrly-seo'); ?></div>
105
  <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Elementor Builder %s plugin.", 'squirrly-seo'),'<a href="https://elementor.com/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
106
  <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Oxygen Builder %s plugin.", 'squirrly-seo'),'<a href="https://oxygenbuilder.com/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
107
- <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Divi Builder %s plugin (BETA).", 'squirrly-seo'),'<a href="https://www.elegantthemes.com/gallery/divi/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
 
108
  </div>
109
  </div>
110
  </div>
104
  <div class="small text-black-50 ml-5"><?php echo esc_html__("Load Squirrly Live Assistant in Frontend to customize the posts and pages with Builders.", 'squirrly-seo'); ?></div>
105
  <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Elementor Builder %s plugin.", 'squirrly-seo'),'<a href="https://elementor.com/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
106
  <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Oxygen Builder %s plugin.", 'squirrly-seo'),'<a href="https://oxygenbuilder.com/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
107
+ <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Divi Builder %s plugin.", 'squirrly-seo'),'<a href="https://www.elegantthemes.com/gallery/divi/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
108
+ <div class="small text-black-50 ml-5 mt-1"><?php echo sprintf(esc_html__("Supports %s Thrive Architect %s plugin (BETA).", 'squirrly-seo'),'<a href="https://thrivethemes.com/architect/" target="_blank" class="font-weight-bold">','</a>'); ?></div>
109
  </div>
110
  </div>
111
  </div>
view/Onboarding/Step6.php CHANGED
@@ -20,7 +20,7 @@
20
  </div>
21
 
22
  <div class="col-12 m-0 p-0 my-5">
23
- <iframe width="800" height="500" src="https://www.youtube.com/embed/lWcBfnLTb44" title="YouTube video player" frameborder="0" style="width: 100%; height: 500px;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
24
  </div>
25
 
26
  <div class="col-12 row m-0 p-0 my-5">
20
  </div>
21
 
22
  <div class="col-12 m-0 p-0 my-5">
23
+ <iframe width="800" height="500" src="https://www.youtube.com/embed/jQlJM9jI6Xg" title="YouTube video player" frameborder="0" style="width: 100%; height: 500px;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
24
  </div>
25
 
26
  <div class="col-12 row m-0 p-0 my-5">
view/Ranking/Settings.php CHANGED
@@ -91,7 +91,8 @@
91
  <option value="co.jp"><?php echo "Japan"; ?> (https://www.google.co.jp/)</option>
92
  <option value="co.je"><?php echo "Jersey"; ?> (https://www.google.co.je/)</option>
93
  <option value="kz"><?php echo "Kazakhstan"; ?> (https://www.google.kz/)</option>
94
- <option value="co.kr"><?php echo "Korea"; ?> (https://www.google.co.kr/)</option>
 
95
  <option value="lv"><?php echo "Latvia"; ?> (https://www.google.lv/)</option>
96
  <option value="co.ls"><?php echo "Lesotho"; ?> (https://www.google.co.ls/)</option>
97
  <option value="li"><?php echo "Liechtenstein"; ?> (https://www.google.li/)</option>
91
  <option value="co.jp"><?php echo "Japan"; ?> (https://www.google.co.jp/)</option>
92
  <option value="co.je"><?php echo "Jersey"; ?> (https://www.google.co.je/)</option>
93
  <option value="kz"><?php echo "Kazakhstan"; ?> (https://www.google.kz/)</option>
94
+ <option value="kz"><?php echo "Kazakhstan"; ?> (https://www.google.kz/)</option>
95
+ <option value="co.ke"><?php echo "Kenya"; ?> (https://www.google.co.ke/)</option>
96
  <option value="lv"><?php echo "Latvia"; ?> (https://www.google.lv/)</option>
97
  <option value="co.ls"><?php echo "Lesotho"; ?> (https://www.google.co.ls/)</option>
98
  <option value="li"><?php echo "Liechtenstein"; ?> (https://www.google.li/)</option>
view/SeoSettings/Jsonld.php CHANGED
@@ -44,7 +44,55 @@
44
 
45
  <div class="d-flex flex-column flex-grow-1 m-0 p-0">
46
 
47
- <div id="personal" class="col-12 py-0 px-4 m-0 tab-panel tab-panel-first active">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  <div class="col-12 m-0 p-0 my-2">
50
  <h3 class="card-title"><?php echo esc_html__("Personal Brand / Author", 'squirrly-seo'); ?>
@@ -123,54 +171,6 @@
123
 
124
  </div>
125
  </div>
126
- <div id="company" class="col-12 py-0 px-4 m-0 tab-panel">
127
-
128
- <div class="col-12 m-0 p-0 my-2">
129
- <h3 class="card-title"><?php echo esc_html__("Company", 'squirrly-seo'); ?>
130
- <a href="https://howto12.squirrly.co/kb/json-ld-structured-data/" target="_blank"><i class="fa-solid fa-question-circle m-0 p-0"></i></a>
131
- </h3>
132
- <div class="small text-danger my-1 pr-3"><?php echo esc_html__("ONLY use this if you have a company", 'squirrly-seo'); ?></div>
133
-
134
- </div>
135
-
136
- <div class="col-12 m-0 p-0 my-5">
137
-
138
- <div class="col-12 row m-0 p-0 my-5">
139
- <div class="col-4 m-0 p-0 font-weight-bold">
140
- <?php echo esc_html__("Your Organization Name", 'squirrly-seo'); ?>:
141
- <a href="https://howto12.squirrly.co/kb/json-ld-structured-data/" target="_blank"><i class="fa-solid fa-question-circle m-0 px-2" style="display: inline;"></i></a>
142
- <div class="small text-black-50 my-1 pr-3">e.g. COMPANY LTD"</div>
143
- </div>
144
- <div class="col-8 p-0 input-group input-group-lg">
145
- <input type="text" class="form-control bg-input" name="sq_jsonld[Organization][name]" value="<?php echo((isset($jsonld['Organization']['name']) && $jsonld['Organization']['name'] <> '') ? esc_attr($jsonld['Organization']['name']) : '') ?>"/>
146
- </div>
147
- </div>
148
- <div class="col-12 row m-0 p-0 my-5">
149
- <div class="col-4 m-0 p-0 font-weight-bold">
150
- <?php echo esc_html__("Logo URL", 'squirrly-seo'); ?>:
151
- <div class="small text-black-50 my-1 pr-3"><?php echo esc_html__("Select an image from Media Library.", 'squirrly-seo'); ?></div>
152
- </div>
153
- <div class="col-8 p-0 input-group input-group-lg">
154
- <input id="sq_jsonld_logo_organization" type="text" class="form-control bg-input" name="sq_jsonld[Organization][logo][url]" value="<?php echo((isset($jsonld['Organization']['logo']['url']) && $jsonld['Organization']['logo']['url'] <> '') ? esc_url($jsonld['Organization']['logo']['url']) : '') ?>" placeholder="<?php echo esc_html__("Select your file here", 'squirrly-seo') ?>"/>
155
- <input type="button" class="sq_imageselect btn btn-primary rounded-0" data-destination="sq_jsonld_logo_organization" value="<?php echo esc_html__("Select Image", 'squirrly-seo') ?>"/>
156
- </div>
157
- </div>
158
- <div class="col-12 row m-0 p-0 my-5">
159
- <div class="col-4 m-0 p-0 font-weight-bold">
160
- <?php echo esc_html__("Short Description", 'squirrly-seo'); ?>:
161
- <div class="small text-black-50 my-1 pr-3"><?php echo esc_html__("A short description about the company (20-50 words).", 'squirrly-seo'); ?></div>
162
- </div>
163
- <div class="col-8 p-0">
164
- <textarea class="form-control" name="sq_jsonld[Organization][description]" rows="3"><?php echo((isset($jsonld['Organization']['description']) && $jsonld['Organization']['description'] <> '') ? esc_textarea($jsonld['Organization']['description']) : '') ?></textarea>
165
- </div>
166
- </div>
167
-
168
- <div class="col-12 m-0 p-0 mt-5">
169
- <button type="submit" class="btn btn-primary btn-lg m-0 p-0 py-2 px-4 rounded-0"><?php echo esc_html__("Save Settings", 'squirrly-seo'); ?></button>
170
- </div>
171
-
172
- </div>
173
- </div>
174
  <div id="woocommerce" class="col-12 py-0 px-4 m-0 tab-panel">
175
 
176
  <div class="col-12 m-0 p-0 my-2">
44
 
45
  <div class="d-flex flex-column flex-grow-1 m-0 p-0">
46
 
47
+ <div id="company" class="col-12 py-0 px-4 m-0 tab-panel tab-panel-first active">
48
+
49
+ <div class="col-12 m-0 p-0 my-2">
50
+ <h3 class="card-title"><?php echo esc_html__("Company", 'squirrly-seo'); ?>
51
+ <a href="https://howto12.squirrly.co/kb/json-ld-structured-data/" target="_blank"><i class="fa-solid fa-question-circle m-0 p-0"></i></a>
52
+ </h3>
53
+ <div class="small text-danger my-1 pr-3"><?php echo esc_html__("ONLY use this if you have a company", 'squirrly-seo'); ?></div>
54
+
55
+ </div>
56
+
57
+ <div class="col-12 m-0 p-0 my-5">
58
+
59
+ <div class="col-12 row m-0 p-0 my-5">
60
+ <div class="col-4 m-0 p-0 font-weight-bold">
61
+ <?php echo esc_html__("Your Organization Name", 'squirrly-seo'); ?>:
62
+ <a href="https://howto12.squirrly.co/kb/json-ld-structured-data/" target="_blank"><i class="fa-solid fa-question-circle m-0 px-2" style="display: inline;"></i></a>
63
+ <div class="small text-black-50 my-1 pr-3">e.g. COMPANY LTD"</div>
64
+ </div>
65
+ <div class="col-8 p-0 input-group input-group-lg">
66
+ <input type="text" class="form-control bg-input" name="sq_jsonld[Organization][name]" value="<?php echo((isset($jsonld['Organization']['name']) && $jsonld['Organization']['name'] <> '') ? esc_attr($jsonld['Organization']['name']) : '') ?>"/>
67
+ </div>
68
+ </div>
69
+ <div class="col-12 row m-0 p-0 my-5">
70
+ <div class="col-4 m-0 p-0 font-weight-bold">
71
+ <?php echo esc_html__("Logo URL", 'squirrly-seo'); ?>:
72
+ <div class="small text-black-50 my-1 pr-3"><?php echo esc_html__("Select an image from Media Library.", 'squirrly-seo'); ?></div>
73
+ </div>
74
+ <div class="col-8 p-0 input-group input-group-lg">
75
+ <input id="sq_jsonld_logo_organization" type="text" class="form-control bg-input" name="sq_jsonld[Organization][logo][url]" value="<?php echo((isset($jsonld['Organization']['logo']['url']) && $jsonld['Organization']['logo']['url'] <> '') ? esc_url($jsonld['Organization']['logo']['url']) : '') ?>" placeholder="<?php echo esc_html__("Select your file here", 'squirrly-seo') ?>"/>
76
+ <input type="button" class="sq_imageselect btn btn-primary rounded-0" data-destination="sq_jsonld_logo_organization" value="<?php echo esc_html__("Select Image", 'squirrly-seo') ?>"/>
77
+ </div>
78
+ </div>
79
+ <div class="col-12 row m-0 p-0 my-5">
80
+ <div class="col-4 m-0 p-0 font-weight-bold">
81
+ <?php echo esc_html__("Short Description", 'squirrly-seo'); ?>:
82
+ <div class="small text-black-50 my-1 pr-3"><?php echo esc_html__("A short description about the company (20-50 words).", 'squirrly-seo'); ?></div>
83
+ </div>
84
+ <div class="col-8 p-0">
85
+ <textarea class="form-control" name="sq_jsonld[Organization][description]" rows="3"><?php echo((isset($jsonld['Organization']['description']) && $jsonld['Organization']['description'] <> '') ? esc_textarea($jsonld['Organization']['description']) : '') ?></textarea>
86
+ </div>
87
+ </div>
88
+
89
+ <div class="col-12 m-0 p-0 mt-5">
90
+ <button type="submit" class="btn btn-primary btn-lg m-0 p-0 py-2 px-4 rounded-0"><?php echo esc_html__("Save Settings", 'squirrly-seo'); ?></button>
91
+ </div>
92
+
93
+ </div>
94
+ </div>
95
+ <div id="personal" class="col-12 py-0 px-4 m-0 tab-panel">
96
 
97
  <div class="col-12 m-0 p-0 my-2">
98
  <h3 class="card-title"><?php echo esc_html__("Personal Brand / Author", 'squirrly-seo'); ?>
171
 
172
  </div>
173
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  <div id="woocommerce" class="col-12 py-0 px-4 m-0 tab-panel">
175
 
176
  <div class="col-12 m-0 p-0 my-2">
view/SeoSettings/Tweaks.php CHANGED
@@ -106,8 +106,8 @@
106
  <?php
107
  $pname = 'home';
108
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
109
- <div class="offset-2 small text-danger">
110
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
111
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
112
  </a>
113
  </div>
@@ -137,8 +137,8 @@
137
  <?php
138
  $pname = 'post';
139
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
140
- <div class="offset-2 small text-danger">
141
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
142
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
143
  </a>
144
  </div>
@@ -156,8 +156,8 @@
156
  <?php
157
  $pname = 'attachment';
158
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
159
- <div class="offset-2 small text-danger">
160
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
161
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
162
  </a>
163
  </div>
@@ -175,8 +175,8 @@
175
  <?php
176
  $pname = 'category';
177
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
178
- <div class="offset-2 small text-danger">
179
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
180
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
181
  </a>
182
  </div>
@@ -194,8 +194,8 @@
194
  <?php
195
  $pname = 'tag';
196
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
197
- <div class="offset-2 small text-danger">
198
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
199
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
200
  </a>
201
  </div>
@@ -213,8 +213,8 @@
213
  <?php
214
  $pname = 'page';
215
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
216
- <div class="offset-2 small text-danger">
217
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
218
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
219
  </a>
220
  </div>
@@ -232,8 +232,8 @@
232
  <?php
233
  $pname = 'archive';
234
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
235
- <div class="offset-2 small text-danger">
236
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
237
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
238
  </a>
239
  </div>
@@ -274,8 +274,8 @@
274
  <?php
275
  $pname = 'product';
276
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
277
- <div class="offset-2 small text-danger">
278
- <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=nav-$pname")) ?>">
279
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
280
  </a>
281
  </div>
@@ -426,7 +426,7 @@
426
  <h3 class="card-title"><?php echo esc_html__("Redirect Broken URLs", 'squirrly-seo'); ?></h3>
427
 
428
  <div class="col-12 m-0 p-0 mt-3">
429
- <button type="submit" class="btn btn-primary btn-lg m-0 p-0 py-2 px-4 rounded-0"><?php echo esc_html__(" Manage redirects for each Post Type", 'squirrly-seo'); ?> <i class="fa-solid fa-link"></i></button>
430
  </div>
431
 
432
  <div class="sq_tips col-12 m-0 p-0 my-5">
106
  <?php
107
  $pname = 'home';
108
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
109
+ <div class="small text-danger ml-5">
110
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
111
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
112
  </a>
113
  </div>
137
  <?php
138
  $pname = 'post';
139
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
140
+ <div class="small text-danger ml-5">
141
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
142
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
143
  </a>
144
  </div>
156
  <?php
157
  $pname = 'attachment';
158
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
159
+ <div class="small text-danger ml-5">
160
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
161
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
162
  </a>
163
  </div>
175
  <?php
176
  $pname = 'category';
177
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
178
+ <div class="small text-danger ml-5">
179
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
180
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
181
  </a>
182
  </div>
194
  <?php
195
  $pname = 'tag';
196
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
197
+ <div class="small text-danger ml-5">
198
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
199
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
200
  </a>
201
  </div>
213
  <?php
214
  $pname = 'page';
215
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
216
+ <div class="small text-danger ml-5">
217
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
218
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
219
  </a>
220
  </div>
232
  <?php
233
  $pname = 'archive';
234
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
235
+ <div class="small text-danger ml-5">
236
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
237
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
238
  </a>
239
  </div>
274
  <?php
275
  $pname = 'product';
276
  if (isset($patterns[$pname]['do_sitemap']) && !$patterns[$pname]['do_sitemap']) { ?>
277
+ <div class="small text-danger ml-5">
278
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation', array("#tab=sq_$pname")) ?>">
279
  <?php echo esc_html__("Deactivated from SEO Automation.", 'squirrly-seo'); ?>
280
  </a>
281
  </div>
426
  <h3 class="card-title"><?php echo esc_html__("Redirect Broken URLs", 'squirrly-seo'); ?></h3>
427
 
428
  <div class="col-12 m-0 p-0 mt-3">
429
+ <a href="<?php echo SQ_Classes_Helpers_Tools::getAdminUrl('sq_automation', 'automation#tab=sq_post') ?>" class="btn btn-primary btn-lg m-0 p-0 py-2 px-4 rounded-0"><?php echo esc_html__(" Manage redirects for each Post Type", 'squirrly-seo'); ?> <i class="fa-solid fa-link"></i></a>
430
  </div>
431
 
432
  <div class="sq_tips col-12 m-0 p-0 my-5">