Similar Posts – Best Related Posts Plugin for WordPress - Version 3.1.0

Version Description

(2019-02-16) = * Fixed compatability issues with PHP 7.2 * Addressed PHP warnings * Algorithm updated to prefer newer posts over older ones * General admin panel cleanup

Download this release

Release Info

Developer shareaholic
Plugin Icon 128x128 Similar Posts – Best Related Posts Plugin for WordPress
Version 3.1.0
Comparing to
See all releases

Code changes from version 3.0.2 to 3.1.0

admin-subpages.php CHANGED
@@ -49,7 +49,6 @@ class admin_subpages {
49
  }
50
 
51
  function display_menu() {
52
- echo '<a title="Test your site\'s security with Security Ninja" id="ninja" href="https://wpsecurityninja.com/?utm_source=WP%20admin&utm_medium=banner&utm_campaign=Similar%20Posts&utm_content=ninja" target="_blank"><img title="Test your site\'s security with Security Ninja" alt="Test your site\'s security with Security Ninja" src="' . WP_PLUGIN_URL . '/similar-posts/images/ninja.png"></a>';
53
  echo "\n<ul id=\"submenu\" class=\"similarposts-tabs-menu\" style=\"display: block\">\n";
54
  // for compatibility with WP mu
55
  $base = (isset($_SERVER['REDIRECT_URL'])) ? $_SERVER['REDIRECT_URL'] : $_SERVER['PHP_SELF'];
49
  }
50
 
51
  function display_menu() {
 
52
  echo "\n<ul id=\"submenu\" class=\"similarposts-tabs-menu\" style=\"display: block\">\n";
53
  // for compatibility with WP mu
54
  $base = (isset($_SERVER['REDIRECT_URL'])) ? $_SERVER['REDIRECT_URL'] : $_SERVER['PHP_SELF'];
common_functions.php CHANGED
@@ -233,13 +233,15 @@ function ppl_sort_items($sort, $results, $option_key, $group_template, $items) {
233
 
234
  // the $post global can be overwritten by the use of $wp_query so we go back to the source
235
  // note the addition of a 'manual overide' allowing the current posts to me marked by similar_posts_mark_current for example
236
- function ppl_current_post_id($manual_current_ID = -1) {
237
  $the_ID = -1;
238
  if ($manual_current_ID > 0) {
239
  $the_ID = $manual_current_ID;
240
  } else if (isset($GLOBALS['wp_the_query'])) {
241
  $the_ID = $GLOBALS['wp_the_query']->post->ID;
242
- if (!$the_ID) $the_ID = $GLOBALS['wp_the_query']->posts[0]->ID;
 
 
243
  } else {
244
  $the_ID = $GLOBALS['post']->ID;
245
  }
233
 
234
  // the $post global can be overwritten by the use of $wp_query so we go back to the source
235
  // note the addition of a 'manual overide' allowing the current posts to me marked by similar_posts_mark_current for example
236
+ function ppl_current_post_id ($manual_current_ID = -1) {
237
  $the_ID = -1;
238
  if ($manual_current_ID > 0) {
239
  $the_ID = $manual_current_ID;
240
  } else if (isset($GLOBALS['wp_the_query'])) {
241
  $the_ID = $GLOBALS['wp_the_query']->post->ID;
242
+ if (!$the_ID) {
243
+ $the_ID = $GLOBALS['wp_the_query']->posts[0]->ID;
244
+ }
245
  } else {
246
  $the_ID = $GLOBALS['post']->ID;
247
  }
css/similar-posts-admin.css CHANGED
@@ -51,9 +51,3 @@
51
  .similarposts-inner-table tr td{
52
  border:1px solid #CCC;
53
  }
54
-
55
- #ninja {
56
- position: absolute;
57
- right: 100px;
58
- top: 67px;
59
- }
51
  .similarposts-inner-table tr td{
52
  border:1px solid #CCC;
53
  }
 
 
 
 
 
 
output_tags.php CHANGED
@@ -167,10 +167,10 @@ function otf_snippet($option_key, $result, $ext) {
167
  $link = 'nolink';
168
  if ($ext) {
169
  $s = explode(':', $ext);
170
- if ($s[0]) $len = $s[0];
171
- if ($s[1]) $type = $s[1];
172
- if ($s[2]) $more = $s[2];
173
- if ($s[3]) $link = $s[3];
174
  }
175
  if ($link === 'link') {
176
  $url = otf_url($option_key, $result, '');
@@ -185,9 +185,9 @@ function otf_snippetword($option_key, $result, $ext) {
185
  $link = 'nolink';
186
  if ($ext) {
187
  $s = explode(':', $ext);
188
- if ($s[0]) $len = $s[0];
189
- if ($s[1]) $more = $s[1];
190
- if ($s[2]) $link = $s[2];
191
  }
192
  if ($link === 'link') {
193
  $url = otf_url($option_key, $result, '');
@@ -295,10 +295,10 @@ function otf_commentsnippet($option_key, $result, $ext) {
295
  $link = 'nolink';
296
  if ($ext) {
297
  $s = explode(':', $ext);
298
- if ($s[0]) $len = $s[0];
299
- if ($s[1]) $type = $s[1];
300
- if ($s[2]) $more = $s[2];
301
- if ($s[3]) $link = $s[3];
302
  }
303
  if ($link === 'link') {
304
  $url = otf_commenturl($option_key, $result, '');
@@ -313,9 +313,9 @@ function otf_commentsnippetword($option_key, $result, $ext) {
313
  $link = 'nolink';
314
  if ($ext) {
315
  $s = explode(':', $ext);
316
- if ($s[0]) $len = $s[0];
317
- if ($s[1]) $more = $s[1];
318
- if ($s[2]) $link = $s[2];
319
  }
320
  if ($link === 'link') {
321
  $url = otf_commenturl($option_key, $result, '');
@@ -416,7 +416,8 @@ function otf_catlinks($option_key, $result, $ext) {
416
 
417
  function otf_categorylinks($option_key, $result, $ext) {
418
  $cats = get_the_category($result->ID);
419
- $value = ''; $n = 0;
 
420
  foreach ($cats as $cat) {
421
  if ($n > 0) $value .= $ext;
422
  $catname = apply_filters('single_cat_title', $cat->cat_name);
@@ -432,7 +433,8 @@ function otf_catnames($option_key, $result, $ext) {
432
 
433
  function otf_categorynames($option_key, $result, $ext) {
434
  $cats = get_the_category($result->ID);
435
- $value = ''; $n = 0;
 
436
  foreach ($cats as $cat) {
437
  if ($n > 0) $value .= $ext;
438
  $value .= apply_filters('single_cat_title', $cat->cat_name);
@@ -450,7 +452,9 @@ function otf_tags($option_key, $result, $ext) {
450
  $tags = (array) get_the_tags($result->ID);
451
  $tag_list = array();
452
  foreach ( $tags as $tag ) {
453
- $tag_list[] = $tag->name;
 
 
454
  }
455
  if (!$ext) $ext = ', ';
456
  $tag_list = join( $ext, $tag_list );
@@ -500,7 +504,7 @@ function otf_link($option_key, $result, $ext) {
500
  $ttl = otf_title($option_key, $result, $ext);
501
  $pml = otf_url($option_key, $result, null);
502
  $pdt = otf_date($option_key, $result, null);
503
- return "<a href=\"$pml\" rel=\"bookmark\" title=\"$pdt\">$ttl</a>";
504
  }
505
 
506
  function otf_score($option_key, $result, $ext) {
@@ -510,6 +514,7 @@ function otf_score($option_key, $result, $ext) {
510
  // tries to get the number of post views from a few popular plugins if the are installed
511
  function otf_postviews($option_key, $result, $ext) {
512
  global $wpdb;
 
513
  // alex king's popularity contest
514
  if (class_exists('ak_popularity_contest')) $count = $akpc->get_post_total($result->ID);
515
  // my own post view count
@@ -523,7 +528,7 @@ function otf_postviews($option_key, $result, $ext) {
523
  else if (function_exists('show_post_count')) {$id = $result->ID; $count = $wpdb->get_var("select cntaccess from mostAccessed WHERE postnumber = $id");}
524
  // Ivan Djurdjevac's CountPosts
525
  else if (function_exists('HitThisPost')) {$id = $result->ID; $count = $wpdb->get_var("SELECT post_hits FROM $wpdb->posts WHERE ID=$id");}
526
- if (!$count) $count = 0;
527
  return $count;
528
  }
529
 
@@ -607,13 +612,16 @@ function oth_process($w, $h) {
607
  function otf_image($option_key, $result, $ext) {
608
  // extract any image tags
609
  $content = $result->post_content;
610
- if ($ext) {
 
 
611
  $s = explode(':', $ext);
612
- if ($s[3] === 'post') {
613
  $content = apply_filters('the_content', $content);
614
- }
615
  }
616
- if ($s[4] === 'link') {
 
617
  $pattern = '/<a.+?<img.+?>.+?a>/i';
618
  $pattern2 = '#(<a.+?<img.+?)(/>|>)#is';
619
  } else {
@@ -622,16 +630,29 @@ function otf_image($option_key, $result, $ext) {
622
  }
623
  if (!preg_match_all($pattern, $content, $matches)) {
624
  // no <img> tags in content
625
- if (($s[5]) && ($s[6])) {
626
  // a default <img> tag has been given
627
  return $s[5].':'.$s[6];
628
  } else {
629
  return '';
630
  }
631
- }
632
- $i = $s[0];
633
- if (!$i) $i = 0;
634
- $imgtag = $matches[0][$i];
 
 
 
 
 
 
 
 
 
 
 
 
 
635
  $process = oth_process($s[1],$s[2]);
636
  list($w, $h) = $process(intval($s[1]), intval($s[2]), $imgtag);
637
  if ($w === 0) return '';
@@ -646,19 +667,27 @@ function otf_image($option_key, $result, $ext) {
646
  function otf_imagesrc($option_key, $result, $ext) {
647
  // extract any image tags
648
  $content = $result->post_content;
 
 
649
  if ($ext) {
650
  $s = explode(':', $ext);
651
- if ($s[1] === 'post') {
652
  $content = apply_filters('the_content', $content);
653
  }
654
- if ($s[2]) $suffix = $s[2];
 
 
 
655
  }
656
  $pattern = '/<img.+?src\s*=\s*[\'|\"](.*?)[\'|\"].+?>/i';
 
657
  if (!preg_match_all($pattern, $content, $matches)) return '';
658
- $i = $s[0];
659
- if (!$i) $i = 0;
660
- $imgsrc = $matches[1][$i];
661
- if ($suffix) {
 
 
662
  if ($suffix === '?m') $suffix = '-' . get_option('medium_size_w') . 'x' . get_option('medium_size_h');
663
  if ($suffix === '?t') $suffix = '-' . get_option('thumbnail_size_w') . 'x' . get_option('thumbnail_size_h');
664
  $pathinfo = pathinfo($imgsrc);
@@ -667,22 +696,47 @@ function otf_imagesrc($option_key, $result, $ext) {
667
  }
668
  return $imgsrc;
669
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
670
 
671
  function otf_imagealt($option_key, $result, $ext) {
672
  // extract any image tags
673
  $content = $result->post_content;
 
674
  if ($ext) {
675
  $s = explode(':', $ext);
676
- if ($s[1] === 'post') {
677
  $content = apply_filters('the_content', $content);
678
  }
679
- if ($s[2]) $suffix = $s[2];
680
  }
681
  $pattern = '/<img.+?alt\s*=\s*[\'|\"](.*?)[\'|\"].+?>/i';
682
  if (!preg_match_all($pattern, $content, $matches)) return '';
683
- $i = $s[0];
684
- if (!$i) $i = 0;
685
- return $matches[1][$i];
 
 
 
686
  }
687
 
688
  function otf_gravatar($option_key, $result, $ext) {
@@ -811,6 +865,57 @@ function otf_php($option_key, $result, $ext) {
811
 
812
  // ****************************** Helper Functions *********************************************
813
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
814
  function oth_truncate_text($text, $ext) {
815
  if (!$ext) {
816
  return $text;
167
  $link = 'nolink';
168
  if ($ext) {
169
  $s = explode(':', $ext);
170
+ if (isset($s[0]) && $s[0]) $len = $s[0];
171
+ if (isset($s[1]) && $s[1]) $type = $s[1];
172
+ if (isset($s[2]) && $s[2]) $more = $s[2];
173
+ if (isset($s[3]) && $s[3]) $link = $s[3];
174
  }
175
  if ($link === 'link') {
176
  $url = otf_url($option_key, $result, '');
185
  $link = 'nolink';
186
  if ($ext) {
187
  $s = explode(':', $ext);
188
+ if (isset($s[0]) && $s[0]) $len = $s[0];
189
+ if (isset($s[1]) && $s[1]) $more = $s[1];
190
+ if (isset($s[2]) && $s[2]) $link = $s[2];
191
  }
192
  if ($link === 'link') {
193
  $url = otf_url($option_key, $result, '');
295
  $link = 'nolink';
296
  if ($ext) {
297
  $s = explode(':', $ext);
298
+ if (isset($s[0]) && $s[0]) $len = $s[0];
299
+ if (isset($s[1]) && $s[1]) $type = $s[1];
300
+ if (isset($s[2]) && $s[2]) $more = $s[2];
301
+ if (isset($s[3]) && $s[3]) $link = $s[3];
302
  }
303
  if ($link === 'link') {
304
  $url = otf_commenturl($option_key, $result, '');
313
  $link = 'nolink';
314
  if ($ext) {
315
  $s = explode(':', $ext);
316
+ if (isset($s[0]) && $s[0]) $len = $s[0];
317
+ if (isset($s[1]) && $s[1]) $more = $s[1];
318
+ if (isset($s[2]) && $s[2]) $link = $s[2];
319
  }
320
  if ($link === 'link') {
321
  $url = otf_commenturl($option_key, $result, '');
416
 
417
  function otf_categorylinks($option_key, $result, $ext) {
418
  $cats = get_the_category($result->ID);
419
+ $value = '';
420
+ $n = 0;
421
  foreach ($cats as $cat) {
422
  if ($n > 0) $value .= $ext;
423
  $catname = apply_filters('single_cat_title', $cat->cat_name);
433
 
434
  function otf_categorynames($option_key, $result, $ext) {
435
  $cats = get_the_category($result->ID);
436
+ $value = '';
437
+ $n = 0;
438
  foreach ($cats as $cat) {
439
  if ($n > 0) $value .= $ext;
440
  $value .= apply_filters('single_cat_title', $cat->cat_name);
452
  $tags = (array) get_the_tags($result->ID);
453
  $tag_list = array();
454
  foreach ( $tags as $tag ) {
455
+ if (isset($tag->name)) {
456
+ $tag_list[] = $tag->name;
457
+ }
458
  }
459
  if (!$ext) $ext = ', ';
460
  $tag_list = join( $ext, $tag_list );
504
  $ttl = otf_title($option_key, $result, $ext);
505
  $pml = otf_url($option_key, $result, null);
506
  $pdt = otf_date($option_key, $result, null);
507
+ return "<a href=\"$pml\" rel=\"bookmark\" title=\"$ttl\">$ttl</a>";
508
  }
509
 
510
  function otf_score($option_key, $result, $ext) {
514
  // tries to get the number of post views from a few popular plugins if the are installed
515
  function otf_postviews($option_key, $result, $ext) {
516
  global $wpdb;
517
+ $count = 0;
518
  // alex king's popularity contest
519
  if (class_exists('ak_popularity_contest')) $count = $akpc->get_post_total($result->ID);
520
  // my own post view count
528
  else if (function_exists('show_post_count')) {$id = $result->ID; $count = $wpdb->get_var("select cntaccess from mostAccessed WHERE postnumber = $id");}
529
  // Ivan Djurdjevac's CountPosts
530
  else if (function_exists('HitThisPost')) {$id = $result->ID; $count = $wpdb->get_var("SELECT post_hits FROM $wpdb->posts WHERE ID=$id");}
531
+
532
  return $count;
533
  }
534
 
612
  function otf_image($option_key, $result, $ext) {
613
  // extract any image tags
614
  $content = $result->post_content;
615
+ $i = 0;
616
+ $imgtag = '';
617
+ if ($ext) {
618
  $s = explode(':', $ext);
619
+ if (isset($s[3]) && $s[3] === 'post') {
620
  $content = apply_filters('the_content', $content);
621
+ }
622
  }
623
+
624
+ if (isset($s[4]) && $s[4] === 'link') {
625
  $pattern = '/<a.+?<img.+?>.+?a>/i';
626
  $pattern2 = '#(<a.+?<img.+?)(/>|>)#is';
627
  } else {
630
  }
631
  if (!preg_match_all($pattern, $content, $matches)) {
632
  // no <img> tags in content
633
+ if ((isset($s[5]) && $s[5]) && (isset($s[6]) && $s[6])) {
634
  // a default <img> tag has been given
635
  return $s[5].':'.$s[6];
636
  } else {
637
  return '';
638
  }
639
+ }
640
+ if (isset($s[0])) {
641
+ $i = $s[0];
642
+ }
643
+
644
+ if (isset($matches[0][$i])){
645
+ $imgtag = $matches[0][$i];
646
+ }
647
+
648
+ if (!isset($s[1])) {
649
+ $s[1] = null;
650
+ }
651
+
652
+ if (!isset($s[2])) {
653
+ $s[2] = null;
654
+ }
655
+
656
  $process = oth_process($s[1],$s[2]);
657
  list($w, $h) = $process(intval($s[1]), intval($s[2]), $imgtag);
658
  if ($w === 0) return '';
667
  function otf_imagesrc($option_key, $result, $ext) {
668
  // extract any image tags
669
  $content = $result->post_content;
670
+ $i = 0;
671
+ $imgsrc = '';
672
  if ($ext) {
673
  $s = explode(':', $ext);
674
+ if (isset($s[1]) && $s[1] === 'post') {
675
  $content = apply_filters('the_content', $content);
676
  }
677
+ if (isset($s[2]) && $s[2]) $suffix = $s[2];
678
+ }
679
+ if (isset($s[0])) {
680
+ $i = $s[0];
681
  }
682
  $pattern = '/<img.+?src\s*=\s*[\'|\"](.*?)[\'|\"].+?>/i';
683
+
684
  if (!preg_match_all($pattern, $content, $matches)) return '';
685
+
686
+ if (isset($matches[1][$i])){
687
+ $imgsrc = $matches[1][$i];
688
+ }
689
+
690
+ if (isset($suffix) && $suffix) {
691
  if ($suffix === '?m') $suffix = '-' . get_option('medium_size_w') . 'x' . get_option('medium_size_h');
692
  if ($suffix === '?t') $suffix = '-' . get_option('thumbnail_size_w') . 'x' . get_option('thumbnail_size_h');
693
  $pathinfo = pathinfo($imgsrc);
696
  }
697
  return $imgsrc;
698
  }
699
+
700
+ function otf_imagesrc_shareaholic($option_key, $result, $ext) {
701
+
702
+ $thumbnail_src = '';
703
+
704
+ if (is_attachment($result->ID)) {
705
+ $thumbnail_src = wp_get_attachment_thumb_url($result->ID);
706
+ }
707
+
708
+ $thumbnail_src = oth_post_featured_image($result->ID);
709
+
710
+ if ($thumbnail_src == NULL) {
711
+ $thumbnail_src = oth_post_first_image($result->ID);
712
+ }
713
+
714
+ if ($thumbnail_src != NULL) {
715
+ return $thumbnail_src;
716
+ } else {
717
+ return null;
718
+ }
719
+ }
720
 
721
  function otf_imagealt($option_key, $result, $ext) {
722
  // extract any image tags
723
  $content = $result->post_content;
724
+ $i = 0;
725
  if ($ext) {
726
  $s = explode(':', $ext);
727
+ if (isset($s[1]) && $s[1] === 'post') {
728
  $content = apply_filters('the_content', $content);
729
  }
730
+ if (isset($s[2]) && $s[2]) $suffix = $s[2];
731
  }
732
  $pattern = '/<img.+?alt\s*=\s*[\'|\"](.*?)[\'|\"].+?>/i';
733
  if (!preg_match_all($pattern, $content, $matches)) return '';
734
+ if (isset($s[0])) {
735
+ $i = $s[0];
736
+ }
737
+ if (isset($matches[1][$i])) {
738
+ return $matches[1][$i];
739
+ }
740
  }
741
 
742
  function otf_gravatar($option_key, $result, $ext) {
865
 
866
  // ****************************** Helper Functions *********************************************
867
 
868
+ function oth_post_first_image($id) {
869
+ $first_img = '';
870
+ if ($id == NULL)
871
+ return false;
872
+ else {
873
+ $post = get_post($id);
874
+ $output = preg_match_all('/<img.*?src=[\'"](.*?)[\'"].*?>/i', $post->post_content, $matches);
875
+ if (isset($matches[1][0])) {
876
+ // Exclude base64 images; meta tags require full URLs
877
+ if (strpos($matches[1][0], 'data:') === false) {
878
+ $first_img = $matches[1][0];
879
+ }
880
+ } else {
881
+ return false;
882
+ }
883
+ return $first_img;
884
+ }
885
+ }
886
+
887
+ /**
888
+ * This function returns the URL of the featured image for a given post
889
+ *
890
+ * @return returns `false` or a string of the image src
891
+ */
892
+ function oth_post_featured_image($id, $size = "thumbnail") {
893
+ $featured_img = '';
894
+ if ($id == NULL)
895
+ return false;
896
+ else {
897
+ $post = get_post($id);
898
+ if (function_exists('has_post_thumbnail') && has_post_thumbnail($post->ID)) {
899
+ $thumbnail_shareaholic = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'thumbnail');
900
+ $thumbnail_full = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'full');
901
+
902
+ if (($size == "thumbnail") && ($thumbnail_shareaholic[0] !== $thumbnail_full[0])) {
903
+ $featured_img = esc_attr($thumbnail_shareaholic[0]);
904
+ } else {
905
+ if ($size == "thumbnail") {
906
+ $thumbnail_large = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'large');
907
+ } else {
908
+ $thumbnail_large = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), $size);
909
+ }
910
+ $featured_img = esc_attr($thumbnail_large[0]);
911
+ }
912
+ } else {
913
+ return false;
914
+ }
915
+ }
916
+ return $featured_img;
917
+ }
918
+
919
  function oth_truncate_text($text, $ext) {
920
  if (!$ext) {
921
  return $text;
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: shareaholic
3
  Tags: related posts, similar posts, connected posts, related posts widget, linked posts
4
  Requires at least: 4.0
5
  Tested up to: 5.1
6
- Stable tag: 3.0.2
7
 
8
  Displays a list of related posts similar to the current one based on content, title and/or tags. Works with all themes and is very customizable!
9
 
@@ -67,26 +67,32 @@ Read the <a href="http://wordpress.org/support/plugin/similar-posts">support for
67
 
68
  == ChangeLog ==
69
 
 
 
 
 
 
 
70
  = 3.0.2 (2019-02-15) =
71
- * compatability with WordPress 5.1
72
 
73
  = 3.0.1 (2018-12-06) =
74
- * compatability with WordPress 5
75
 
76
  = 3.0.0 (2018-05-03) =
77
- * minor update
78
 
79
  = 2.8.1 (2018-05-03) =
80
- * minor update
81
 
82
  = 2.8 (2018-05-03) =
83
- * minor update
84
 
85
  = 2.75 (2017-07-27) =
86
- * minor update
87
 
88
  = 2.71 (2017-04-02) =
89
- * minor update
90
 
91
  = 2.71 (2016-09-13) =
92
  * no longer requires any additional plugins
3
  Tags: related posts, similar posts, connected posts, related posts widget, linked posts
4
  Requires at least: 4.0
5
  Tested up to: 5.1
6
+ Stable tag: 3.1.0
7
 
8
  Displays a list of related posts similar to the current one based on content, title and/or tags. Works with all themes and is very customizable!
9
 
67
 
68
  == ChangeLog ==
69
 
70
+ = 3.1.0 (2019-02-16) =
71
+ * Fixed compatability issues with PHP 7.2
72
+ * Addressed PHP warnings
73
+ * Algorithm updated to prefer newer posts over older ones
74
+ * General admin panel cleanup
75
+
76
  = 3.0.2 (2019-02-15) =
77
+ * Compatability with WordPress 5.1
78
 
79
  = 3.0.1 (2018-12-06) =
80
+ * Compatability with WordPress 5
81
 
82
  = 3.0.0 (2018-05-03) =
83
+ * Minor update
84
 
85
  = 2.8.1 (2018-05-03) =
86
+ * Minor update
87
 
88
  = 2.8 (2018-05-03) =
89
+ * Minor update
90
 
91
  = 2.75 (2017-07-27) =
92
+ * Minor update
93
 
94
  = 2.71 (2017-04-02) =
95
+ * Minor update
96
 
97
  = 2.71 (2016-09-13) =
98
  * no longer requires any additional plugins
similar-posts-admin.php CHANGED
@@ -519,8 +519,7 @@ function save_index_entries ($utf8=false, $use_stemmer='false', $batch=100, $cjk
519
  $start = 0;
520
  // in batches to conserve memory
521
  while ($posts = $wpdb->get_results("SELECT `ID`, `post_title`, `post_content`, `post_type` FROM $wpdb->posts LIMIT $start, $batch", ARRAY_A)) {
522
- reset($posts);
523
- while (list($dummy, $post) = each($posts)) {
524
  if ($post['post_type'] === 'revision') continue;
525
  $content = sp_get_post_terms($post['post_content'], $utf8, $use_stemmer, $cjk);
526
  $title = sp_get_title_terms($post['post_title'], $utf8, $use_stemmer, $cjk);
519
  $start = 0;
520
  // in batches to conserve memory
521
  while ($posts = $wpdb->get_results("SELECT `ID`, `post_title`, `post_content`, `post_type` FROM $wpdb->posts LIMIT $start, $batch", ARRAY_A)) {
522
+ foreach ($posts as $post) {
 
523
  if ($post['post_type'] === 'revision') continue;
524
  $content = sp_get_post_terms($post['post_content'], $utf8, $use_stemmer, $cjk);
525
  $title = sp_get_title_terms($post['post_title'], $utf8, $use_stemmer, $cjk);
similar-posts.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Similar Posts
4
  Plugin URI: https://wordpress.org/plugins/similar-posts/
5
  Description: Displays a highly configurable list of related posts. Similarity can be based on any combination of word usage in the content, title, or tags.
6
- Version: 3.0.2
7
  Author: Shareaholic
8
  Author URI: https://www.shareaholic.com
9
  Text Domain: similar-posts
@@ -165,7 +165,7 @@ class SimilarPosts {
165
  if ($check_custom) $where[] = where_check_custom($options['custom']['key'], $options['custom']['op'], $options['custom']['value']);
166
  $sql .= "WHERE ".implode(' AND ', $where);
167
  if ($check_custom) $sql .= " GROUP BY $wpdb->posts.ID";
168
- $sql .= " ORDER BY score DESC LIMIT $limit";
169
  //echo $sql;
170
  $results = $wpdb->get_results($sql);
171
  } else {
@@ -258,8 +258,7 @@ function sp_terms_by_textrank($ID, $num_terms = 20) {
258
  $word = strtok(' ');
259
  }
260
  // initialise the list of PageRanks-- one for each unique word
261
- reset($graph);
262
- while (list($vertex, $in_edges) = each($graph)) {
263
  $oldrank[$vertex] = 0.25;
264
  }
265
  $n = count($graph);
@@ -269,11 +268,9 @@ function sp_terms_by_textrank($ID, $num_terms = 20) {
269
  do {
270
  $error = 0.0;
271
  // the edge-weighted PageRank calculation
272
- reset($graph);
273
- while (list($vertex, $in_edges) = each($graph)) {
274
  $r = 0;
275
- reset($in_edges);
276
- while (list($edge, $weight) = each($in_edges)) {
277
  $r += ($weight * $oldrank[$edge]) / $out_edges[$edge];
278
  }
279
  $rank[$vertex] = $base + 0.95 * $r;
@@ -300,7 +297,7 @@ function sp_save_index_entry($postID) {
300
  global $wpdb, $table_prefix;
301
  $table_name = $table_prefix . 'similar_posts';
302
  $post = $wpdb->get_row("SELECT post_content, post_title, post_type FROM $wpdb->posts WHERE ID = $postID", ARRAY_A);
303
- if ($post['post_type'] === 'revision') return $postid;
304
  //extract its terms
305
  $options = get_option('similar-posts');
306
  $utf8 = ($options['utf8'] === 'true');
@@ -386,8 +383,7 @@ function sp_get_post_terms($text, $utf8, $use_stemmer, $cjk) {
386
  mb_internal_encoding('UTF-8');
387
  $wordlist = mb_split("\W+", sp_mb_clean_words($text));
388
  $words = '';
389
- reset($wordlist);
390
- while (list($n, $word) = each($wordlist)) {
391
  if ( mb_strlen($word) > 3 && !isset($overusedwords[$word])) {
392
  switch ($use_stemmer) {
393
  case 'true':
@@ -405,8 +401,7 @@ function sp_get_post_terms($text, $utf8, $use_stemmer, $cjk) {
405
  } else {
406
  $wordlist = str_word_count(sp_clean_words($text), 1);
407
  $words = '';
408
- reset($wordlist);
409
- while (list($n, $word) = each($wordlist)) {
410
  if ( strlen($word) > 3 && !isset($overusedwords[$word])) {
411
  switch ($use_stemmer) {
412
  case 'true':
3
  Plugin Name: Similar Posts
4
  Plugin URI: https://wordpress.org/plugins/similar-posts/
5
  Description: Displays a highly configurable list of related posts. Similarity can be based on any combination of word usage in the content, title, or tags.
6
+ Version: 3.1.0
7
  Author: Shareaholic
8
  Author URI: https://www.shareaholic.com
9
  Text Domain: similar-posts
165
  if ($check_custom) $where[] = where_check_custom($options['custom']['key'], $options['custom']['op'], $options['custom']['value']);
166
  $sql .= "WHERE ".implode(' AND ', $where);
167
  if ($check_custom) $sql .= " GROUP BY $wpdb->posts.ID";
168
+ $sql .= " ORDER BY score DESC, post_date DESC LIMIT $limit";
169
  //echo $sql;
170
  $results = $wpdb->get_results($sql);
171
  } else {
258
  $word = strtok(' ');
259
  }
260
  // initialise the list of PageRanks-- one for each unique word
261
+ foreach($graph as $vertex => $in_edges) {
 
262
  $oldrank[$vertex] = 0.25;
263
  }
264
  $n = count($graph);
268
  do {
269
  $error = 0.0;
270
  // the edge-weighted PageRank calculation
271
+ foreach($graph as $vertex => $in_edges) {
 
272
  $r = 0;
273
+ foreach($in_edges as $edge => $weight) {
 
274
  $r += ($weight * $oldrank[$edge]) / $out_edges[$edge];
275
  }
276
  $rank[$vertex] = $base + 0.95 * $r;
297
  global $wpdb, $table_prefix;
298
  $table_name = $table_prefix . 'similar_posts';
299
  $post = $wpdb->get_row("SELECT post_content, post_title, post_type FROM $wpdb->posts WHERE ID = $postID", ARRAY_A);
300
+ if ($post['post_type'] === 'revision') return $postID;
301
  //extract its terms
302
  $options = get_option('similar-posts');
303
  $utf8 = ($options['utf8'] === 'true');
383
  mb_internal_encoding('UTF-8');
384
  $wordlist = mb_split("\W+", sp_mb_clean_words($text));
385
  $words = '';
386
+ foreach ($wordlist as $word) {
 
387
  if ( mb_strlen($word) > 3 && !isset($overusedwords[$word])) {
388
  switch ($use_stemmer) {
389
  case 'true':
401
  } else {
402
  $wordlist = str_word_count(sp_clean_words($text), 1);
403
  $words = '';
404
+ foreach ($wordlist as $word) {
 
405
  if ( strlen($word) > 3 && !isset($overusedwords[$word])) {
406
  switch ($use_stemmer) {
407
  case 'true':