将Twitter提要作为短代码集成到WordPress网站中


Integrating a Twitter feed into a WordPress site as a shortcode

我正在为这个拔头发。我正在尝试在我正在构建的 wordpress 主题中创建一个短代码,当使用时,会显示用户的推文。

我在这里使用安德鲁·比格特(Andrew Biggart)提供的代码 https://github.com/andrewbiggart/latest-tweets-php-o-auth 来创建Twitter提要。

这是我的代码是如何设置的,我在我的主题根目录中有一个名为"tweets.php"的 php 文件,这是我设置消费者密钥等的地方 - 现在我已经对这些进行了硬编码,以便我可以让它工作。完整的 php 代码如下所示:

<?php
/**
 * Twitter feed which uses twitteroauth for authentication
 * 
 * @version 1.0
 * @author  Andrew Biggart
 * @link    https://github.com/andrewbiggart/latest-tweets-php-o-auth/
 * 
 * Notes:
 * Caching is employed because Twitter only allows their RSS and json feeds to be accesssed 150
 * times an hour per user client.
 * --
 * Dates can be displayed in Twitter style (e.g. "1 hour ago") by setting the 
 * $twitter_style_dates param to true.
 *
 * You will also need to register your application with Twitter, to get your keys and tokens.
 * You can do this here: (https://dev.twitter.com/).
 *
 * Don't forget to add your username to the bottom of the script.
 * 
 * Credits:
 ***************************************************************************************
 * Initial script before API v1.0 was retired
 * http://f6design.com/journal/2010/10/07/display-recent-twitter-tweets-using-php/
 *
 * Which includes the following credits
 * Hashtag/username parsing based on: http://snipplr.com/view/16221/get-twitter-tweets/
 * Feed caching: http://www.addedbytes.com/articles/caching-output-in-php/
 * Feed parsing: http://boagworld.com/forum/comments.php?DiscussionID=4639
 ***************************************************************************************
 *
 ***************************************************************************************
 * Authenticating a User Timeline for Twitter OAuth API V1.1
 * http://www.webdevdoor.com/php/authenticating-twitter-feed-timeline-oauth/
 ***************************************************************************************
 *
 ***************************************************************************************
 * Twitteroauth which has been used for the authentication process
 * https://github.com/abraham/twitteroauth
 ***************************************************************************************
 *
 *
**/
// Set timezone. (Modify to match your timezone) If you need help with this, you can find it here. (http://php.net/manual/en/timezones.php)
date_default_timezone_set('Europe/London');
// Require TwitterOAuth files. (Downloadable from : https://github.com/abraham/twitteroauth)
require_once("twitteroauth/twitteroauth/twitteroauth.php");
// Function to authenticate app with Twitter.
function getConnectionWithAccessToken($cons_key, $cons_secret, $oauth_token, $oauth_token_secret) {
  $connection = new TwitterOAuth($cons_key, $cons_secret, $oauth_token, $oauth_token_secret);
  return $connection;
}
// Function to display the latest tweets.
function display_latest_tweets(
    // Function parameters.
    $twitter_user_id,
    $cache_file          = './tweets.txt',  // Change this to the path of your cache file. (Default : ./tweets.txt)
    $tweets_to_display   = 5,               // Number of tweets you would like to display. (Default : 5)
    $ignore_replies      = false,           // Ignore replies from the timeline. (Default : false)
    $include_rts         = false,           // Include retweets. (Default : false)
    $twitter_wrap_open   = '<ul class="home-tweets-ul">',
    $twitter_wrap_close  = '</ul>',
    $tweet_wrap_open     = '<li><p class="home-tweet-tweet">',
    $meta_wrap_open      = '<br/><span class="home-tweet-date">',
    $meta_wrap_close     = '</span>',
    $tweet_wrap_close    = '</p></li>',
    $date_format         = 'g:i A M jS',    // Date formatting. (http://php.net/manual/en/function.date.php)
    $twitter_style_dates = true){           // Twitter style days. [about an hour ago] (Default : true)
    // Twitter keys (You'll need to visit https://dev.twitter.com and register to get these.
    $consumerkey         = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $consumersecret      = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $accesstoken         = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $accesstokensecret   = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
    // Seconds to cache feed (Default : 3 minutes).
    $cachetime           = 60*3;
    // Time that the cache was last updtaed.
    $cache_file_created  = ((file_exists($cache_file))) ? filemtime($cache_file) : 0;
    // A flag so we know if the feed was successfully parsed.
    $tweet_found         = false;
    // Show cached version of tweets, if it's less than $cachetime.
    if (time() - $cachetime < $cache_file_created) {
        $tweet_found = true;
        // Display tweets from the cache.
        readfile($cache_file);       
    } else {
    // Cache file not found, or old. Authenticae app.
    $connection = getConnectionWithAccessToken($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);
        if($connection){
            // Get the latest tweets from Twitter
            $get_tweets = $connection->get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=".$twitter_user_id."&count=".$tweets_to_display."&include_rts=".$include_rts."&exclude_replies=".$ignore_replies);
            // Error check: Make sure there is at least one item.
            if (count($get_tweets)) {
                // Define tweet_count as zero
                $tweet_count = 0;
                // Start output buffering.
                ob_start();
                // Open the twitter wrapping element.
                $twitter_html = $twitter_wrap_open;
                // Iterate over tweets.
                foreach($get_tweets as $tweet) {
                        $tweet_found = true;
                        $tweet_count++;
                        $tweet_desc = $tweet->text;
                        // Add hyperlink html tags to any urls, twitter ids or hashtags in the tweet.
                        $tweet_desc = preg_replace("/((http)+(s)?:'/'/[^<>'s]+)/i", "<a href='"''0'" target='"_blank'">''0</a>", $tweet_desc );
                        $tweet_desc = preg_replace("/[@]+([A-Za-z0-9-_]+)/", "<a href='"http://twitter.com/''1'" target='"_blank'">''0</a>", $tweet_desc );
                        $tweet_desc = preg_replace("/[#]+([A-Za-z0-9-_]+)/", "<a href='"http://twitter.com/search?q=%23''1'" target='"_blank'">''0</a>", $tweet_desc );

          // replace t.co links with expanded link, if present
          $entities = $tweet->entities;
          if(!empty($entities->urls[0]->expanded_url)) {
          $tweet_desc = str_replace($entities->urls[0]->url, $entities->urls[0]->expanded_url, $tweet_desc);
          }

                        // Convert Tweet display time to a UNIX timestamp. Twitter timestamps are in UTC/GMT time.
                        $tweet_time = strtotime($tweet->created_at);    
                        if ($twitter_style_dates){
                            // Current UNIX timestamp.
                            $current_time = time();
                            $time_diff = abs($current_time - $tweet_time);
                            switch ($time_diff) 
                            {
                                case ($time_diff < 60):
                                    $display_time = $time_diff.' seconds ago';                  
                                    break;      
                                case ($time_diff >= 60 && $time_diff < 3600):
                                    $min = floor($time_diff/60);
                                    $display_time = $min.' minutes ago';                  
                                    break;      
                                case ($time_diff >= 3600 && $time_diff < 86400):
                                    $hour = floor($time_diff/3600);
                                    $display_time = 'about '.$hour.' hour';
                                    if ($hour > 1){ $display_time .= 's'; }
                                    $display_time .= ' ago';
                                    break;          
                                default:
                                    $display_time = date($date_format,$tweet_time);
                                    break;
                            }
                        } else {
                            $display_time = date($date_format,$tweet_time);
                        }
                        // Render the tweet.
                        $twitter_html .= $tweet_wrap_open.html_entity_decode($tweet_desc).$meta_wrap_open.'<a href="http://twitter.com/'.$twitter_user_id.'">'.$display_time.'</a>'.$meta_wrap_close.$tweet_wrap_close;
                    // If we have processed enough tweets, stop.
                    if ($tweet_count >= $tweets_to_display){
                        break;
                    }
                }
                // Close the twitter wrapping element.
                $twitter_html .= $twitter_wrap_close;
                echo $twitter_html;
                // Generate a new cache file.
                $file = fopen($cache_file, 'w');
                // Save the contents of output buffer to the file, and flush the buffer. 
                fwrite($file, ob_get_contents()); 
                fclose($file); 
                ob_end_flush();
            }
        }
    }
}
display_latest_tweets('samskirrow');
?>

我还有一个名为twitteroauth的子目录,其中包含相关文件(直接取自Andrew Biggart的github页面)

最后,在我的函数中.php我有以下代码来创建简码:

function twitter_feed( $atts ){
get_template_part('tweets');
}
add_shortcode( 'tweets', 'twitter_feed' );

这个想法是,当用户写[推文]时,它会显示最新的推文。目前,我只是想通过对所有用户信息进行硬编码来使其工作,但现在它只是输出日期"1 月 1 日凌晨 1.00",并链接到用户的 Twitter 帐户。

我不知道我哪里出错了,但我也不知道如何调试它,所以任何正确方向的帮助将不胜感激!

你可以

试试这个,它可能会解决你的问题,因为get_template_part基本上反应像PHP's require,它不会返回,而是立即回显被调用的内容。

add_shortcode('twitter_feed', 'fn-twitter_feed');   
function fn-twitter_feed($attr, $content)
{        
    ob_start();  
    get_template_part('path/to', 'tweets');  
    $ret = ob_get_contents();  
    ob_end_clean();  
    return $ret;    
}