Užitečné funkce pro PHP - díl 3.
Jeden z častých problémů weblogů je ten, že obsahují velké množství externích linků, takže de-facto reprezentují takovou malou link-farmu. Nic dobrého pro Google Page Rank. S PHP se to dá velice vhodně řešit. V případě BLOG:CMS je to celé možné napsat jako plugin.
Kód používá jednu z nejmocnějších funkcí v PHP, a to preg_replace_callback.
Je dobré se s ní pořádně seznámit.
Vlastní implementace je pak poměrně jednoduchá. Uvedený objekt nám převede libovolný
text tak, že veškeré externí linky budou směrovat na Váš vlastní web a otevírány
přes proměnnou url. Ve spojení s NP_Cache je to možné dělat i za běhu serveru,
nikoliv jen při ukládání.
<?php
class SEO {
// inicializace
function SEO(){
global $_SERVER;
$this->server = $_SERVER['HTTP_HOST'];
$this->redirect = '/redirect/';
}
// převede externí linky v textu na
// URL typu /redirect/?url=http://externi
function _SEO(&$text){
$text = preg_replace_callback(
'/<a(.*?)href=[\"|\'](.*?)[\"|\']/',
array(&$this, 'myLink'),
$text);
}
// callback funkce, převede linky, které nejsou na moji
// doménu, a obsahují URI na SEO-friendly formát
function myLink($m){
if (strstr($m[2],$this->server) ||
( !strstr($m[2],'http://') &&
!strstr($m[2],'//') &&
!strstr($m[2],'ftp://') ) )
return '<a'.$m[1].'href="'.$m[2].'"';
else
return '<a'.$m[1].'href="'.
$this->redirect.'?url='.$m[2].'"';
}
} // end class SEO
?>
Samozřejmě musíme vytvořit na serveru i adresář /redirect/ a v něm soubor
index.php, s tímto obsahem:
<?php
function undoMagic($data) {
return get_magic_quotes_gpc() ? stripslashes($data) : $data;
}
header('Location: '.undoMagic($_GET['url']));
?>
Následné použití této funkce si snad již umí každý odvodit:
<?php $seo=& new SEO(); $seo->_SEO($text); ?>
Radku $_SERVER je superglobálna premenná a je preto zbytočné ju explicitne označovať ako globálnu kódom
global $_SERVER;[1] to samozřejmě ano, toto vyplývá z mého stylu kódování, i superglobální proměnné zásadně deklarovat uvnitř funkce.. Dá se tím vyvarovat pár chybám, protože proměnné v PHP (koncepce) mají hodně špatný návrh (oproti třeba C++)..
[2] Akým chybám napríklad?