SEO Smart Links - Version 2.5.2

Version Description

  • Added Prevent duplicate links for custom keywords options (credits Adrian Ramiro)
Download this release

Release Info

Developer freediver
Plugin Icon 128x128 SEO Smart Links
Version 2.5.2
Comparing to
See all releases

Code changes from version 2.4 to 2.5.2

Files changed (2) hide show
  1. readme.txt +8 -2
  2. seo-links.php +48 -11
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: freediver
3
  Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
  Tags: Post, posts, comments, links, seo, google, automatic, affiliate
5
  Requires at least: 2.3
6
- Tested up to: 2.8.5
7
  Stable tag: trunk
8
 
9
  SEO Smart Links provides automatic SEO benefits for your site in addition to custom keyword lists, nofollow and much more.
@@ -25,6 +25,12 @@ Plugin by Vladimir Prelovac a <a href="http://www.prelovac.com/vladimir/services
25
 
26
  == Changelog ==
27
 
 
 
 
 
 
 
28
  = 2.4 =
29
  * Added LIMIT 2000 to most queries, should speed things up on large sites
30
 
@@ -32,7 +38,7 @@ Plugin by Vladimir Prelovac a <a href="http://www.prelovac.com/vladimir/services
32
  * General bug fixes. Fixed the issue with str_split. Solved heading issue which changed style code in heading tags.
33
 
34
  = 2.3 =
35
- * Prevent linking inside heading tags (h1, h2..) (credits to <a href="http://www.munchweb.com">Chris Tew</a>)
36
 
37
  = 2.2.2 =
38
  * Readme file consolidated
3
  Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
  Tags: Post, posts, comments, links, seo, google, automatic, affiliate
5
  Requires at least: 2.3
6
+ Tested up to: 2.9.2
7
  Stable tag: trunk
8
 
9
  SEO Smart Links provides automatic SEO benefits for your site in addition to custom keyword lists, nofollow and much more.
25
 
26
  == Changelog ==
27
 
28
+ = 2.5.2 =
29
+ * Added Prevent duplicate links for custom keywords options (credits Adrian Ramiro)
30
+
31
+ = 2.5 =
32
+ * Added support RSS feed processing
33
+
34
  = 2.4 =
35
  * Added LIMIT 2000 to most queries, should speed things up on large sites
36
 
38
  * General bug fixes. Fixed the issue with str_split. Solved heading issue which changed style code in heading tags.
39
 
40
  = 2.3 =
41
+ * Prevent linking inside heading tags (h1, h2..) (credits to Chris Tew)
42
 
43
  = 2.2.2 =
44
  * Readme file consolidated
seo-links.php CHANGED
@@ -2,11 +2,11 @@
2
 
3
  /*
4
  Plugin Name: SEO Smart Links
5
- Version: 2.4
6
  Plugin URI: http://www.prelovac.com/vladimir/wordpress-plugins/seo-smart-links
7
- Author: Vladimir Prelovac</a>
8
  Author URI: http://www.prelovac.com/vladimir
9
- Description: SEO Smart Links provides automatic SEO benefits for your site in addition to custom keyword lists, nofollow and much more.
10
  */
11
 
12
  // todo It's possible to have option for case insensitive ?
@@ -53,8 +53,9 @@ function SEOLinks_process_text($text, $mode)
53
 
54
 
55
 
56
-
57
- if ($options['onlysingle'] && !(is_single() || is_page()))
 
58
  return $text;
59
 
60
  $arrignorepost=$this->explode_trim(",", ($options['ignorepost']));
@@ -108,6 +109,26 @@ function SEOLinks_process_text($text, $mode)
108
 
109
  // thanks PK for the suggestion
110
  foreach (explode("\n", $options['customkey']) as $line) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  $chunks = array_map('trim', explode(",", $line));
112
  $total_chuncks = count($chunks);
113
  if($total_chuncks > 2) {
@@ -120,7 +141,10 @@ function SEOLinks_process_text($text, $mode)
120
  } else {
121
  list($keyword, $url) = array_map('trim', explode(",", $line, 2));
122
  if (!empty($keyword)) $kw_array[$keyword] = $url;
 
 
123
  }
 
124
  }
125
 
126
 
@@ -129,9 +153,11 @@ function SEOLinks_process_text($text, $mode)
129
 
130
  if ((!$maxlinks || ($links < $maxlinks)) && (trailingslashit($url)!=$thisurl) && !in_array( $options['casesens'] ? $name : strtolower($name), $arrignore))
131
  {
132
- if ($strpos_fnc($text, $name) !== false) { // credit to Dominik Deobald
133
  $name= preg_quote($name, '/');
134
 
 
 
135
  $replace="<a title=\"$1\" href=\"$url\">$1</a>";
136
  $regexp=str_replace('$name', $name, $reg);
137
  //$regexp="/(?!(?:[^<]+>|[^>]+<\/a>))(?<!\p{L})($name)(?!\p{L})/imsU";
@@ -316,12 +342,14 @@ function SEOLinks_comment_text_filter($text) {
316
  'maxsingle' => 1,
317
  'minusage' => 1,
318
  'customkey' => '',
 
319
  'nofoln' =>'',
320
  'nofolo' =>'',
321
  'blankn' =>'',
322
  'blanko' =>'',
323
  'onlysingle' => 'on',
324
- 'casesens' =>''
 
325
 
326
  );
327
 
@@ -368,17 +396,19 @@ function SEOLinks_comment_text_filter($text) {
368
  $options['lcats']=$_POST['lcats'];
369
  $options['ltags']=$_POST['ltags'];
370
  $options['ignore']=$_POST['ignore'];
371
- $options['ignorepost']=$_POST['ignorepost'];
372
  $options['maxlinks']=(int) $_POST['maxlinks'];
373
  $options['maxsingle']=(int) $_POST['maxsingle'];
374
  $options['minusage']=(int) $_POST['minusage']; // credit to Dominik Deobald
375
  $options['customkey']=$_POST['customkey'];
 
376
  $options['nofoln']=$_POST['nofoln'];
377
  $options['nofolo']=$_POST['nofolo'];
378
  $options['blankn']=$_POST['blankn'];
379
  $options['blanko']=$_POST['blanko'];
380
  $options['onlysingle']=$_POST['onlysingle'];
381
  $options['casesens']=$_POST['casesens'];
 
382
 
383
 
384
  update_option($this->SEOLinks_DB_option, $options);
@@ -402,17 +432,19 @@ function SEOLinks_comment_text_filter($text) {
402
  $lcats=$options['lcats']=='on'?'checked':'';
403
  $ltags=$options['ltags']=='on'?'checked':'';
404
  $ignore=$options['ignore'];
405
- $ignorepost=$options['ignorepost'];
406
  $maxlinks=$options['maxlinks'];
407
  $maxsingle=$options['maxsingle'];
408
  $minusage=$options['minusage'];
409
  $customkey=stripslashes($options['customkey']);
 
410
  $nofoln=$options['nofoln']=='on'?'checked':'';
411
  $nofolo=$options['nofolo']=='on'?'checked':'';
412
  $blankn=$options['blankn']=='on'?'checked':'';
413
  $blanko=$options['blanko']=='on'?'checked':'';
414
  $onlysingle=$options['onlysingle']=='on'?'checked':'';
415
  $casesens=$options['casesens']=='on'?'checked':'';
 
416
 
417
  if (!is_numeric($minusage)) $minusage = 1;
418
 
@@ -479,7 +511,10 @@ function SEOLinks_comment_text_filter($text) {
479
  <h2>Settings</h2>
480
  <p>To reduce database load you can choose to have SEO SMART links work only on single posts and pages (for example not on main page or archives).</p>
481
  <input type="checkbox" name="onlysingle" $onlysingle /><label for="onlysingle"> Process only single posts and pages</label> <br>
482
-
 
 
 
483
  <p>Set whether matching should be case sensitive.</p>
484
  <input type="checkbox" name="casesens" $casesens /><label for="casesens"> Case sensitive matching</label> <br>
485
 
@@ -500,6 +535,8 @@ function SEOLinks_comment_text_filter($text) {
500
  cars, car, autos, auto, http://mycarblog.com/<br />
501
  </p>
502
 
 
 
503
  <textarea name="customkey" id="customkey" rows="10" cols="90" >$customkey</textarea>
504
  <br><br>
505
 
@@ -529,7 +566,7 @@ function SEOLinks_comment_text_filter($text) {
529
 
530
  </div>
531
 
532
- <h5>WordPress plugin by <a href="http://www.prelovac.com/vladimir/">Vladimir Prelovac</a></h5>
533
  </div>
534
  END;
535
 
2
 
3
  /*
4
  Plugin Name: SEO Smart Links
5
+ Version: 2.5.2
6
  Plugin URI: http://www.prelovac.com/vladimir/wordpress-plugins/seo-smart-links
7
+ Author: Vladimir Prelovac
8
  Author URI: http://www.prelovac.com/vladimir
9
+ Description: SEO Smart Links provides automatic SEO benefits for your site in addition to custom keyword lists, nofollow and much more. (Brian Edition)
10
  */
11
 
12
  // todo It's possible to have option for case insensitive ?
53
 
54
 
55
 
56
+ if (is_feed() && !$options['allowfeed'])
57
+ return $text;
58
+ else if ($options['onlysingle'] && !(is_single() || is_page()))
59
  return $text;
60
 
61
  $arrignorepost=$this->explode_trim(",", ($options['ignorepost']));
109
 
110
  // thanks PK for the suggestion
111
  foreach (explode("\n", $options['customkey']) as $line) {
112
+
113
+
114
+
115
+ if($options['customkey_preventduplicatelink'] == TRUE) { //Prevent duplicate links for grouped custom keywords
116
+
117
+ $line = trim($line);
118
+ $lastDelimiterPos=strrpos($line, ',');
119
+ $url = substr($line, $lastDelimiterPos + 1 );
120
+ $keywords = substr($line, 0, $lastDelimiterPos);
121
+
122
+ if(!empty($keywords) && !empty($url)){
123
+ $kw_array[$keywords] = $url;
124
+ }
125
+
126
+ $keywords='';
127
+ $url='';
128
+
129
+ } else { //Old custom keywords behaviour
130
+
131
+
132
  $chunks = array_map('trim', explode(",", $line));
133
  $total_chuncks = count($chunks);
134
  if($total_chuncks > 2) {
141
  } else {
142
  list($keyword, $url) = array_map('trim', explode(",", $line, 2));
143
  if (!empty($keyword)) $kw_array[$keyword] = $url;
144
+ }
145
+
146
  }
147
+
148
  }
149
 
150
 
153
 
154
  if ((!$maxlinks || ($links < $maxlinks)) && (trailingslashit($url)!=$thisurl) && !in_array( $options['casesens'] ? $name : strtolower($name), $arrignore))
155
  {
156
+ if (($options['customkey_preventduplicatelink'] == TRUE) || $strpos_fnc($text, $name) !== false) { // credit to Dominik Deobald -- TODO: change string search for preg_match
157
  $name= preg_quote($name, '/');
158
 
159
+ if($options['customkey_preventduplicatelink'] == TRUE) $name = str_replace(',','|',$name); //Modifying RegExp for count all grouped keywords as the same one
160
+
161
  $replace="<a title=\"$1\" href=\"$url\">$1</a>";
162
  $regexp=str_replace('$name', $name, $reg);
163
  //$regexp="/(?!(?:[^<]+>|[^>]+<\/a>))(?<!\p{L})($name)(?!\p{L})/imsU";
342
  'maxsingle' => 1,
343
  'minusage' => 1,
344
  'customkey' => '',
345
+ 'customkey_preventduplicatelink' => FALSE,
346
  'nofoln' =>'',
347
  'nofolo' =>'',
348
  'blankn' =>'',
349
  'blanko' =>'',
350
  'onlysingle' => 'on',
351
+ 'casesens' =>'',
352
+ 'allowfeed' => ''
353
 
354
  );
355
 
396
  $options['lcats']=$_POST['lcats'];
397
  $options['ltags']=$_POST['ltags'];
398
  $options['ignore']=$_POST['ignore'];
399
+ $options['ignorepost']=$_POST['ignorepost'];
400
  $options['maxlinks']=(int) $_POST['maxlinks'];
401
  $options['maxsingle']=(int) $_POST['maxsingle'];
402
  $options['minusage']=(int) $_POST['minusage']; // credit to Dominik Deobald
403
  $options['customkey']=$_POST['customkey'];
404
+ $options['customkey_preventduplicatelink']=$_POST['customkey_preventduplicatelink'];
405
  $options['nofoln']=$_POST['nofoln'];
406
  $options['nofolo']=$_POST['nofolo'];
407
  $options['blankn']=$_POST['blankn'];
408
  $options['blanko']=$_POST['blanko'];
409
  $options['onlysingle']=$_POST['onlysingle'];
410
  $options['casesens']=$_POST['casesens'];
411
+ $options['allowfeed']=$_POST['allowfeed'];
412
 
413
 
414
  update_option($this->SEOLinks_DB_option, $options);
432
  $lcats=$options['lcats']=='on'?'checked':'';
433
  $ltags=$options['ltags']=='on'?'checked':'';
434
  $ignore=$options['ignore'];
435
+ $ignorepost=$options['ignorepost'];
436
  $maxlinks=$options['maxlinks'];
437
  $maxsingle=$options['maxsingle'];
438
  $minusage=$options['minusage'];
439
  $customkey=stripslashes($options['customkey']);
440
+ $customkey_preventduplicatelink=$options['customkey_preventduplicatelink'] == TRUE ? 'checked' : '';
441
  $nofoln=$options['nofoln']=='on'?'checked':'';
442
  $nofolo=$options['nofolo']=='on'?'checked':'';
443
  $blankn=$options['blankn']=='on'?'checked':'';
444
  $blanko=$options['blanko']=='on'?'checked':'';
445
  $onlysingle=$options['onlysingle']=='on'?'checked':'';
446
  $casesens=$options['casesens']=='on'?'checked':'';
447
+ $allowfeed=$options['allowfeed']=='on'?'checked':'';
448
 
449
  if (!is_numeric($minusage)) $minusage = 1;
450
 
511
  <h2>Settings</h2>
512
  <p>To reduce database load you can choose to have SEO SMART links work only on single posts and pages (for example not on main page or archives).</p>
513
  <input type="checkbox" name="onlysingle" $onlysingle /><label for="onlysingle"> Process only single posts and pages</label> <br>
514
+ <br />
515
+ <p>Allow processing of RSS feeds. SEO Smart links will embed links in all posts in your RSS feed (according to other options)</p>
516
+ <input type="checkbox" name="allowfeed" $allowfeed /><label for="allowfeed"> Process RSS feeds</label> <br>
517
+ <br />
518
  <p>Set whether matching should be case sensitive.</p>
519
  <input type="checkbox" name="casesens" $casesens /><label for="casesens"> Case sensitive matching</label> <br>
520
 
535
  cars, car, autos, auto, http://mycarblog.com/<br />
536
  </p>
537
 
538
+ <input type="checkbox" name="customkey_preventduplicatelink" $customkey_preventduplicatelink /><label for="customkey_preventduplicatelink"> Prevent Duplicate links for grouped keywords (will link only first of the keywords found in text)</label> <br>
539
+
540
  <textarea name="customkey" id="customkey" rows="10" cols="90" >$customkey</textarea>
541
  <br><br>
542
 
566
 
567
  </div>
568
 
569
+ <h5>Another fine WordPress plugin by <a href="http://www.prelovac.com/vladimir/">Vladimir Prelovac</a></h5>
570
  </div>
571
  END;
572