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