Trackback je nástroj, s jehož pomocí je možné při psaní reakce na něčí článek jednoduše upozornit autora, že na jeho článek bylo reagováno, odkud, kým a jak. Zkoumal jsem TB trochu důkladněji, protože jsem jeho podporu přidával vlastnímu blogu a tak popíšu, jak to všechno funguje.
Pro přijetí TB vytvoříme soubor,
který pak u článků uvádíme jako Trackback URL. V adrese odkazu
TB URL by měla být definována proměnná, která pak umožní zjistit, ke
kterému blogpostu poslaný TB patří.
Já volil variantu $id, tedy id postu v databázi.
Trackback ping je posílán metodou POST a posílá čtyři zásadní proměnné:
Po načtení skriptu je záhodno ověřit, zda se vůbec jedná o Trackback. Není-li tomu tak, přesměrujeme na permalink příspěvku, nebo zobrazíme chybovou hlášku, následující příklad dělá první možnost:
if (empty($_POST["tb_url"]) && empty($_POST["title"]) && empty($_POST["excerpt"])){
header('Location: http://www.example.com/item/item_permalink');
exit;
Projde-li načtení stránky skutečně jako TB ping, následuje další vlna ověřování. Je fajn omezit posílání na jeden TB pro jedno URL, aby se Trackbacky pro jeden příspěvek neopakovaly. Podle výsledku této podmínky vypíšeme výstup. Ten MUSÍ být v Content-Type: text/xml; a má danou formu. Nejjednodušší je, definovat si funkci, která se pak volá (inspiraoval jsem se wordpressem):
function trackback_response($error = 0, $error_message = '') {
header('Content-Type: text/xml; charset=UTF-8' );
if ($error) {
echo '<?xml version="1.0" encoding="utf-8"?'.">\n";
echo "<response>\n";
echo "<error>1</error>\n";
echo "<message>$error_message</message>\n";
echo "</response>";
die();
} else {
echo '<?xml version="1.0" encoding="utf-8"?'.">\n";
echo "<response>\n";
echo "<error>0</error>\n";
echo "</response>";
}
}
Parametry funkci nastavíme podle toho, v jaké části ověřovacího
řetězce ji voláme – v chybové s $error = 0, ve
„všechno-v-pořádkové“ s $error = 1 a stanovenou
$error_message. Ve „všechno-v-pořádkové“ části
pak také dál TB zpracujeme: vložení do
databáze, poslání upozorňovacího e-mailu…
Posílání popisuje následující kus kódu:
$query_string = "title=$title&url=$url&blog_name=$blog_name&excerpt=$excerpt";
$http_request = 'POST http://www.example.com/trackback.php?id=666'." HTTP/1.0\r\n";
$http_request .= 'Host: www.example.com'."\r\n";
$http_request .= 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'."\r\n";
$http_request .= 'Content-Length: '.strlen($query_string)."\r\n";
$http_request .= "User-Agent: User Agent X.x";
$http_request .= "\r\n\r\n";
$http_request .= $query_string;
if ( '' == $trackback_url['port'] )
$trackback_url['port'] = 80;
$fs = fsockopen("www.example.com", "80", $errno, $errstr, 4);
fputs($fs, $http_request);
Proměnná $query_string určuje POST proměnné poslané
skriptu, který TB zpracovává. za $ proměnné se samozřejmě dosazují
hodnoty dané pro reagující příspěvek. Celý ping musí být poslán s
Content-Type: application/x-www-form-urlencoded, User-Agent si
vyplňte dle svého. Místo www.example.com se samozřejmě definuje host
cílové adresy.
RSS feed komentářů k tomuto článku
Podle specifikace jsou ty dva povinné. Co si kdo bude testovat skriptem je jeho věc. A jinak je to fajn postřeh, dik.
Hele, Matěji, píšeš, že u parametry title a url jsou povinné, ale v příkladu testuješ title , url ne a jako bonus ještě ty dva nepovinné. Zvláštní, ne?