Pro ty z vás, kteří se ve WordPressu příliš vrtat nechtějí, mám tuto funkci použitou ve formě pluginu. Stačí stáhnout twitter_mentions.zip a nainstaloval. Jednu věc, ale přeci jen budete muset udělat. Na místo, kde mají v šabloně zmínky zobrazovat vložit kód:
vypsatTweety();
A jak to vlastně celé funguje? Každou hodinu se spouští funkce nactiTwitter, která sleduje, zda jsou u jednotlivých příspěvků zmínky kontrolovány. Každý post má vlastní interval, který se počítá ve funkci nactipost. Čím novější příspěvek, tím kratší interval. U těch nejstarších je interval 2-3 dny u nejnovějších 20-30 minut.
Jednotlivé intervaly jsou zčásti náhodné, takže se zmínky nenačítají nárazově, ale postupně.
Dejte si ale pozor, staré tweety z vyhledání postupně mizí, takže se zmínky se nenaleznou zpětně. Objeví se pouze u nových článků. Jakmile ale jednou budou načteny, necachují se a už je neztratíte.
A teď samotný kód, který si můžete vložit do functions.php
<?php add_action('nactipost_hook', 'nactipost', 10, 1); add_action('tw_hodina', 'nactiTwitter'); function tw_cron_activation() { if (!wp_next_scheduled('tw_hodina')) { wp_schedule_event(time(), 'hourly', 'tw_hodina'); nactiTwitter(); } } add_action('wp', 'tw_cron_activation'); function searchTwitterID($id, $array) { $found = false; if ($array) { foreach ($array as $key => $value) { if ($value['id'] == $id) { $found = true; break; } } } return $found; } function nactipost($id) { global $wpdb; $url = get_permalink($id); $rozdil = time() - Date("U", strtotime($wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE ID = '" . $id . "'"))); $hodina = 60 * 60; if ($rozdil < $hodina * 24) $cas = rand(60 * 20, 60 * 30); elseif ($rozdil < $hodina * 24 * 2) $cas = rand($hodina * 2, $hodina * 3); elseif ($rozdil < $hodina * 24 * 7) $cas = rand($hodina * 12, $hodina * 24); else $cas = rand($hodina * 48, $hodina * 72); if ($cas > 0) wp_schedule_single_event(time() + $cas, 'nactipost_hook', array('id' => $id)); $tweets = json_decode( file_get_contents("http://search.twitter.com/search.json?q=" . urlencode($url) . "&rpp=100&include_entities=true&result_type=mixed") ); $mentions = get_post_meta($id, 'twitterMentions', true); if ($tweets->results) { foreach ($tweets->results as $tweet) { $unixTime = strtotime($tweet->created_at); $date = date('d.m.Y H:i:s', $unixTime); $tweetID = $tweet->id; if (!searchTwitterID($tweetID, $mentions)) { $mentions[$unixTime] = array('id' => $tweetID, 'text' => " <a href='http://twitter.com/" . $tweet->from_user . "'> <img src='" . $tweet->profile_image_url . "' style='float: left; margin: 0 10px 10px 0'/> </a> <p> <strong> <a href='http://twitter.com/" . $tweet->from_user . "'>@" . $tweet->from_user . "</a> </strong> <em> (" . $date . ") </em> <br />" . twitterLinks($tweet->text) . " </p> <br /> <div style='clear: both'></div>"); } } ksort($mentions); update_post_meta($id, "twitterMentions", $mentions); } } function twitterLinks($tweetText) { $tweetText = preg_replace("/(http://)(.*?)/([w./&=?-,:;#_~%+]*)/", "<a href='\0'>" . ("\0") . "</a>", $tweetText); $matches = array(); preg_match_all("/s*http://t.co([a-zA-Z0-9/*-_?&;%=.]*)/i", $tweetText, $matches); $tcoLinks = $matches[0]; $founded = array(); $originalLinks = array(); foreach ($tcoLinks as $link) { if (!in_array($link, $founded)) { $original = vratTCO($link); $originalLinks[] = $original; $founded[] = $link; } } $tweetText = str_replace($tcoLinks, $originalLinks, $tweetText); $tweetText = preg_replace("(@([a-zA-Z0-9_]+))", "<a href="http://www.twitter.com/\1">\0</a>", $tweetText); return preg_replace('/(^|s)#(w+)/u', '1<a href="http://search.twitter.com/search?q=%232">#2</a>', $tweetText); } function vratTCO($url) { $curl = curl_init($url); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, true); $return = curl_exec($ch); $info = curl_getinfo($ch); if ($info['http_code'] == 200) { $url = explode("URL=http", $return); $url = explode(""", $url[1]); return "http" . $url[0]; } else return false; } function nactiTwitter() { global $wpdb; foreach ($wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_type='post' AND post_status='publish'") as $post) { if (!wp_next_scheduled('nactipost_hook', array('id' => $post->ID))) { wp_schedule_single_event(time() + rand(60 * 10, 60 * 30), 'nactipost_hook', array('id' => $post->ID)); } } } function vypsatTweety() { global $post; $tweets = get_post_meta($post->ID, 'twitterMentions', true); if ($tweets) { echo "<h3>Zmínky na Twitteru</h3><div id='tweets'>"; foreach ($tweets as $tweet) { echo "<div class='tweet'>" . $tweet['text'] . "</div>"; } echo "</div>"; } } ?>
A jaké jsou další možnosti vylepšení? Sledovat mentions nalezených tweetů nebo je vkládat automaticky do komentářů. Určitě existují i další možnosti.
Plugin je možné stahovat přímo z repozitáře WordPressu – wordpress.org/plugins/twitter-mentions-in-posts/