Zobrazte Twitter zmínky o vašich článcích


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/