Related Posts for WordPress - Version 1.6.0

Version Description

Download this release

Release Info

Developer barrykooij
Plugin Icon 128x128 Related Posts for WordPress
Version 1.6.0
Comparing to
See all releases

Code changes from version 1.5.0 to 1.6.0

assets/css/install.css CHANGED
@@ -1 +1 @@
1
- .install-steps li{width:33%;padding:10px 15px;font-weight:700;color:#eee;background:#222;float:left;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.install-steps li.step-bar-active{background:#0074a2}.install-steps li:first-child{margin-left:0}.rp4wp-step .rp4wp-install-link-box label{padding-right:20px}.rp4wp-step .rp4wp-install-link-box input{width:40px;text-align:center}.rp4wp-step .rp4wp-install-link-box a.rp4wp-link-now-btn{margin-left:20px;margin-right:10px}.rp4wp-install-link-box{display:inline;padding:15px;border:1px solid #0074a2}.rp4wp-step-2 #progressbar{margin-top:30px}
1
+ .install-steps li{width:33%;padding:10px 15px;font-weight:700;color:#eee;background:#222;float:left;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.install-steps li.step-bar-active{background:#0074a2}.install-steps li:first-child{margin-left:0}.rp4wp-step #progressbar span{line-height:28px;display:block;text-align:right;padding-right:10px;color:#3B3B3B}.rp4wp-step .rp4wp-install-link-box label{padding-right:20px}.rp4wp-step .rp4wp-install-link-box input{width:40px;text-align:center}.rp4wp-step .rp4wp-install-link-box a.rp4wp-link-now-btn{margin-left:20px;margin-right:10px}.rp4wp-install-link-box{display:inline;padding:15px;border:1px solid #0074a2}.rp4wp-step-2 #progressbar{margin-top:30px}
assets/css/install.less CHANGED
@@ -21,6 +21,17 @@
21
  }
22
 
23
  .rp4wp-step {
 
 
 
 
 
 
 
 
 
 
 
24
  .rp4wp-install-link-box {
25
  label {
26
  padding-right: 20px;
21
  }
22
 
23
  .rp4wp-step {
24
+
25
+ #progressbar {
26
+ span {
27
+ line-height: 28px;
28
+ display: block;
29
+ text-align: right;
30
+ padding-right: 10px;
31
+ color: #3B3B3B;
32
+ }
33
+ }
34
+
35
  .rp4wp-install-link-box {
36
  label {
37
  padding-right: 20px;
assets/js/install.js CHANGED
@@ -23,30 +23,39 @@ jQuery(document).ready(function ($) {
23
  this.step = step;
24
  this.total_posts = 0;
25
  this.ppr = null;
26
- this.req_nr = 0;
27
  this.action = null;
 
28
 
29
  this.do_request = function () {
30
  var instance = this;
31
  $.post(ajaxurl, {
32
  'action' : this.action,
 
33
  'rel_amount': $('#rp4wp_related_posts_amount').val()
34
  }, function (response) {
35
 
36
- // What next?
37
- if ('more' == response) {
38
- // Increase the request nr
39
- instance.req_nr++;
 
 
 
 
 
 
40
 
41
  // Do Progressbar
42
- instance.do_progressbar();
43
 
44
- // Do request
45
- instance.do_request();
 
 
 
 
 
46
 
47
- } else if ('done' == response) {
48
- // Done
49
- instance.done();
50
  } else {
51
  alert("Woops! Something went wrong while linking.\n\nResponse:\n\n" + response);
52
  }
@@ -63,8 +72,12 @@ jQuery(document).ready(function ($) {
63
  window.location = $('#rp4wp_admin_url').val() + '?page=rp4wp_install&step=' + ( this.step + 1 );
64
  };
65
 
66
- this.do_progressbar = function () {
67
- $('#progressbar').progressbar({value: ((this.req_nr * this.ppr) / this.total_posts) * 100});
 
 
 
 
68
  };
69
 
70
  this.init = function () {
@@ -72,13 +85,20 @@ jQuery(document).ready(function ($) {
72
  // Setup the progressbar
73
  $('#progressbar').progressbar({value: false});
74
 
 
 
 
 
 
 
 
75
  // Get the total posts
76
  this.total_posts = $('#rp4wp_total_posts').val();
77
 
78
  // Set the correct action
79
  switch (this.step) {
80
  case 1:
81
- this.ppr = 100;
82
  this.action = 'rp4wp_install_save_words';
83
  break;
84
  case 2:
23
  this.step = step;
24
  this.total_posts = 0;
25
  this.ppr = null;
 
26
  this.action = null;
27
+ this.percentage_object = null;
28
 
29
  this.do_request = function () {
30
  var instance = this;
31
  $.post(ajaxurl, {
32
  'action' : this.action,
33
+ 'ppr' : this.ppr,
34
  'rel_amount': $('#rp4wp_related_posts_amount').val()
35
  }, function (response) {
36
 
37
+ // The RegExp
38
+ var response_regex = new RegExp("^[0-9]+$");
39
+
40
+ // Trim that string o/
41
+ response = response.trim();
42
+
43
+ // Test it
44
+ if (response_regex.test(response)) {
45
+
46
+ var posts_left = parseInt(response);
47
 
48
  // Do Progressbar
49
+ instance.do_progressbar(posts_left);
50
 
51
+ if (posts_left > 0) {
52
+ // Do request
53
+ instance.do_request();
54
+ } else {
55
+ // Done
56
+ instance.done();
57
+ }
58
 
 
 
 
59
  } else {
60
  alert("Woops! Something went wrong while linking.\n\nResponse:\n\n" + response);
61
  }
72
  window.location = $('#rp4wp_admin_url').val() + '?page=rp4wp_install&step=' + ( this.step + 1 );
73
  };
74
 
75
+ this.do_progressbar = function (posts_left) {
76
+ var progress = Math.round(( ( this.total_posts - posts_left ) / this.total_posts ) * 100);
77
+ if (progress > 0) {
78
+ this.percentage_object.html(progress + '%');
79
+ $('#progressbar').progressbar({value: progress});
80
+ }
81
  };
82
 
83
  this.init = function () {
85
  // Setup the progressbar
86
  $('#progressbar').progressbar({value: false});
87
 
88
+ // Create the span
89
+ this.percentage_object = jQuery('<span>');
90
+ $('#progressbar').find('div:first').append(this.percentage_object);
91
+
92
+ // Set the current progress
93
+ this.do_progressbar($('#rp4wp_uncached_posts').val());
94
+
95
  // Get the total posts
96
  this.total_posts = $('#rp4wp_total_posts').val();
97
 
98
  // Set the correct action
99
  switch (this.step) {
100
  case 1:
101
+ this.ppr = 25;
102
  this.action = 'rp4wp_install_save_words';
103
  break;
104
  case 2:
assets/js/install.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(a){function b(b){this.step=b,this.total_posts=0,this.ppr=null,this.req_nr=0,this.action=null,this.do_request=function(){var b=this;a.post(ajaxurl,{action:this.action,rel_amount:a("#rp4wp_related_posts_amount").val()},function(a){"more"==a?(b.req_nr++,b.do_progressbar(),b.do_request()):"done"==a?b.done():alert("Woops! Something went wrong while linking.\n\nResponse:\n\n"+a)})},this.done=function(){a("#progressbar").progressbar({value:100}),window.location=a("#rp4wp_admin_url").val()+"?page=rp4wp_install&step="+(this.step+1)},this.do_progressbar=function(){a("#progressbar").progressbar({value:this.req_nr*this.ppr/this.total_posts*100})},this.init=function(){switch(a("#progressbar").progressbar({value:!1}),this.total_posts=a("#rp4wp_total_posts").val(),this.step){case 1:this.ppr=200,this.action="rp4wp_install_save_words";break;case 2:this.ppr=5,this.action="rp4wp_install_link_posts"}this.do_request()},this.init()}var c=a(".rp4wp-step").attr("rel");1==c?b(1):2==c&&a("#rp4wp-link-now").click(function(){b(2)})});
1
+ jQuery(document).ready(function(a){function b(b){this.step=b,this.total_posts=0,this.ppr=null,this.action=null,this.percentage_object=null,this.do_request=function(){var b=this;a.post(ajaxurl,{action:this.action,ppr:this.ppr,rel_amount:a("#rp4wp_related_posts_amount").val()},function(a){var c=new RegExp("^[0-9]+$");if(a=a.trim(),c.test(a)){var d=parseInt(a);b.do_progressbar(d),d>0?b.do_request():b.done()}else alert("Woops! Something went wrong while linking.\n\nResponse:\n\n"+a)})},this.done=function(){a("#progressbar").progressbar({value:100}),window.location=a("#rp4wp_admin_url").val()+"?page=rp4wp_install&step="+(this.step+1)},this.do_progressbar=function(b){var c=Math.round((this.total_posts-b)/this.total_posts*100);c>0&&(this.percentage_object.html(c+"%"),a("#progressbar").progressbar({value:c}))},this.init=function(){switch(a("#progressbar").progressbar({value:!1}),this.percentage_object=jQuery("<span>"),a("#progressbar").find("div:first").append(this.percentage_object),this.do_progressbar(a("#rp4wp_uncached_posts").val()),this.total_posts=a("#rp4wp_total_posts").val(),this.step){case 1:this.ppr=25,this.action="rp4wp_install_save_words";break;case 2:this.ppr=5,this.action="rp4wp_install_link_posts"}this.do_request()},this.init()}var c=a(".rp4wp-step").attr("rel");1==c?b(1):2==c&&a("#rp4wp-link-now").click(function(){b(2)})});
classes/class-installer.php CHANGED
@@ -17,7 +17,7 @@ class RP4WP_Installer {
17
  `word` varchar(255) CHARACTER SET utf8 NOT NULL,
18
  `weight` float unsigned NOT NULL,
19
  `post_type` varchar(20) CHARACTER SET utf8 NOT NULL,
20
- PRIMARY KEY (`post_id`,`word`) );";
21
 
22
  $wpdb->query( $sql );
23
  }
17
  `word` varchar(255) CHARACTER SET utf8 NOT NULL,
18
  `weight` float unsigned NOT NULL,
19
  `post_type` varchar(20) CHARACTER SET utf8 NOT NULL,
20
+ PRIMARY KEY (`post_id`,`word`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
21
 
22
  $wpdb->query( $sql );
23
  }
classes/class-related-post-manager.php CHANGED
@@ -16,11 +16,9 @@ class RP4WP_Related_Post_Manager {
16
  public function get_related_posts( $post_id, $limit = - 1 ) {
17
  global $wpdb;
18
 
19
- $related_posts = array();
20
-
21
  // Build SQl
22
  $sql = "
23
- SELECT O.`word`, P.`ID`, P.`post_title`, SUM( R.`weight` ) AS `related_weight`
24
  FROM `" . RP4WP_Related_Word_Manager::get_database_table() . "` O
25
  INNER JOIN `" . RP4WP_Related_Word_Manager::get_database_table() . "` R ON R.`word` = O.`word`
26
  INNER JOIN `" . $wpdb->posts . "` P ON P.`ID` = R.`post_id`
@@ -30,7 +28,7 @@ class RP4WP_Related_Post_Manager {
30
  AND R.`post_id` != %d
31
  AND P.`post_status` = 'publish'
32
  GROUP BY P.`id`
33
- ORDER BY `related_weight` DESC
34
  ";
35
 
36
  // Check & Add Limit
@@ -43,18 +41,7 @@ class RP4WP_Related_Post_Manager {
43
  $sql = $wpdb->prepare( $sql, $post_id, $post_id, $limit );
44
 
45
  // Get post from related cache
46
- $rposts = $wpdb->get_results( $sql );
47
-
48
- if ( count( $rposts ) > 0 ) {
49
- foreach ( $rposts as $rpost ) {
50
- if ( ! isset( $related_posts[$rpost->ID] ) ) {
51
- $related_posts[] = $rpost;
52
- }
53
-
54
- }
55
- }
56
-
57
- return $related_posts;
58
  }
59
 
60
  /**
@@ -64,8 +51,9 @@ class RP4WP_Related_Post_Manager {
64
  *
65
  * @return array
66
  */
67
- public function get_not_auto_linked_posts( $limit ) {
68
  return get_posts( array(
 
69
  'post_type' => 'post',
70
  'posts_per_page' => $limit,
71
  'post_status' => 'publish',
@@ -79,6 +67,26 @@ class RP4WP_Related_Post_Manager {
79
  ) );
80
  }
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  /**
83
  * Link x related posts to post
84
  *
@@ -116,12 +124,12 @@ class RP4WP_Related_Post_Manager {
116
  global $wpdb;
117
 
118
  // Get uncached posts
119
- $posts = $this->get_not_auto_linked_posts( $post_amount );
120
 
121
  // Check & Loop
122
- if ( count( $posts ) > 0 ) {
123
- foreach ( $posts as $post ) {
124
- $this->link_related_post( $post->ID, $rel_amount );
125
  }
126
  }
127
 
16
  public function get_related_posts( $post_id, $limit = - 1 ) {
17
  global $wpdb;
18
 
 
 
19
  // Build SQl
20
  $sql = "
21
+ SELECT P.`ID`
22
  FROM `" . RP4WP_Related_Word_Manager::get_database_table() . "` O
23
  INNER JOIN `" . RP4WP_Related_Word_Manager::get_database_table() . "` R ON R.`word` = O.`word`
24
  INNER JOIN `" . $wpdb->posts . "` P ON P.`ID` = R.`post_id`
28
  AND R.`post_id` != %d
29
  AND P.`post_status` = 'publish'
30
  GROUP BY P.`id`
31
+ ORDER BY SUM( R.`weight` ) DESC
32
  ";
33
 
34
  // Check & Add Limit
41
  $sql = $wpdb->prepare( $sql, $post_id, $post_id, $limit );
42
 
43
  // Get post from related cache
44
+ return $wpdb->get_results( $sql );
 
 
 
 
 
 
 
 
 
 
 
45
  }
46
 
47
  /**
51
  *
52
  * @return array
53
  */
54
+ public function get_not_auto_linked_posts_ids( $limit ) {
55
  return get_posts( array(
56
+ 'fields' => 'ids',
57
  'post_type' => 'post',
58
  'posts_per_page' => $limit,
59
  'post_status' => 'publish',
67
  ) );
68
  }
69
 
70
+ /**
71
+ * Get the uncached post count
72
+ *
73
+ * @since 1.6.0
74
+ * @access public
75
+ *
76
+ * @return mixed
77
+ */
78
+ public function get_uncached_post_count() {
79
+ global $wpdb;
80
+
81
+ $post_count = $wpdb->get_var( "SELECT COUNT(P.ID) FROM " . $wpdb->posts . " P LEFT JOIN wp_postmeta PM ON (P.ID = PM.post_id AND PM.meta_key = '" . RP4WP_Constants::PM_POST_AUTO_LINKED . "') WHERE 1=1 AND P.post_type = 'post' AND P.post_status = 'publish' AND PM.post_id IS NULL GROUP BY P.post_status" );
82
+
83
+ if ( ! is_numeric( $post_count ) ) {
84
+ $post_count = 0;
85
+ }
86
+
87
+ return $post_count;
88
+ }
89
+
90
  /**
91
  * Link x related posts to post
92
  *
124
  global $wpdb;
125
 
126
  // Get uncached posts
127
+ $post_ids = $this->get_not_auto_linked_posts_ids( $post_amount );
128
 
129
  // Check & Loop
130
+ if ( count( $post_ids ) > 0 ) {
131
+ foreach ( $post_ids as $post_id ) {
132
+ $this->link_related_post( $post_id, $rel_amount );
133
  }
134
  }
135
 
classes/class-related-word-manager.php CHANGED
@@ -8,6 +8,8 @@ class RP4WP_Related_Word_Manager {
8
 
9
  const DB_TABLE = 'rp4wp_cache';
10
 
 
 
11
  /**
12
  * Get the database table
13
  *
@@ -63,36 +65,40 @@ class RP4WP_Related_Word_Manager {
63
  */
64
  private function get_ignored_words( $lang = '' ) {
65
 
66
- // Set the language
67
- if ( '' == $lang ) {
68
- $lang = get_locale();
69
- }
 
70
 
71
- // Require the lang file
72
- $relative_path = '/ignored-words/' . $lang . '.php';
73
 
74
- // Validate the file path to prevent traversal attacks
75
- if ( 0 !== validate_file( $relative_path ) ) {
76
- return array();
77
- }
78
 
79
- $filename = dirname( __FILE__ ) . $relative_path;
80
 
81
- // Check if file exists
82
- if ( ! file_exists( $filename ) ) {
83
- return array();
84
- }
85
 
86
- // Require the file
87
- $ignored_words = require( $filename );
 
 
 
 
 
88
 
89
- // Check if the the $ignored_words are set
90
- if ( is_null( $ignored_words ) || ! is_array( $ignored_words ) ) {
91
- return array();
92
  }
93
 
94
- // Words to ignore
95
- return apply_filters( 'rp4wp_ignored_words', $ignored_words );
96
  }
97
 
98
  /**
@@ -136,12 +142,7 @@ class RP4WP_Related_Word_Manager {
136
 
137
  // Check, Loop
138
  if ( is_array( $title_words ) && count( $title_words ) > 0 ) {
139
- foreach ( $title_words as $title_word ) {
140
-
141
- $title_word_multiplied = array_fill( 0, 20, $title_word );
142
- $linked_words = array_merge( $linked_words, $title_word_multiplied );
143
-
144
- }
145
  }
146
  }
147
 
@@ -165,6 +166,10 @@ class RP4WP_Related_Word_Manager {
165
  // Split string into words
166
  $words = explode( ' ', $content );
167
 
 
 
 
 
168
  // Add the $linked_words
169
  $words = array_merge( $words, $linked_words );
170
 
@@ -188,7 +193,7 @@ class RP4WP_Related_Word_Manager {
188
  }
189
 
190
  foreach ( $words as $word ) {
191
- $word_multiplied_by_weight = array_fill( 0, $weight, $word );
192
  $base_words = array_merge( $base_words, $word_multiplied_by_weight );
193
  }
194
 
@@ -204,13 +209,15 @@ class RP4WP_Related_Word_Manager {
204
  */
205
  public function get_words_of_post( $post_id ) {
206
 
 
 
207
  $post = get_post( $post_id );
208
 
209
  $title_weight = apply_filters( 'rp4wp_weight_title', 80 );
210
  $tag_weight = apply_filters( 'rp4wp_weight_tag', 10 );
211
  $cat_weight = apply_filters( 'rp4wp_weight_cat', 20 );
212
 
213
- // Get words from content
214
  $raw_words = $this->get_content_words( $post );
215
 
216
  // Get words from title
@@ -248,11 +255,6 @@ class RP4WP_Related_Word_Manager {
248
  // Trim word
249
  $word = strtolower( trim( $word ) );
250
 
251
- // Skip empty words
252
- if ( '' == $word ) {
253
- continue;
254
- }
255
-
256
  // Only use words longer than 1 charecter
257
  if ( strlen( $word ) < 2 ) {
258
  continue;
@@ -273,11 +275,6 @@ class RP4WP_Related_Word_Manager {
273
  }
274
  }
275
 
276
- // Sort words
277
- arsort( $words );
278
-
279
- // Only return words that occur more than X(3)
280
-
281
  $new_words = array();
282
  $total_raw_words = count( $raw_words );
283
  $length_weight = 0.6;
@@ -285,7 +282,7 @@ class RP4WP_Related_Word_Manager {
285
  foreach ( $words as $word => $amount ) {
286
 
287
  if ( $amount < 3 ) {
288
- break; // We can break because the array is already sorted
289
  }
290
 
291
  // Add word and turn amount into weight (make it relative)
@@ -293,12 +290,7 @@ class RP4WP_Related_Word_Manager {
293
 
294
  }
295
 
296
- // Replace $words
297
- $words = $new_words;
298
-
299
- // Return words
300
- return $words;
301
-
302
  }
303
 
304
  /**
@@ -315,9 +307,6 @@ class RP4WP_Related_Word_Manager {
315
  // Check words
316
  if ( is_array( $words ) && count( $words ) > 0 ) {
317
 
318
- // Get post type
319
- $post_type = get_post_type( $post_id );
320
-
321
  // Delete all currents words of post
322
  $this->delete_words( $post_id );
323
 
@@ -331,7 +320,7 @@ class RP4WP_Related_Word_Manager {
331
  'post_id' => $post_id,
332
  'word' => $word,
333
  'weight' => $amount,
334
- 'post_type' => $post_type
335
  ),
336
  array(
337
  '%d',
@@ -357,9 +346,11 @@ class RP4WP_Related_Word_Manager {
357
  *
358
  * @return array
359
  */
360
- public function get_uncached_posts( $limit = - 1 ) {
 
361
  // Get Posts without 'cached' PM
362
  return get_posts( array(
 
363
  'post_type' => 'post',
364
  'posts_per_page' => $limit,
365
  'post_status' => 'publish',
@@ -371,6 +362,27 @@ class RP4WP_Related_Word_Manager {
371
  ),
372
  )
373
  ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
374
  }
375
 
376
  /**
@@ -380,12 +392,12 @@ class RP4WP_Related_Word_Manager {
380
  global $wpdb;
381
 
382
  // Get uncached posts
383
- $posts = $this->get_uncached_posts( $limit );
384
 
385
  // Check & Loop
386
- if ( count( $posts ) > 0 ) {
387
- foreach ( $posts as $post ) {
388
- $this->save_words_of_post( $post->ID );
389
  }
390
  }
391
 
8
 
9
  const DB_TABLE = 'rp4wp_cache';
10
 
11
+ private $ignored_words = null;
12
+
13
  /**
14
  * Get the database table
15
  *
65
  */
66
  private function get_ignored_words( $lang = '' ) {
67
 
68
+ if ( null == $this->ignored_words ) {
69
+ // Set the language
70
+ if ( '' == $lang ) {
71
+ $lang = get_locale();
72
+ }
73
 
74
+ // Require the lang file
75
+ $relative_path = '/ignored-words/' . $lang . '.php';
76
 
77
+ // Validate the file path to prevent traversal attacks
78
+ if ( 0 !== validate_file( $relative_path ) ) {
79
+ return array();
80
+ }
81
 
82
+ $filename = dirname( __FILE__ ) . $relative_path;
83
 
84
+ // Check if file exists
85
+ if ( ! file_exists( $filename ) ) {
86
+ return array();
87
+ }
88
 
89
+ // Require the file
90
+ $ignored_words = require( $filename );
91
+
92
+ // Check if the the $ignored_words are set
93
+ if ( is_null( $ignored_words ) || ! is_array( $ignored_words ) ) {
94
+ return array();
95
+ }
96
 
97
+ // Words to ignore
98
+ $this->ignored_words = apply_filters( 'rp4wp_ignored_words', $ignored_words );
 
99
  }
100
 
101
+ return $this->ignored_words;
 
102
  }
103
 
104
  /**
142
 
143
  // Check, Loop
144
  if ( is_array( $title_words ) && count( $title_words ) > 0 ) {
145
+ $linked_words = $this->add_words_from_array( $linked_words, $title_words, 20 );
 
 
 
 
 
146
  }
147
  }
148
 
166
  // Split string into words
167
  $words = explode( ' ', $content );
168
 
169
+ foreach ( $words as $word_key => $word_val ) {
170
+ $words[$word_key] = iconv( "utf-8", "us-ascii//TRANSLIT", $word_val );
171
+ }
172
+
173
  // Add the $linked_words
174
  $words = array_merge( $words, $linked_words );
175
 
193
  }
194
 
195
  foreach ( $words as $word ) {
196
+ $word_multiplied_by_weight = array_fill( 0, $weight, iconv( "utf-8", "us-ascii//TRANSLIT", $word ) );
197
  $base_words = array_merge( $base_words, $word_multiplied_by_weight );
198
  }
199
 
209
  */
210
  public function get_words_of_post( $post_id ) {
211
 
212
+ setlocale( LC_CTYPE, 'en_US.UTF8' );
213
+
214
  $post = get_post( $post_id );
215
 
216
  $title_weight = apply_filters( 'rp4wp_weight_title', 80 );
217
  $tag_weight = apply_filters( 'rp4wp_weight_tag', 10 );
218
  $cat_weight = apply_filters( 'rp4wp_weight_cat', 20 );
219
 
220
+ // Get raw words
221
  $raw_words = $this->get_content_words( $post );
222
 
223
  // Get words from title
255
  // Trim word
256
  $word = strtolower( trim( $word ) );
257
 
 
 
 
 
 
258
  // Only use words longer than 1 charecter
259
  if ( strlen( $word ) < 2 ) {
260
  continue;
275
  }
276
  }
277
 
 
 
 
 
 
278
  $new_words = array();
279
  $total_raw_words = count( $raw_words );
280
  $length_weight = 0.6;
282
  foreach ( $words as $word => $amount ) {
283
 
284
  if ( $amount < 3 ) {
285
+ continue; // Don't add words that occur less than 3 times
286
  }
287
 
288
  // Add word and turn amount into weight (make it relative)
290
 
291
  }
292
 
293
+ return $new_words;
 
 
 
 
 
294
  }
295
 
296
  /**
307
  // Check words
308
  if ( is_array( $words ) && count( $words ) > 0 ) {
309
 
 
 
 
310
  // Delete all currents words of post
311
  $this->delete_words( $post_id );
312
 
320
  'post_id' => $post_id,
321
  'word' => $word,
322
  'weight' => $amount,
323
+ 'post_type' => 'post'
324
  ),
325
  array(
326
  '%d',
346
  *
347
  * @return array
348
  */
349
+ public function get_uncached_post_ids( $limit = - 1 ) {
350
+
351
  // Get Posts without 'cached' PM
352
  return get_posts( array(
353
+ 'fields' => 'ids',
354
  'post_type' => 'post',
355
  'posts_per_page' => $limit,
356
  'post_status' => 'publish',
362
  ),
363
  )
364
  ) );
365
+
366
+ }
367
+
368
+ /**
369
+ * Get the uncached post count
370
+ *
371
+ * @since 1.6.0
372
+ * @access public
373
+ *
374
+ * @return mixed
375
+ */
376
+ public function get_uncached_post_count() {
377
+ global $wpdb;
378
+
379
+ $post_count = $wpdb->get_var( "SELECT COUNT(P.ID) FROM " . $wpdb->posts . " P LEFT JOIN wp_postmeta PM ON (P.ID = PM.post_id AND PM.meta_key = '" . RP4WP_Constants::PM_CACHED . "') WHERE 1=1 AND P.post_type = 'post' AND P.post_status = 'publish' AND PM.post_id IS NULL GROUP BY P.post_status" );
380
+
381
+ if ( ! is_numeric( $post_count ) ) {
382
+ $post_count = 0;
383
+ }
384
+
385
+ return $post_count;
386
  }
387
 
388
  /**
392
  global $wpdb;
393
 
394
  // Get uncached posts
395
+ $post_ids = $this->get_uncached_post_ids( $limit );
396
 
397
  // Check & Loop
398
+ if ( count( $post_ids ) > 0 ) {
399
+ foreach ( $post_ids as $post_id ) {
400
+ $this->save_words_of_post( $post_id );
401
  }
402
  }
403
 
classes/hooks/class-hook-ajax-install-link-posts.php CHANGED
@@ -9,24 +9,32 @@ class RP4WP_Hook_Ajax_Install_Link_Posts extends RP4WP_Hook {
9
 
10
  public function run() {
11
 
 
 
 
12
  // Get the rel amount
13
- $rel_amount = isset( $_POST['rel_amount'] ) ? $_POST['rel_amount'] : 5;
14
 
15
  // Related Post Manager object
16
  $related_post_manager = new RP4WP_Related_Post_Manager();
17
 
18
- // Link 5 posts
19
- if ( true === $related_post_manager->link_related_posts( $rel_amount, 5 ) ) {
20
 
21
- // Check if we're done
22
- if ( 0 == count( $related_post_manager->get_not_auto_linked_posts( 1 ) ) ) {
23
- echo 'done';
24
- } else {
25
- echo 'more';
26
- }
27
 
 
 
 
 
 
 
28
  }
29
 
 
 
 
30
  exit;
31
  }
32
 
9
 
10
  public function run() {
11
 
12
+ // Get the PPR
13
+ $ppr = isset( $_POST['ppr'] ) ? $_POST['ppr'] : 5;
14
+
15
  // Get the rel amount
16
+ $rel_amount = isset( $_POST['rel_amount'] ) ? $_POST['rel_amount'] : 3;
17
 
18
  // Related Post Manager object
19
  $related_post_manager = new RP4WP_Related_Post_Manager();
20
 
21
+ // Link posts
22
+ $related_post_manager->link_related_posts( $rel_amount, $ppr );
23
 
24
+ // Get uncached post count
25
+ $uncached_post_count = $related_post_manager->get_uncached_post_count();
 
 
 
 
26
 
27
+ // Check if we're done
28
+ if ( $uncached_post_count == 0 ) {
29
+ // Save the wizard setting as the option
30
+ $options = RP4WP()->settings->get_options();
31
+ $options['automatic_linking_post_amount'] = $rel_amount;
32
+ update_option( 'rp4wp', $options );
33
  }
34
 
35
+ // Echo the uncached posts
36
+ echo $uncached_post_count;
37
+
38
  exit;
39
  }
40
 
classes/hooks/class-hook-ajax-install-save-words.php CHANGED
@@ -9,22 +9,20 @@ class RP4WP_Hook_Ajax_Install_Save_Words extends RP4WP_Hook {
9
 
10
  public function run() {
11
 
12
- $rel_amount = isset( $_POST['rel_amount'] ) ? $_POST['rel_amount'] : 100;
 
13
 
14
  // Related Post Manager
15
  $related_word_manager = new RP4WP_Related_Word_Manager();
16
 
17
- // Save 200 words
18
- if ( true === $related_word_manager->save_all_words( $rel_amount ) ) {
19
 
20
- // Check if we're done
21
- if ( 0 == count( $related_word_manager->get_uncached_posts( 1 ) ) ) {
22
- echo 'done';
23
- } else {
24
- echo 'more';
25
- }
26
 
27
- }
 
28
 
29
  exit;
30
  }
9
 
10
  public function run() {
11
 
12
+ // Get the PPR
13
+ $ppr = isset( $_POST['ppr'] ) ? $_POST['ppr'] : 25;
14
 
15
  // Related Post Manager
16
  $related_word_manager = new RP4WP_Related_Word_Manager();
17
 
18
+ // Save words
19
+ $related_word_manager->save_all_words( $ppr );
20
 
21
+ // Get uncached post count
22
+ $uncached_post_count = $related_word_manager->get_uncached_post_count();
 
 
 
 
23
 
24
+ // Echo the uncached posts
25
+ echo $uncached_post_count;
26
 
27
  exit;
28
  }
classes/hooks/class-hook-page-install.php CHANGED
@@ -39,7 +39,6 @@ class RP4WP_Hook_Page_Install extends RP4WP_Hook {
39
  if ( isset( $_GET['reinstall'] ) ) {
40
 
41
  // Check nonce
42
-
43
  if ( ! wp_verify_nonce( ( isset( $_GET['rp4wp_nonce'] ) ? $_GET['rp4wp_nonce'] : '' ), RP4WP_Constants::NONCE_REINSTALL ) ) {
44
  wp_die( 'Woah! It looks like something else tried to run the Related Posts for WordPress installation wizard! We were able to stop them, nothing was lost. Please report this incident at <a href="http://wordpress.org/support/plugin/related-posts-for-wp" target="_blank">our forums.</a>' );
45
  }
@@ -114,6 +113,11 @@ class RP4WP_Hook_Page_Install extends RP4WP_Hook {
114
  echo "<input type='hidden' id='rp4wp_admin_url' value='" . admin_url() . "' />" . PHP_EOL;
115
 
116
  if ( 1 == $cur_step ) {
 
 
 
 
 
117
  ?>
118
  <p><?php _e( 'Thank you for choosing Related Posts for WordPress!', 'related-posts-for-wp' ); ?></p>
119
  <p><?php _e( 'Before you can start using Related Posts for WordPress we need to cache your current posts.', 'related-posts-for-wp' ); ?></p>
@@ -124,6 +128,10 @@ class RP4WP_Hook_Page_Install extends RP4WP_Hook {
124
  <div id="progressbar"></div>
125
  <?php
126
  } elseif ( 2 == $cur_step ) {
 
 
 
 
127
  ?>
128
  <p style="font-weight: bold;"><?php _e( 'Great! All your posts were successfully cached!', 'related-posts-for-wp' ); ?></p>
129
  <p><?php _e( "You can let me link your posts, based on what I think is related, to each other. And don't worry, if I made a mistake at one of your posts you can easily correct this by editing it manually!", 'related-posts-for-wp' ); ?></p>
@@ -131,7 +139,7 @@ class RP4WP_Hook_Page_Install extends RP4WP_Hook {
131
  <p style="font-weight: bold;"><?php _e( 'Do NOT close this window if you click the "Link now" button, wait for this process to finish and this wizard to take you to the next step.', 'related-posts-for-wp' ); ?></p>
132
  <br class="clear" />
133
  <p class="rp4wp-install-link-box">
134
- <label for="rp4wp_related_posts_amount"><?php _e( 'Amount of related posts per post:', 'related-posts-for-wp' ); ?></label><input class="form-input-tip" type="text" id="rp4wp_related_posts_amount" value="3" />
135
  <a href="javascript:;" class="button button-primary button-large rp4wp-link-now-btn" id="rp4wp-link-now"><?php _e( 'Link now', 'related-posts-for-wp' ); ?></a>
136
  <a href="<?php echo admin_url(); ?>?page=rp4wp_install&step=3" class="button"><?php _e( 'Skip linking', 'related-posts-for-wp' ); ?></a>
137
  </p>
39
  if ( isset( $_GET['reinstall'] ) ) {
40
 
41
  // Check nonce
 
42
  if ( ! wp_verify_nonce( ( isset( $_GET['rp4wp_nonce'] ) ? $_GET['rp4wp_nonce'] : '' ), RP4WP_Constants::NONCE_REINSTALL ) ) {
43
  wp_die( 'Woah! It looks like something else tried to run the Related Posts for WordPress installation wizard! We were able to stop them, nothing was lost. Please report this incident at <a href="http://wordpress.org/support/plugin/related-posts-for-wp" target="_blank">our forums.</a>' );
44
  }
113
  echo "<input type='hidden' id='rp4wp_admin_url' value='" . admin_url() . "' />" . PHP_EOL;
114
 
115
  if ( 1 == $cur_step ) {
116
+
117
+ // Echo current uncached posts
118
+ $related_word_manager = new RP4WP_Related_Word_Manager();
119
+ echo "<input type='hidden' id='rp4wp_uncached_posts' value='" . $related_word_manager->get_uncached_post_count() . "' />" . PHP_EOL;
120
+
121
  ?>
122
  <p><?php _e( 'Thank you for choosing Related Posts for WordPress!', 'related-posts-for-wp' ); ?></p>
123
  <p><?php _e( 'Before you can start using Related Posts for WordPress we need to cache your current posts.', 'related-posts-for-wp' ); ?></p>
128
  <div id="progressbar"></div>
129
  <?php
130
  } elseif ( 2 == $cur_step ) {
131
+
132
+ // Echo current uncached posts
133
+ $related_post_manager = new RP4WP_Related_Post_Manager();
134
+ echo "<input type='hidden' id='rp4wp_uncached_posts' value='" . $related_post_manager->get_uncached_post_count() . "' />" . PHP_EOL;
135
  ?>
136
  <p style="font-weight: bold;"><?php _e( 'Great! All your posts were successfully cached!', 'related-posts-for-wp' ); ?></p>
137
  <p><?php _e( "You can let me link your posts, based on what I think is related, to each other. And don't worry, if I made a mistake at one of your posts you can easily correct this by editing it manually!", 'related-posts-for-wp' ); ?></p>
139
  <p style="font-weight: bold;"><?php _e( 'Do NOT close this window if you click the "Link now" button, wait for this process to finish and this wizard to take you to the next step.', 'related-posts-for-wp' ); ?></p>
140
  <br class="clear" />
141
  <p class="rp4wp-install-link-box">
142
+ <label for="rp4wp_related_posts_amount"><?php _e( 'Amount of related posts per post:', 'related-posts-for-wp' ); ?></label><input class="form-input-tip" type="text" id="rp4wp_related_posts_amount" value="<?php echo RP4WP()->settings->get_option( 'automatic_linking_post_amount' ); ?>" />
143
  <a href="javascript:;" class="button button-primary button-large rp4wp-link-now-btn" id="rp4wp-link-now"><?php _e( 'Link now', 'related-posts-for-wp' ); ?></a>
144
  <a href="<?php echo admin_url(); ?>?page=rp4wp_install&step=3" class="button"><?php _e( 'Skip linking', 'related-posts-for-wp' ); ?></a>
145
  </p>
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://www.relatedpostsforwp.com/
4
  Tags: related posts for wordpress, related posts for wp, simple related posts, easy related posts, related posts, related, relations, internal links, seo, bounce rate
5
  Requires at least: 3.6
6
  Tested up to: 4.0
7
- Stable tag: 1.5.0
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -33,6 +33,9 @@ Related Posts for WordPress is fully compatible with WPML. You can automatically
33
  = Shortcode =
34
  Related Posts for WordPress has a shortcode allowing you to display related posts on any position within your content.
35
 
 
 
 
36
  **More information**
37
 
38
  - Visit the [Related Posts for WordPress website](http://www.relatedpostsforwp.com/?utm_source=wp-plugin-repo&utm_medium=link&utm_campaign=more-information)
@@ -70,6 +73,9 @@ Not yet, we're working on this and this will be added soon!
70
  = Is there a shortcode? =
71
  Yes, use [rp4wp]
72
 
 
 
 
73
  = Does Related Posts for WordPress uses it's own database table ? =
74
  There is one custom table created for the post cache, this table will however not be used at the frontend of your website. Related Posts are fetched with normal WP_Query objects.
75
 
@@ -82,6 +88,14 @@ There is one custom table created for the post cache, this table will however no
82
 
83
  == Changelog ==
84
 
 
 
 
 
 
 
 
 
85
  = 1.5.0: September 5, 2014 =
86
  * Added Related Posts widget.
87
  * Changed 'Delete Post' label to 'Unlink Related Post'.
@@ -146,4 +160,4 @@ There is one custom table created for the post cache, this table will however no
146
  * Initial version
147
 
148
  == Upgrade Notice ==
149
- This version is safe to upgrade.
4
  Tags: related posts for wordpress, related posts for wp, simple related posts, easy related posts, related posts, related, relations, internal links, seo, bounce rate
5
  Requires at least: 3.6
6
  Tested up to: 4.0
7
+ Stable tag: 1.6.0
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
33
  = Shortcode =
34
  Related Posts for WordPress has a shortcode allowing you to display related posts on any position within your content.
35
 
36
+ = Widget =
37
+ Related Posts for Wordpress has a widget allowing you to display related posts in any sidebar you'd like.
38
+
39
  **More information**
40
 
41
  - Visit the [Related Posts for WordPress website](http://www.relatedpostsforwp.com/?utm_source=wp-plugin-repo&utm_medium=link&utm_campaign=more-information)
73
  = Is there a shortcode? =
74
  Yes, use [rp4wp]
75
 
76
+ = Is there a widget? =
77
+ Yes there is!
78
+
79
  = Does Related Posts for WordPress uses it's own database table ? =
80
  There is one custom table created for the post cache, this table will however not be used at the frontend of your website. Related Posts are fetched with normal WP_Query objects.
81
 
88
 
89
  == Changelog ==
90
 
91
+ = 1.6.0: September 12, 2014 =
92
+ * We're now replacing 'special' characters with their 'normal' equivalent.
93
+ * Save the wizard settings to options to improve defaults.
94
+ * Added a percentage to the progressbar to improve progress clarity.
95
+ * The wizard progress is now updated when returned to wizard.
96
+ * Various caching tweaks.
97
+ * Added utf8 charset to cache database table in installer.
98
+
99
  = 1.5.0: September 5, 2014 =
100
  * Added Related Posts widget.
101
  * Changed 'Delete Post' label to 'Unlink Related Post'.
160
  * Initial version
161
 
162
  == Upgrade Notice ==
163
+ This version is safe to upgrade. If all of your related posts are linked automatically, we do recommend rerunning the wizard for better results.
related-posts-for-wp.php CHANGED
@@ -2,8 +2,8 @@
2
  /*
3
  Plugin Name: Related Posts for WordPress
4
  Plugin URI: http://www.relatedpostsforwp.com/
5
- Description: Related Posts for WordPress, related posts that perform!
6
- Version: 1.5.0
7
  Author: Barry Kooij
8
  Author URI: http://www.barrykooij.com/
9
  License: GPL v3
@@ -26,7 +26,7 @@ class RP4WP {
26
 
27
  private static $instance = null;
28
 
29
- const VERSION = '1.5.0';
30
 
31
  /**
32
  * @var RP4WP_Settings
@@ -130,7 +130,7 @@ class RP4WP {
130
  $manager_hook->load_hooks();
131
 
132
  // Include template functions
133
- if ( !is_admin() ) {
134
  require_once( plugin_dir_path( self::get_plugin_file() ) . '/includes/template-functions.php' );
135
  }
136
 
2
  /*
3
  Plugin Name: Related Posts for WordPress
4
  Plugin URI: http://www.relatedpostsforwp.com/
5
+ Description: Related Posts for WordPress, the best way to display related posts in WordPress.
6
+ Version: 1.6.0
7
  Author: Barry Kooij
8
  Author URI: http://www.barrykooij.com/
9
  License: GPL v3
26
 
27
  private static $instance = null;
28
 
29
+ const VERSION = '1.6.0';
30
 
31
  /**
32
  * @var RP4WP_Settings
130
  $manager_hook->load_hooks();
131
 
132
  // Include template functions
133
+ if ( ! is_admin() ) {
134
  require_once( plugin_dir_path( self::get_plugin_file() ) . '/includes/template-functions.php' );
135
  }
136
 
uninstall.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
 
3
  // What is happening?
4
- if ( !defined( 'ABSPATH' ) || !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
5
  exit();
6
  }
7
 
@@ -27,11 +27,13 @@ if ( isset( $options['clean_on_uninstall'] ) && 1 == $options['clean_on_uninstal
27
  )
28
  );
29
 
30
- // Delete all link posts
31
- $wpdb->query( "DELETE FROM $wpdb->posts WHERE `ID` IN (" . implode( ",", $link_ids ) . ");" );
 
32
 
33
- // Delete all link post meta
34
- $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `post_id` IN (" . implode( ",", $link_ids ) . ");" );
 
35
 
36
 
37
  // Delete the options
1
  <?php
2
 
3
  // What is happening?
4
+ if ( ! defined( 'ABSPATH' ) || ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
5
  exit();
6
  }
7
 
27
  )
28
  );
29
 
30
+ if ( count( $link_ids ) > 0 ) {
31
+ // Delete all link posts
32
+ $wpdb->query( "DELETE FROM $wpdb->posts WHERE `ID` IN (" . implode( ",", $link_ids ) . ");" );
33
 
34
+ // Delete all link post meta
35
+ $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `post_id` IN (" . implode( ",", $link_ids ) . ");" );
36
+ }
37
 
38
 
39
  // Delete the options