Thursday, October 18, 2012

Twitter in wordpress Woes

Just a quick note to anyone experiencing twitter feed difficulties in Wordpress - specifically 'twitter for Wordpress' or old jquery.twitter plugins.

It seems as though a twitter api agreement has changed (probably set in motion a while back, but only the last few days has made the switch)


For 'Twitter for Wordpress'
change the line:

$messages = fetch_rss('http://twitter.com/statuses/user_timeline/'.$username.'.rss');

with

$messages = fetch_rss('http://api.twitter.com/1/statuses/user_timeline/'.$username.'.rss');


For jquery.twitter.js

replace all code with:
(Thanks to Damien du Toit)

(function($) {
    /*
        jquery.twitter.js v1.6
        Last updated: 16 October 2012

        Created by Damien du Toit
        http://coda.co.za/content/projects/jquery.twitter/

        Licensed under a Creative Commons Attribution-Non-Commercial 3.0 Unported License
        http://creativecommons.org/licenses/by-nc/3.0/
    */

    $.fn.getTwitter = function(options) {

        $.fn.getTwitter.defaults = {
            userName: null,
            numTweets: 5,
            loaderText: "Loading tweets...",
            slideIn: true,
            slideDuration: 750,
            showHeading: true,
            headingText: "Latest Tweets",
            showProfileLink: true,
            showTimestamp: true,
            includeRetweets: false,
            excludeReplies: true
        };

        var o = $.extend({}, $.fn.getTwitter.defaults, options);

        return this.each(function() {
            var c = $(this);

            // hide container element, remove alternative content, and add class
            c.hide().empty().addClass("twitted");

            // add heading to container element
            if (o.showHeading) {
                c.append("

"+o.headingText+"

");
            }

            // add twitter list to container element
            var twitterListHTML = "
    ";
                c.append(twitterListHTML);

                var tl = $("#twitter_update_list");

                // hide twitter list
                tl.hide();

                // add preLoader to container element
                var preLoaderHTML = $("
    "+o.loaderText+"
    ");
                c.append(preLoaderHTML);

                // add Twitter profile link to container element
                if (o.showProfileLink) {
                    var profileLinkHTML = " ";
                    c.append(profileLinkHTML);
                }

                // show container element
                c.show();

                // request (o.numTweets + 20) to avoid not having enough tweets if includeRetweets = false and/or excludeReplies = true
                window.jsonTwitterFeed = "https://api.twitter.com/1/statuses/user_timeline.json?include_rts="+o.includeRetweets+"&excludeReplies="+o.excludeReplies+"&screen_name="+o.userName+"&count="+(o.numTweets + 20);

                $.ajax({
                    url: jsonTwitterFeed,
                    data: {},
                    dataType: "jsonp",
                    callbackParameter: "callback",
                    timeout: 50000,
                    success: function(data) {
                        window.count = 0;

                        $.each(data, function(key, val) {
                            var tweetHTML = "
  • " + replaceURLWithHTMLLinks(val.text) + "";

                            if (o.showTimestamp) tweetHTML += " " + relative_time(val.created_at) + "";
                       
                            tweetHTML += "
  • ";

                            $("#twitter_update_list").append(tweetHTML);

                            count++;

                            if (count == o.numTweets) {
                                // remove preLoader from container element
                                $(preLoaderHTML).remove();

                                // show twitter list
                                if (o.slideIn) {
                                    // a fix for the jQuery slide effect
                                    // Hat-tip: http://blog.pengoworks.com/index.cfm/2009/4/21/Fixing-jQuerys-slideDown-effect-ie-Jumpy-Animation
                                    var tlHeight = tl.data("originalHeight");
                   
                                    // get the original height
                                    if (!tlHeight) {
                                        tlHeight = tl.show().height();
                                        tl.data("originalHeight", tlHeight);
                                        tl.hide().css({height: 0});
                                    }

                                    tl.show().animate({height: tlHeight}, o.slideDuration);
                                }
                                else {
                                    tl.show();
                                }
                   
                                // add unique class to first list item
                                tl.find("li:first").addClass("firstTweet");
                   
                                // add unique class to last list item
                                tl.find("li:last").addClass("lastTweet");

                                return false;
                            }
                        });
                    },
                    error: function(XHR, textStatus, errorThrown) {
                        //alert("Error: " + textStatus);
                        //alert("Error: " + errorThrown);
                    }
                });
            });

            function replaceURLWithHTMLLinks(text) {
                var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
                return text.replace(exp, "$1");
            }

            // sourced from https://twitter.com/javascripts/blogger.js
            function relative_time(time_value) {
                var values = time_value.split(" ");
                time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
                var parsed_date = Date.parse(time_value);
                var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
                var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
                delta = delta + (relative_to.getTimezoneOffset() * 60);
               
                if (delta < 60) {
                    return "less than a minute ago";
                }
                else if (delta < 120) {
                    return "about a minute ago";
                }
                else if (delta < (60*60)) {
                    return (parseInt(delta / 60)).toString() + " minutes ago";
                }
                else if (delta < (120*60)) {
                    return "about an hour ago";
                }
                else if (delta < (24*60*60)) {
                    return "about " + (parseInt(delta / 3600)).toString() + " hours ago";
                }
                else if (delta < (48*60*60)) {
                    return "1 day ago";
                }
                else {
                    return (parseInt(delta / 86400)).toString() + " days ago";
                }
            }
        };
    })(jQuery);

    No comments: