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?