SmartCrawl SEO - Version 2.2.2.4

Version Description

  • Fix: don't show raw shortcodes in auto-generated meta description
  • Fix: better compatibility of readability and SEO analysis with page builders
  • Fix: made Google preview in the SC metabox more accurate
Download this release

Release Info

Developer khaxan
Plugin Icon 128x128 SmartCrawl SEO
Version 2.2.2.4
Comparing to
See all releases

Code changes from version 2.2.2.3 to 2.2.2.4

changelog.txt CHANGED
@@ -2,6 +2,12 @@ Plugin Name: SmartCrawl SEO
2
 
3
  Change Log:
4
  ----------------------------------------------------------------------
 
 
 
 
 
 
5
  2.2.2.3 - 2018-08-31
6
  ----------------------------------------------------------------------
7
  - Fix: fixed SEO checkup for free version
2
 
3
  Change Log:
4
  ----------------------------------------------------------------------
5
+ 2.2.2.4 - 2018-09-25
6
+ ----------------------------------------------------------------------
7
+ - Fix: don't show raw shortcodes in auto-generated meta description
8
+ - Fix: better compatibility of readability and SEO analysis with page builders
9
+ - Fix: made Google preview in the SC metabox more accurate
10
+
11
  2.2.2.3 - 2018-08-31
12
  ----------------------------------------------------------------------
13
  - Fix: fixed SEO checkup for free version
class-mappings.php CHANGED
@@ -4,6 +4,7 @@ return array(
4
  // Classes in includes/core/
5
  'Smartcrawl_AIOSEOP_Importer' => '/core/class-wds-aioseop-importer.php',
6
  'Smartcrawl_Checks' => '/core/class-wds-checks.php',
 
7
  'Smartcrawl_Controller_Analysis' => '/core/class-wds-controller-analysis.php',
8
  'Smartcrawl_Controller_Cron' => '/core/class-wds-controller-cron.php',
9
  'Smartcrawl_Controller_Hub' => '/core/class-wds-controller-hub.php',
4
  // Classes in includes/core/
5
  'Smartcrawl_AIOSEOP_Importer' => '/core/class-wds-aioseop-importer.php',
6
  'Smartcrawl_Checks' => '/core/class-wds-checks.php',
7
+ 'Smartcrawl_Compatibility' => '/core/class-wds-compatibility.php',
8
  'Smartcrawl_Controller_Analysis' => '/core/class-wds-controller-analysis.php',
9
  'Smartcrawl_Controller_Cron' => '/core/class-wds-controller-cron.php',
10
  'Smartcrawl_Controller_Hub' => '/core/class-wds-controller-hub.php',
includes/admin/admin.php CHANGED
@@ -111,6 +111,8 @@ class Smartcrawl_Admin extends Smartcrawl_Renderable {
111
  Smartcrawl_Metabox::run();
112
  Smartcrawl_Taxonomy::run();
113
  }
 
 
114
  }
115
 
116
  /**
111
  Smartcrawl_Metabox::run();
112
  Smartcrawl_Taxonomy::run();
113
  }
114
+
115
+ Smartcrawl_Compatibility::run();
116
  }
117
 
118
  /**
includes/admin/metabox.php CHANGED
@@ -85,12 +85,10 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
85
  */
86
  public function json_create_preview() {
87
  $data = $this->get_request_data();
88
- $title = sanitize_text_field( smartcrawl_get_array_value( $data, 'title' ) );
89
- $description = sanitize_text_field( smartcrawl_get_array_value( $data, 'description' ) );
90
  $post_id = (int) smartcrawl_get_array_value( $data, 'post_id' );
91
  $result = array( 'success' => false );
92
 
93
- if ( is_null( $title ) || is_null( $description ) || empty( $post_id ) ) {
94
  wp_send_json( $result );
95
 
96
  return;
@@ -99,9 +97,7 @@ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
99
  $latest_post_version = smartcrawl_get_latest_post_version( $post_id );
100
  $result['success'] = true;
101
  $result['markup'] = $this->_load( 'metabox/metabox-preview', array(
102
- 'post' => $latest_post_version,
103
- 'title' => $title,
104
- 'description' => $description,
105
  ) );
106
 
107
  wp_send_json( $result );
85
  */
86
  public function json_create_preview() {
87
  $data = $this->get_request_data();
 
 
88
  $post_id = (int) smartcrawl_get_array_value( $data, 'post_id' );
89
  $result = array( 'success' => false );
90
 
91
+ if ( empty( $post_id ) ) {
92
  wp_send_json( $result );
93
 
94
  return;
97
  $latest_post_version = smartcrawl_get_latest_post_version( $post_id );
98
  $result['success'] = true;
99
  $result['markup'] = $this->_load( 'metabox/metabox-preview', array(
100
+ 'post' => $latest_post_version,
 
 
101
  ) );
102
 
103
  wp_send_json( $result );
includes/admin/templates/metabox/metabox-preview.php CHANGED
@@ -6,53 +6,23 @@
6
  */
7
 
8
  $post = empty( $post ) ? null : $post;
9
-
10
- // Date.
11
- $date = $post ? date( 'M j, Y', strtotime( $post->post_date ) ) : date( 'M j, Y' );
12
- // Title.
13
- $title = empty( $title ) ? smartcrawl_get_value( 'title' ) : $title;
14
- if ( empty( $title ) && $post ) {
15
- $title = $post->post_title;
16
- }
17
- if ( empty( $title ) ) {
18
- $title = esc_html__( 'Dummy Title', 'wds' );
19
- }
20
- if ( is_object( $post ) ) {
21
- $title = smartcrawl_replace_vars( $title, (array) $post );
22
  }
23
 
24
- // Description.
25
- $description = empty( $description ) ? smartcrawl_get_value( 'metadesc' ) : $description;
26
- if ( empty( $description ) && $post ) {
27
- $description = $post->post_excerpt;
28
- }
29
- if ( empty( $description ) && $post ) {
30
- $description = substr( strip_tags( $post->post_content ), 0, 130 );
31
- }
32
- if ( empty( $description ) ) {
33
- $description = __( 'Dummy description', 'wds' );
34
- }
35
- if ( is_object( $post ) ) {
36
- $description = smartcrawl_replace_vars( $description, (array) $post );
37
- }
38
-
39
- // Slug.
40
- $slug = ! empty( $post->post_name ) ? $post->post_name : sanitize_title( $title );
41
  ?>
42
  <div class="wds-metabox-preview">
43
  <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
44
 
45
  <?php
46
  if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
47
- $link = sprintf(
48
- '%s/%s/',
49
- str_replace( 'http://', '', get_bloginfo( 'url' ) ),
50
- $slug
51
- );
52
- if ( ! empty( $post ) && is_object( $post ) && ! empty( $post->ID ) ) {
53
- $link = get_permalink( $post->ID );
54
- }
55
-
56
  $this->_render( 'onpage/onpage-preview', array(
57
  'link' => esc_url( $link ),
58
  'title' => esc_html( $title ),
6
  */
7
 
8
  $post = empty( $post ) ? null : $post;
9
+ if ( ! $post ) {
10
+ return;
 
 
 
 
 
 
 
 
 
 
 
11
  }
12
 
13
+ $post_parent = wp_is_post_revision( $post->ID );
14
+ $link = empty( $post_parent ) ? get_permalink( $post->ID ) : get_permalink( $post_parent );
15
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
16
+ $resolver->simulate_post( $post->ID );
17
+ $title = Smartcrawl_OnPage::get()->get_title();
18
+ $description = Smartcrawl_OnPage::get()->get_description();
19
+ $resolver->stop_simulation();
 
 
 
 
 
 
 
 
 
 
20
  ?>
21
  <div class="wds-metabox-preview">
22
  <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
23
 
24
  <?php
25
  if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
 
 
 
 
 
 
 
 
 
26
  $this->_render( 'onpage/onpage-preview', array(
27
  'link' => esc_url( $link ),
28
  'title' => esc_html( $title ),
includes/core/class-wds-compatibility.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class Smartcrawl_Compatibility
5
+ *
6
+ * Fixes third-party compatibility issues
7
+ */
8
+ class Smartcrawl_Compatibility {
9
+ /**
10
+ * Singleton instance
11
+ *
12
+ * @var Smartcrawl_Compatibility
13
+ */
14
+ private static $_instance;
15
+
16
+ /**
17
+ * Currently running state flag
18
+ *
19
+ * @var bool
20
+ */
21
+ private $_is_running = false;
22
+
23
+ /**
24
+ * Constructor
25
+ */
26
+ private function __construct() {
27
+ }
28
+
29
+ /**
30
+ * Boot controller listeners
31
+ *
32
+ * Do it only once, if they're already up do nothing
33
+ *
34
+ * @return bool Status
35
+ */
36
+ public static function run() {
37
+ $me = self::get();
38
+ if ( $me->is_running() ) {
39
+ return false;
40
+ }
41
+
42
+ return $me->_add_hooks();
43
+ }
44
+
45
+ /**
46
+ * Obtain instance without booting up
47
+ *
48
+ * @return Smartcrawl_Compatibility instance
49
+ */
50
+ public static function get() {
51
+ if ( empty( self::$_instance ) ) {
52
+ self::$_instance = new self();
53
+ }
54
+
55
+ return self::$_instance;
56
+ }
57
+
58
+ /**
59
+ * Check if we already have the actions bound
60
+ *
61
+ * @return bool Status
62
+ */
63
+ public function is_running() {
64
+ return $this->_is_running;
65
+ }
66
+
67
+ /**
68
+ * Bind listening actions
69
+ *
70
+ * @return bool
71
+ */
72
+ private function _add_hooks() {
73
+ add_action( 'init', array( $this, 'load_divi_in_ajax' ), - 10 );
74
+
75
+ $this->_is_running = true;
76
+
77
+ return true;
78
+ }
79
+
80
+ /**
81
+ * Divi doesn't usually load its shortcodes during ajax requests but we need these shortcodes in order to
82
+ * render an accurate preview.
83
+ *
84
+ * Force Divi to load during our requests.
85
+ */
86
+ public function load_divi_in_ajax() {
87
+ $data = isset( $_POST['_wds_nonce'] )
88
+ && (
89
+ wp_verify_nonce( $_POST['_wds_nonce'], 'wds-metabox-nonce' )
90
+ || wp_verify_nonce( $_POST['_wds_nonce'], 'wds-onpage-nonce' )
91
+ );
92
+
93
+ if ( ! empty( $data ) && is_admin() && smartcrawl_is_switch_active( 'DOING_AJAX' ) ) {
94
+ $_POST['et_load_builder_modules'] = '1';
95
+ }
96
+ }
97
+ }
includes/core/class-wds-controller-cron-free.php DELETED
@@ -1,395 +0,0 @@
1
- <?php
2
- /**
3
- * Periodical execution module
4
- *
5
- * @package wpmu-dev-seo
6
- */
7
-
8
- /**
9
- * Cron controller
10
- */
11
- class Smartcrawl_Controller_Cron {
12
-
13
- const ACTION_CRAWL = 'wds-cron-start_service';
14
- const ACTION_CHECKUP = 'wds-cron-start_checkup';
15
- const ACTION_CHECKUP_RESULT = 'wds-cron-checkup_result';
16
-
17
- /**
18
- * Singleton instance
19
- *
20
- * @var Smartcrawl_Controller_Cron
21
- */
22
- private static $_instance;
23
-
24
- /**
25
- * Controller actively running flag
26
- *
27
- * @var bool
28
- */
29
- private $_is_running = false;
30
-
31
- /**
32
- * Constructor
33
- */
34
- private function __construct() {
35
- }
36
-
37
- /**
38
- * Singleton instance getter
39
- *
40
- * @return object Smartcrawl_Controller_Cron instance
41
- */
42
- public static function get() {
43
- if ( empty( self::$_instance ) ) {
44
- self::$_instance = new self();
45
- }
46
-
47
- return self::$_instance;
48
- }
49
-
50
- /**
51
- * Boots controller interface
52
- *
53
- * @return bool
54
- */
55
- public function run() {
56
- if ( ! $this->is_running() ) {
57
- $this->_add_hooks();
58
- }
59
-
60
- return $this->is_running();
61
- }
62
-
63
- /**
64
- * Check whether controller interface is active
65
- *
66
- * @return bool
67
- */
68
- public function is_running() {
69
- return ! ! $this->_is_running;
70
- }
71
-
72
- /**
73
- * Sets up controller listening interface
74
- *
75
- * Also sets up controller running flag approprietly.
76
- *
77
- * @return void
78
- */
79
- private function _add_hooks() {
80
-
81
- add_filter( 'cron_schedules', array( $this, 'add_cron_schedule_intervals' ) );
82
-
83
- $copts = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_SITEMAP );
84
- if ( ! empty( $copts['crawler-cron-enable'] ) ) {
85
- add_action( $this->get_filter( self::ACTION_CRAWL ), array( $this, 'start_crawl' ) );
86
- }
87
-
88
- $chopts = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_CHECKUP );
89
- if ( ! empty( $chopts['checkup-cron-enable'] ) ) {
90
- add_action( $this->get_filter( self::ACTION_CHECKUP ), array( $this, 'start_checkup' ) );
91
- add_action( $this->get_filter( self::ACTION_CHECKUP_RESULT ), array( $this, 'check_checkup_result' ) );
92
- }
93
-
94
- $this->_is_running = true;
95
- }
96
-
97
- /**
98
- * Gets prefixed filter action
99
- *
100
- * @param string $what Filter action suffix.
101
- *
102
- * @return string Full filter action
103
- */
104
- public function get_filter( $what ) {
105
- return 'wds-controller-cron-' . $what;
106
- }
107
-
108
- /**
109
- * Controller interface stop
110
- *
111
- * @return bool
112
- */
113
- public function stop() {
114
- if ( $this->is_running() ) {
115
- $this->_remove_hooks();
116
- }
117
-
118
- return $this->is_running();
119
- }
120
-
121
- /**
122
- * Tears down controller listening interface
123
- *
124
- * Also sets up controller running flag approprietly.
125
- *
126
- * @return void
127
- */
128
- private function _remove_hooks() {
129
-
130
- remove_action( $this->get_filter( self::ACTION_CRAWL ), array( $this, 'start_crawl' ) );
131
- remove_action( $this->get_filter( self::ACTION_CHECKUP ), array( $this, 'start_checkup' ) );
132
- remove_filter( 'cron_schedules', array( $this, 'add_cron_schedule_intervals' ) );
133
-
134
- $this->_is_running = false;
135
- }
136
-
137
- /**
138
- * Gets estimated next event time based on parameters
139
- *
140
- * @param int $pivot Pivot time - base estimation relative to this (UNIX timestamp).
141
- * @param strng $frequency Valid frequency interval.
142
- * @param int $dow Day of the week (0-6).
143
- * @param int $tod Time of day (0-23).
144
- *
145
- * @return int Estimated next event time as UNIX timestamp
146
- */
147
- public function get_estimated_next_event( $pivot, $frequency, $dow, $tod ) {
148
- $start = $this->get_initial_pivot_time( $pivot, $frequency );
149
- $offset = $start + ( $dow * DAY_IN_SECONDS );
150
- $time = strtotime( date( "Y-m-d {$tod}:00", $offset ) );
151
- $freqs = array(
152
- 'daily' => DAY_IN_SECONDS,
153
- 'weekly' => 7 * DAY_IN_SECONDS,
154
- 'monthly' => 30 * DAY_IN_SECONDS,
155
- );
156
- if ( $time > $pivot ) {
157
- return $time;
158
- }
159
-
160
- $freq = $freqs[ $this->get_valid_frequency( $frequency ) ];
161
-
162
- return $time + $freq;
163
- }
164
-
165
- /**
166
- * Gets primed pivot time for a given frequency value
167
- *
168
- * @param int $pivot Raw pivot UNIX timestamp.
169
- * @param string $frequency Frequency interval.
170
- *
171
- * @return int Zeroed pivot time for given frequency interval
172
- */
173
- public function get_initial_pivot_time( $pivot, $frequency ) {
174
- $frequency = $this->get_valid_frequency( $frequency );
175
-
176
- if ( 'daily' === $frequency ) {
177
- return strtotime( date( 'Y-m-d 00:00', $pivot ) );
178
- }
179
-
180
- if ( 'weekly' === $frequency ) {
181
- $monday = strtotime( 'this monday', $pivot );
182
- if ( $monday > $pivot ) {
183
- return $monday - ( 7 * DAY_IN_SECONDS );
184
- }
185
-
186
- return $monday;
187
- }
188
-
189
- if ( 'monthly' === $frequency ) {
190
- $day = (int) date( 'd', $pivot );
191
- $today = strtotime( date( 'Y-m-d H:i', $pivot ) );
192
-
193
- return $today - ( $day * DAY_IN_SECONDS );
194
- }
195
-
196
- return $pivot;
197
- }
198
-
199
- /**
200
- * Gets validated frequency interval
201
- *
202
- * @param string $freq Raw frequency string.
203
- *
204
- * @return string
205
- */
206
- public function get_valid_frequency( $freq ) {
207
- if ( in_array( $freq, array_keys( $this->get_frequencies() ), true ) ) {
208
- return $freq;
209
- }
210
-
211
- return $this->get_default_frequency();
212
- }
213
-
214
- /**
215
- * Gets a list of frequency intervals
216
- *
217
- * @return array
218
- */
219
- public function get_frequencies() {
220
- return array(
221
- 'daily' => __( 'Daily', 'wds' ),
222
- 'weekly' => __( 'Weekly', 'wds' ),
223
- 'monthly' => __( 'Monthly', 'wds' ),
224
- );
225
- }
226
-
227
- /**
228
- * Gets default frequency interval (fallback)
229
- *
230
- * @return string
231
- */
232
- public function get_default_frequency() {
233
- return 'weekly';
234
- }
235
-
236
- /**
237
- * Checks whether we have a next event scheduled
238
- *
239
- * @param string $event Optional event name, defaults to service start.
240
- *
241
- * @return bool
242
- */
243
- public function has_next_event( $event = false ) {
244
- return ! ! $this->get_next_event( $event );
245
- }
246
-
247
- /**
248
- * Gets next scheduled event time
249
- *
250
- * @param string $event Optional event name, defaults to service start.
251
- *
252
- * @return int|bool UNIX timestamp or false if no next event
253
- */
254
- public function get_next_event( $event = false ) {
255
- $event = ! empty( $event ) ? $event : self::ACTION_CRAWL;
256
-
257
- return wp_next_scheduled( $this->get_filter( $event ) );
258
- }
259
-
260
- /**
261
- * Unschedules a particular event
262
- *
263
- * @param string $event Optional event name, defaults to service start.
264
- *
265
- * @return bool
266
- */
267
- public function unschedule( $event = false ) {
268
- return false; // Not in the free version.
269
- }
270
-
271
- /**
272
- * Schedules a particular event
273
- *
274
- * @param string $event Event name.
275
- * @param int $time UNIX timestamp.
276
- * @param string $recurrence Event recurrence.
277
- *
278
- * @return bool
279
- */
280
- public function schedule( $event, $time, $recurrence = false ) {
281
- return false; // Not in the free version.
282
- }
283
-
284
- /**
285
- * Sets up overall schedules
286
- *
287
- * @uses Smartcrawl_Controller_Cron::set_up_checkup_schedule()
288
- * @uses Smartcrawl_Controller_Cron::set_up_crawler_schedule()
289
- *
290
- * @return void
291
- */
292
- public function set_up_schedule() {
293
- Smartcrawl_Logger::debug( 'Setting up schedules' );
294
- $this->set_up_crawler_schedule();
295
- $this->set_up_checkup_schedule();
296
- }
297
-
298
- /**
299
- * Sets up crawl service schedule
300
- *
301
- * @return bool
302
- */
303
- public function set_up_crawler_schedule() {
304
- return false; // Not in the free version.
305
- }
306
-
307
- /**
308
- * Sets up checkup service schedule
309
- *
310
- * @return bool
311
- */
312
- public function set_up_checkup_schedule() {
313
- return false; // Not in the free version.
314
- }
315
-
316
- /**
317
- * Starts crawl
318
- *
319
- * @return bool
320
- */
321
- public function start_crawl() {
322
- return false; // Not in the free version.
323
- }
324
-
325
- /**
326
- * Starts checkup
327
- *
328
- * @return bool
329
- */
330
- public function start_checkup() {
331
- return false; // Not in the free version.
332
- }
333
-
334
- /**
335
- * Checks checkup result for cron action
336
- *
337
- * Schedules another singular check after timeout if not ready yet.
338
- *
339
- * @return bool
340
- */
341
- public function check_checkup_result() {
342
- return false; // Not in the free version.
343
- }
344
-
345
- /**
346
- * Gets time delay for checkup ping individual requests
347
- *
348
- * @return int
349
- */
350
- public function get_checkup_ping_delay() {
351
- return 600;
352
- }
353
-
354
- /**
355
- * Set up cron schedule intervals
356
- *
357
- * @param array $intervals Intervals known this far.
358
- *
359
- * @return array
360
- */
361
- public function add_cron_schedule_intervals( $intervals ) {
362
- if ( ! is_array( $intervals ) ) {
363
- return $intervals;
364
- }
365
-
366
- if ( ! isset( $intervals['daily'] ) ) {
367
- $intervals['daily'] = array(
368
- 'display' => __( 'SmartCrawl Daily', 'wds' ),
369
- 'interval' => DAY_IN_SECONDS,
370
- );
371
- }
372
-
373
- if ( ! isset( $intervals['weekly'] ) ) {
374
- $intervals['weekly'] = array(
375
- 'display' => __( 'SmartCrawl Weekly', 'wds' ),
376
- 'interval' => 7 * DAY_IN_SECONDS,
377
- );
378
- }
379
-
380
- if ( ! isset( $intervals['monthly'] ) ) {
381
- $intervals['monthly'] = array(
382
- 'display' => __( 'SmartCrawl Monthly', 'wds' ),
383
- 'interval' => 30 * DAY_IN_SECONDS,
384
- );
385
- }
386
-
387
- return $intervals;
388
- }
389
-
390
- /**
391
- * Clone
392
- */
393
- private function __clone() {
394
- }
395
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/core/class-wds-controller-hub-free.php DELETED
@@ -1,174 +0,0 @@
1
- <?php
2
-
3
- class Smartcrawl_Controller_Hub {
4
-
5
-
6
- private static $_instance;
7
-
8
- private $_is_running = false;
9
-
10
- private function __construct() {
11
- }
12
-
13
- /**
14
- * Boot controller listeners
15
- *
16
- * Do it only once, if they're already up do nothing
17
- *
18
- * @return bool Status
19
- */
20
- public static function serve() {
21
- $me = self::get();
22
- if ( $me->is_running() ) {
23
- return false;
24
- }
25
-
26
- $me->_add_hooks();
27
-
28
- return true;
29
- }
30
-
31
- /**
32
- * Obtain instance without booting up
33
- *
34
- * @return Smartcrawl_Controller_Hub instance
35
- */
36
- public static function get() {
37
- if ( empty( self::$_instance ) ) {
38
- self::$_instance = new self();
39
- }
40
-
41
- return self::$_instance;
42
- }
43
-
44
- /**
45
- * Check if we already have the actions bound
46
- *
47
- * @return bool Status
48
- */
49
- public function is_running() {
50
- return $this->_is_running;
51
- }
52
-
53
- /**
54
- * Bind listening actions
55
- */
56
- private function _add_hooks() {
57
- // Passthrough.
58
- $this->_is_running = true;
59
- }
60
-
61
- /**
62
- * Registers Hub action listeners
63
- *
64
- * @param array $actions All the Hub actions registered this far
65
- *
66
- * @return array Augmented actions
67
- */
68
- public function register_hub_actions( $actions ) {
69
- // Passthrough.
70
- return $actions;
71
- }
72
-
73
- /**
74
- * Fresh ignores from the Hub action handler
75
- *
76
- * Updates local ignores list when the Hub storage is updated.
77
- *
78
- * @param object $params Hub-provided parameters
79
- * @param string $action Action called
80
- *
81
- * @return bool Status
82
- */
83
- public function sync_ignores_list( $params = array(), $action = '' ) {
84
- return false; // Not in the free version.
85
- }
86
-
87
- /**
88
- * Fresh ignores from the Hub action handler
89
- *
90
- * Updates local ignores list when the Hub storage is updated.
91
- *
92
- * @param object $params Hub-provided parameters
93
- * @param string $action Action called
94
- */
95
- public function json_sync_ignores_list( $params = array(), $action = '' ) {
96
- }
97
-
98
- /**
99
- * Purge ignores from the Hub action handler
100
- *
101
- * Purges local ignores list when the Hub storage is purged.
102
- *
103
- * @param object $params Hub-provided parameters
104
- * @param string $action Action called
105
- *
106
- * @return bool Status
107
- */
108
- public function purge_ignores_list( $params = array(), $action = '' ) {
109
- return false; // Not in the free version.
110
- }
111
-
112
- /**
113
- * Purge ignores from the Hub action handler
114
- *
115
- * Purges local ignores list when the Hub storage is purged.
116
- *
117
- * @param object $params Hub-provided parameters
118
- * @param string $action Action called
119
- */
120
- public function json_purge_ignores_list( $params = array(), $action = '' ) {
121
- }
122
-
123
- /**
124
- * Fresh extras from the Hub action handler
125
- *
126
- * Updates local extra URLs list when the Hub storage is updated.
127
- *
128
- * @param object $params Hub-provided parameters
129
- * @param string $action Action called
130
- *
131
- * @return bool Status
132
- */
133
- public function sync_extras_list( $params = array(), $action = '' ) {
134
- return false; // Not in the free version.
135
- }
136
-
137
- /**
138
- * Fresh extras from the Hub action handler
139
- *
140
- * Updates local extra URLs list when the Hub storage is updated.
141
- *
142
- * @param object $params Hub-provided parameters
143
- * @param string $action Action called
144
- */
145
- public function json_sync_extras_list( $params = array(), $action = '' ) {
146
- }
147
-
148
- /**
149
- * Purge extras from the Hub action handler
150
- *
151
- * Purges local extra URLs list when the Hub storage is updated.
152
- *
153
- * @param object $params Hub-provided parameters
154
- * @param string $action Action called
155
- *
156
- * @return bool Status
157
- */
158
- public function purge_extras_list( $params = array(), $action = '' ) {
159
- return false; // Not in the free version.
160
- }
161
-
162
- /**
163
- * Purge extras from the Hub action handler
164
- *
165
- * Purges local extra URLs list when the Hub storage is updated.
166
- *
167
- * @param object $params Hub-provided parameters
168
- * @param string $action Action called
169
- */
170
- public function json_purge_extras_list( $params = array(), $action = '' ) {
171
- }
172
-
173
-
174
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/core/core.php CHANGED
@@ -356,7 +356,7 @@ function _wds_hb_convert_tri( $num, $tri ) {
356
  */
357
  function smartcrawl_get_trimmed_excerpt( $excerpt, $contents ) {
358
  $string = $excerpt ? $excerpt : $contents;
359
- $string = trim( preg_replace( '/\r|\n/', ' ', strip_shortcodes( htmlspecialchars( wp_strip_all_tags( strip_shortcodes( $string ) ), ENT_QUOTES ) ) ) );
360
 
361
  return ( preg_match( '/.{156,}/um', $string ) )
362
  ? preg_replace( '/(.{0,152}).*/um', '$1', $string ) . '...'
356
  */
357
  function smartcrawl_get_trimmed_excerpt( $excerpt, $contents ) {
358
  $string = $excerpt ? $excerpt : $contents;
359
+ $string = trim( preg_replace( '/\r|\n/', ' ', strip_shortcodes( htmlspecialchars( wp_strip_all_tags( do_shortcode( $string ) ), ENT_QUOTES ) ) ) );
360
 
361
  return ( preg_match( '/.{156,}/um', $string ) )
362
  ? preg_replace( '/(.{0,152}).*/um', '$1', $string ) . '...'
includes/core/service/class-wds-checkup-rest-service-free.php DELETED
@@ -1,148 +0,0 @@
1
- <?php
2
- /**
3
- * REST implementation of the checkup service, v1.0
4
- *
5
- * @package wpmu-dev-seo
6
- */
7
-
8
- /**
9
- * Checkup service REST implementation
10
- */
11
- class Smartcrawl_Checkup_Rest_Service extends Smartcrawl_Checkup_Service_Implementation {
12
-
13
- /**
14
- * Gets all verbs known by the service
15
- *
16
- * @return array
17
- */
18
- public function get_known_verbs() {
19
- return array( 'start', 'result' );
20
- }
21
-
22
- /**
23
- * Checks if service verb supports results caching
24
- *
25
- * @param string $verb Service verb.
26
- *
27
- * @return bool
28
- */
29
- public function is_cacheable_verb( $verb ) {
30
- return false;
31
- }
32
-
33
- /**
34
- * Gets full request URL for a service verb
35
- *
36
- * @param string $verb Service verb.
37
- *
38
- * @return string|bool
39
- */
40
- public function get_request_url( $verb ) {
41
- if ( empty( $verb ) ) {
42
- return false;
43
- }
44
-
45
- $domain = apply_filters(
46
- $this->get_filter( 'domain' ),
47
- network_site_url()
48
- );
49
- if ( empty( $domain ) ) {
50
- return false;
51
- }
52
-
53
- $query_url = http_build_query( array(
54
- 'domain' => $domain,
55
- ) );
56
- $query_url = $query_url && preg_match( '/^\?/', $query_url ) ? $query_url : "?{$query_url}";
57
-
58
- $request_url = trailingslashit( $this->get_service_base_url() ) .
59
- $verb .
60
- $query_url;
61
-
62
- return $request_url;
63
- }
64
-
65
- /**
66
- * Gets service base URL
67
- *
68
- * @return string
69
- */
70
- public function get_service_base_url() {
71
- $base_url = 'https://premium.wpmudev.org/';
72
-
73
- if ( defined( 'WPMUDEV_CUSTOM_API_SERVER' ) && WPMUDEV_CUSTOM_API_SERVER ) {
74
- $base_url = trailingslashit( WPMUDEV_CUSTOM_API_SERVER );
75
- }
76
-
77
- $api = apply_filters(
78
- $this->get_filter( 'api-endpoint' ),
79
- 'api'
80
- );
81
-
82
- $namespace = apply_filters(
83
- $this->get_filter( 'api-namespace' ),
84
- 'seo-checkup/v1'
85
- );
86
-
87
- return trailingslashit( $base_url ) . trailingslashit( $api ) . trailingslashit( $namespace );
88
- }
89
-
90
- /**
91
- * Gets request arguments array for a verb
92
- *
93
- * @param string $verb Service verb.
94
- *
95
- * @return array
96
- */
97
- public function get_request_arguments( $verb ) {
98
- $args = array(
99
- 'method' => 'GET',
100
- 'timeout' => 40,
101
- 'sslverify' => false,
102
- );
103
-
104
- return $args;
105
- }
106
-
107
- /**
108
- * Handles service error response
109
- *
110
- * @param object $response WP HTTP API response.
111
- */
112
- public function handle_error_response( $response, $verb ) {
113
- if ( 'emails' === $verb ) {
114
- return false;
115
- }
116
-
117
- $body = wp_remote_retrieve_body( $response );
118
- if ( empty( $body ) ) {
119
- return false;
120
- }
121
-
122
- $error = json_decode( $body, true );
123
- if ( empty( $error['message'] ) ) {
124
- return false;
125
- }
126
-
127
- $this->set_cached_error( 'checkup', $error['message'] );
128
- }
129
-
130
- /**
131
- * Gets crawl starting verb
132
- *
133
- * @return string
134
- */
135
- public function get_start_verb() {
136
- return 'start';
137
- }
138
-
139
- /**
140
- * Gets results fetching verb
141
- *
142
- * @return string
143
- */
144
- public function get_result_verb() {
145
- return 'result';
146
- }
147
-
148
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/core/service/class-wds-seo-service-free.php DELETED
@@ -1,216 +0,0 @@
1
- <?php
2
-
3
- class Smartcrawl_Seo_Service extends Smartcrawl_Service {
4
-
5
- const ERR_BASE_API_ISSUE = 40;
6
- const ERR_BASE_CRAWL_RUN = 51;
7
- const ERR_BASE_COOLDOWN = 52;
8
- const ERR_BASE_CRAWL_ERR = 53;
9
- const ERR_BASE_GENERIC = 59;
10
-
11
- public function get_known_verbs() {
12
- return array();
13
- }
14
-
15
- public function is_cacheable_verb( $verb ) {
16
- return false;
17
- }
18
-
19
- public function get_service_base_url() {
20
- return false;
21
- }
22
-
23
- public function get_request_url( $verb ) {
24
- return false;
25
- }
26
-
27
- public function get_request_arguments( $verb ) {
28
- return array();
29
- }
30
-
31
- /**
32
- * Local ignores list sync handler
33
- *
34
- * @return bool Status
35
- */
36
- public function sync_ignores() {
37
- return false;
38
- }
39
-
40
- /**
41
- * Checks whether a call is currently being processed
42
- *
43
- * @return bool
44
- */
45
- public function in_progress() {
46
- $flag = $this->get_progress_flag();
47
-
48
- $expected_timeout = intval( $flag ) + ( HOUR_IN_SECONDS / 4 );
49
- if ( ! empty( $flag ) && is_numeric( $flag ) && time() > $expected_timeout ) {
50
- // Over timeout threshold, clear flag forcefully
51
- $this->stop();
52
- }
53
-
54
- return ! ! $flag;
55
- }
56
-
57
- /**
58
- * Gets progress flag state
59
- *
60
- * @return bool
61
- */
62
- public function get_progress_flag() {
63
- return get_option( $this->get_filter( 'seo-progress' ), false );
64
- }
65
-
66
- /**
67
- * Stops expecting response
68
- *
69
- * @return bool
70
- */
71
- public function stop() {
72
- $this->set_progress_flag( false );
73
-
74
- return true;
75
- }
76
-
77
- /**
78
- * Sets progress flag state
79
- *
80
- * param bool $flag Whether the service check is in progress
81
- *
82
- * @return bool
83
- */
84
- public function set_progress_flag( $flag ) {
85
- if ( ! empty( $flag ) ) {
86
- $flag = time();
87
- }
88
-
89
- return ! ! update_option( $this->get_filter( 'seo-progress' ), $flag );
90
- }
91
-
92
- /**
93
- * Public wrapper for start service method call
94
- *
95
- * @return mixed Service response hash on success, (bool) on failure
96
- */
97
- public function start() {
98
- $this->stop();
99
-
100
- return false;
101
- }
102
-
103
- /**
104
- * Public wrapper for status service method call
105
- *
106
- * @return mixed Service response hash on success, (bool)false on failure
107
- */
108
- public function status() {
109
- return false;
110
- }
111
-
112
- /**
113
- * Public wrapper for result service method call
114
- *
115
- * @return mixed Service response hash on success, (bool)false on failure
116
- */
117
- public function result() {
118
- return false;
119
- }
120
-
121
- /**
122
- * Sets result to new value
123
- *
124
- * Sets both cache and permanent result
125
- *
126
- * @return bool
127
- */
128
- public function set_result( $result ) {
129
- return ! ! update_option( $this->get_filter( 'seo-service-result' ), $result );
130
- }
131
-
132
- /**
133
- * Returns last service run time
134
- *
135
- * Returns either time embedded in results, or the timestamp
136
- * from the results service, whichever is greater.
137
- *
138
- * @return int UNIX timestamp
139
- */
140
- public function get_last_run_timestamp() {
141
- $recorded = (int) get_option( $this->get_filter( 'seo-service-last_runtime' ), 0 );
142
-
143
- $raw = $this->get_result();
144
- $embedded = ! empty( $raw['end'] ) ? (int) $raw['end'] : 0;
145
- if ( empty( $embedded ) && ! empty( $raw['issues']['previous']['timestamp'] ) ) {
146
- $embedded = (int) $raw['issues']['previous']['timestamp'];
147
- }
148
-
149
- return max( $recorded, $embedded );
150
- }
151
-
152
- /**
153
- * Public result getter
154
- *
155
- * @return mixed result
156
- */
157
- public function get_result() {
158
- $result = get_option( $this->get_filter( 'seo-service-result' ), false );
159
-
160
- return $result;
161
- }
162
-
163
- /**
164
- * Sets service last run time
165
- *
166
- * Attempts to use embedded result, and falls back
167
- * to current timestamp
168
- *
169
- * @return bool
170
- */
171
- public function set_last_run_timestamp() {
172
- $raw = $this->get_result();
173
- $timestamp = ! empty( $raw['end'] ) ? (int) $raw['end'] : 0;
174
- if ( empty( $timestamp ) && ! empty( $raw['issues']['previous']['timestamp'] ) ) {
175
- $timestamp = (int) $raw['issues']['previous']['timestamp'];
176
- }
177
-
178
- if ( empty( $timestamp ) ) {
179
- $timestamp = time();
180
- }
181
-
182
- return ! ! update_option( $this->get_filter( 'seo-service-last_runtime' ), $timestamp );
183
- }
184
-
185
- public function handle_error_response( $response, $verb ) {
186
- $body = wp_remote_retrieve_body( $response );
187
- $data = json_decode( $body, true );
188
- if ( empty( $body ) || empty( $data ) ) {
189
- $this->_set_error( __( 'Unspecified error', 'wds' ) );
190
-
191
- return true;
192
- }
193
-
194
- $msg = '';
195
- if ( ! empty( $data['message'] ) ) {
196
- $msg = $data['message'];
197
- }
198
-
199
- if ( ! empty( $data['data']['manage_link'] ) ) {
200
- $url = esc_url( $data['data']['manage_link'] );
201
- $msg .= ' <a href="' . $url . '">' . __( 'Manage', 'wds' ) . '</a>';
202
- }
203
-
204
- if ( ! empty( $msg ) ) {
205
- $this->_set_error( $msg );
206
- }
207
-
208
- return true;
209
- }
210
-
211
- private function _clear_result() {
212
- return ! ! delete_option( $this->get_filter( 'seo-service-result' ) );
213
- }
214
-
215
-
216
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/js/wds-metabox.js CHANGED
@@ -137,9 +137,13 @@
137
  $('.wds-analysis-working', $metabox).remove();
138
  });
139
  };
 
 
 
 
140
  var save = (((wp || {}).autosave || {}).server || {}).triggerSave;
141
  if (save) {
142
- $(document).one('ajaxComplete', cback);
143
  wp.autosave.server.triggerSave();
144
  } else cback();
145
  }
@@ -277,8 +281,8 @@
277
 
278
  $.post(ajaxurl, {
279
  action: "wds-metabox-preview",
280
- title: title,
281
- description: description,
282
  post_id: post_id,
283
  _wds_nonce: _wds_metabox.nonce
284
  }, 'json').done(function (data) {
137
  $('.wds-analysis-working', $metabox).remove();
138
  });
139
  };
140
+ var editorSync = (tinyMCE || {}).triggerSave;
141
+ if (editorSync) {
142
+ editorSync();
143
+ }
144
  var save = (((wp || {}).autosave || {}).server || {}).triggerSave;
145
  if (save) {
146
+ $(document).one('heartbeat-tick.autosave', cback);
147
  wp.autosave.server.triggerSave();
148
  } else cback();
149
  }
281
 
282
  $.post(ajaxurl, {
283
  action: "wds-metabox-preview",
284
+ wds_title: title,
285
+ wds_description: description,
286
  post_id: post_id,
287
  _wds_nonce: _wds_metabox.nonce
288
  }, 'json').done(function (data) {
languages/wpmu-dev-seo.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the SmartCrawl package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: SmartCrawl 2.2.2.3\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wpmu-dev-seo\n"
7
- "POT-Creation-Date: 2018-08-31 13:36:11+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -13,14 +13,14 @@ msgstr ""
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
  "X-Generator: grunt-wp-i18n1.0.2\n"
15
 
16
- #: includes/admin/admin.php:131 includes/admin/settings/settings.php:248
17
  #: includes/admin/settings/settings.php:319
18
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:49
19
  #: includes/admin/templates/onpage/onpage-settings.php:246
20
  msgid "Settings"
21
  msgstr ""
22
 
23
- #: includes/admin/admin.php:166
24
  msgid "Error: options page not found."
25
  msgstr ""
26
 
@@ -28,97 +28,97 @@ msgstr ""
28
  msgid "SmartCrawl"
29
  msgstr ""
30
 
31
- #: includes/admin/admin.php:318 includes/admin/settings/dashboard.php:32
32
  #: includes/admin/templates/dashboard/dashboard.php:18
33
  msgid "Dashboard"
34
  msgstr ""
35
 
36
- #: includes/admin/admin.php:380
37
  msgid ""
38
  "This site discourages search engines from indexing the pages, which will "
39
  "affect your SEO efforts."
40
  msgstr ""
41
 
42
- #: includes/admin/admin.php:381
43
  msgid "You can fix this here"
44
  msgstr ""
45
 
46
- #: includes/admin/metabox.php:119
47
  msgid "{TOTAL_LEFT} characters left"
48
  msgstr ""
49
 
50
- #: includes/admin/metabox.php:120
51
  msgid "Over {MAX_COUNT} characters ({CURRENT_COUNT})"
52
  msgstr ""
53
 
54
- #: includes/admin/metabox.php:121
55
  msgid ""
56
  "Over {MAX_COUNT} characters ({CURRENT_COUNT}) - make sure your SEO title is "
57
  "shorter"
58
  msgstr ""
59
 
60
- #: includes/admin/metabox.php:134
61
  msgid "Analyzing content, please wait a few moments"
62
  msgstr ""
63
 
64
- #: includes/admin/metabox.php:168
65
  msgid "NO ODP (Block Open Directory Project description of the page)"
66
  msgstr ""
67
 
68
- #: includes/admin/metabox.php:169
69
  msgid "NO YDIR (Don't display the Yahoo! Directory titles and abstracts)"
70
  msgstr ""
71
 
72
- #: includes/admin/metabox.php:170 includes/admin/metabox.php:436
73
  msgid "No Archive"
74
  msgstr ""
75
 
76
- #: includes/admin/metabox.php:171 includes/admin/metabox.php:437
77
  msgid "No Snippet"
78
  msgstr ""
79
 
80
- #: includes/admin/metabox.php:174
81
  msgid "Automatic prioritization"
82
  msgstr ""
83
 
84
- #: includes/admin/metabox.php:175
85
  msgid "1 - Highest priority"
86
  msgstr ""
87
 
88
- #: includes/admin/metabox.php:177
89
  msgid "High priority (root pages default)"
90
  msgstr ""
91
 
92
- #: includes/admin/metabox.php:179
93
  msgid "Secondary priority (subpages default)"
94
  msgstr ""
95
 
96
- #: includes/admin/metabox.php:180
97
  msgid "Medium priority"
98
  msgstr ""
99
 
100
- #: includes/admin/metabox.php:184
101
  msgid "Lowest priority"
102
  msgstr ""
103
 
104
- #: includes/admin/metabox.php:392
105
  #: includes/admin/templates/quick-edit-title.php:5
106
  msgid "Title Tag"
107
  msgstr ""
108
 
109
- #: includes/admin/metabox.php:394
110
  msgid "Robots Meta"
111
  msgstr ""
112
 
113
- #: includes/admin/metabox.php:415
114
  msgid "Redirects to %s"
115
  msgstr ""
116
 
117
- #: includes/admin/metabox.php:434
118
  msgid "No ODP"
119
  msgstr ""
120
 
121
- #: includes/admin/metabox.php:435
122
  msgid "No YDIR"
123
  msgstr ""
124
 
@@ -1822,15 +1822,7 @@ msgid ""
1822
  "keywords you enter in the text box."
1823
  msgstr ""
1824
 
1825
- #: includes/admin/templates/metabox/metabox-preview.php:18
1826
- msgid "Dummy Title"
1827
- msgstr ""
1828
-
1829
- #: includes/admin/templates/metabox/metabox-preview.php:33
1830
- msgid "Dummy description"
1831
- msgstr ""
1832
-
1833
- #: includes/admin/templates/metabox/metabox-preview.php:43
1834
  msgid "Google Preview"
1835
  msgstr ""
1836
 
2
  # This file is distributed under the same license as the SmartCrawl package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: SmartCrawl 2.2.2.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wpmu-dev-seo\n"
7
+ "POT-Creation-Date: 2018-09-25 17:41:55+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
13
  "Language-Team: LANGUAGE <LL@li.org>\n"
14
  "X-Generator: grunt-wp-i18n1.0.2\n"
15
 
16
+ #: includes/admin/admin.php:133 includes/admin/settings/settings.php:248
17
  #: includes/admin/settings/settings.php:319
18
  #: includes/admin/templates/advanced-tools/advanced-tools-settings.php:49
19
  #: includes/admin/templates/onpage/onpage-settings.php:246
20
  msgid "Settings"
21
  msgstr ""
22
 
23
+ #: includes/admin/admin.php:168
24
  msgid "Error: options page not found."
25
  msgstr ""
26
 
28
  msgid "SmartCrawl"
29
  msgstr ""
30
 
31
+ #: includes/admin/admin.php:320 includes/admin/settings/dashboard.php:32
32
  #: includes/admin/templates/dashboard/dashboard.php:18
33
  msgid "Dashboard"
34
  msgstr ""
35
 
36
+ #: includes/admin/admin.php:382
37
  msgid ""
38
  "This site discourages search engines from indexing the pages, which will "
39
  "affect your SEO efforts."
40
  msgstr ""
41
 
42
+ #: includes/admin/admin.php:383
43
  msgid "You can fix this here"
44
  msgstr ""
45
 
46
+ #: includes/admin/metabox.php:115
47
  msgid "{TOTAL_LEFT} characters left"
48
  msgstr ""
49
 
50
+ #: includes/admin/metabox.php:116
51
  msgid "Over {MAX_COUNT} characters ({CURRENT_COUNT})"
52
  msgstr ""
53
 
54
+ #: includes/admin/metabox.php:117
55
  msgid ""
56
  "Over {MAX_COUNT} characters ({CURRENT_COUNT}) - make sure your SEO title is "
57
  "shorter"
58
  msgstr ""
59
 
60
+ #: includes/admin/metabox.php:130
61
  msgid "Analyzing content, please wait a few moments"
62
  msgstr ""
63
 
64
+ #: includes/admin/metabox.php:164
65
  msgid "NO ODP (Block Open Directory Project description of the page)"
66
  msgstr ""
67
 
68
+ #: includes/admin/metabox.php:165
69
  msgid "NO YDIR (Don't display the Yahoo! Directory titles and abstracts)"
70
  msgstr ""
71
 
72
+ #: includes/admin/metabox.php:166 includes/admin/metabox.php:432
73
  msgid "No Archive"
74
  msgstr ""
75
 
76
+ #: includes/admin/metabox.php:167 includes/admin/metabox.php:433
77
  msgid "No Snippet"
78
  msgstr ""
79
 
80
+ #: includes/admin/metabox.php:170
81
  msgid "Automatic prioritization"
82
  msgstr ""
83
 
84
+ #: includes/admin/metabox.php:171
85
  msgid "1 - Highest priority"
86
  msgstr ""
87
 
88
+ #: includes/admin/metabox.php:173
89
  msgid "High priority (root pages default)"
90
  msgstr ""
91
 
92
+ #: includes/admin/metabox.php:175
93
  msgid "Secondary priority (subpages default)"
94
  msgstr ""
95
 
96
+ #: includes/admin/metabox.php:176
97
  msgid "Medium priority"
98
  msgstr ""
99
 
100
+ #: includes/admin/metabox.php:180
101
  msgid "Lowest priority"
102
  msgstr ""
103
 
104
+ #: includes/admin/metabox.php:388
105
  #: includes/admin/templates/quick-edit-title.php:5
106
  msgid "Title Tag"
107
  msgstr ""
108
 
109
+ #: includes/admin/metabox.php:390
110
  msgid "Robots Meta"
111
  msgstr ""
112
 
113
+ #: includes/admin/metabox.php:411
114
  msgid "Redirects to %s"
115
  msgstr ""
116
 
117
+ #: includes/admin/metabox.php:430
118
  msgid "No ODP"
119
  msgstr ""
120
 
121
+ #: includes/admin/metabox.php:431
122
  msgid "No YDIR"
123
  msgstr ""
124
 
1822
  "keywords you enter in the text box."
1823
  msgstr ""
1824
 
1825
+ #: includes/admin/templates/metabox/metabox-preview.php:22
 
 
 
 
 
 
 
 
1826
  msgid "Google Preview"
1827
  msgstr ""
1828
 
readme.txt CHANGED
@@ -7,7 +7,7 @@ Author URI: https://premium.wpmudev.org/
7
  Author: WPMU DEV
8
  Requires at least: 4.6
9
  Tested up to: 4.9.8
10
- Stable tag: 2.2.2.3
11
 
12
  The SEO checker and optimization tool that helps you rank higher and get discovered in search engines.
13
 
@@ -86,6 +86,12 @@ SmartCrawl works with any normal WP content and page builders shouldn’t be an
86
 
87
  == Changelog ==
88
 
 
 
 
 
 
 
89
  = 2.2.2.3 =
90
 
91
  * Fix: fixed SEO checkup for free version
7
  Author: WPMU DEV
8
  Requires at least: 4.6
9
  Tested up to: 4.9.8
10
+ Stable tag: 2.2.2.4
11
 
12
  The SEO checker and optimization tool that helps you rank higher and get discovered in search engines.
13
 
86
 
87
  == Changelog ==
88
 
89
+ = 2.2.2.4 =
90
+
91
+ * Fix: don't show raw shortcodes in auto-generated meta description
92
+ * Fix: better compatibility of readability and SEO analysis with page builders
93
+ * Fix: made Google preview in the SC metabox more accurate
94
+
95
  = 2.2.2.3 =
96
 
97
  * Fix: fixed SEO checkup for free version
wpmu-dev-seo.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: SmartCrawl
4
  * Plugin URI: http://premium.wpmudev.org/project/wpmu-dev-seo/
5
  * Description: Every SEO option that a site requires, in one easy bundle.
6
- * Version: 2.2.2.3
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
@@ -30,7 +30,7 @@
30
  */
31
 
32
 
33
- define( 'SMARTCRAWL_VERSION', '2.2.2.3' );
34
 
35
  class Smartcrawl_Loader {
36
 
3
  * Plugin Name: SmartCrawl
4
  * Plugin URI: http://premium.wpmudev.org/project/wpmu-dev-seo/
5
  * Description: Every SEO option that a site requires, in one easy bundle.
6
+ * Version: 2.2.2.4
7
  * Network: true
8
  * Text Domain: wds
9
  * Author: WPMU DEV
30
  */
31
 
32
 
33
+ define( 'SMARTCRAWL_VERSION', '2.2.2.4' );
34
 
35
  class Smartcrawl_Loader {
36