很多国外的朋友都喜欢上推特 Twitter. 但是如果你发了很多推(我有600多条, 但很多都是每天机器自动发的), 在Twitter 上查找以前的推就不是很方便了, 因为用了 Ajax 技术, 没办法一页一页翻. 当然, 你可以在 Twitter 的设置里要求一份备份, 那么你将收到下载的邮件.
更好的办法就是, 我们可以通过 Twitter API 将所有你发的推给存储在你的SQL数据库里, 那么还可以在 博客中显示出来, 更加方便检索. 首先, 我们需要在博客所在的服务器数据库里创建这么一个表, 比如 tweets.
有四个字段: tweet ID, text, date/time, retweet count 分别对应了ID, 文本, 发推的时间, 和被转发的次数. 当然你通过 API statuses/user_timeline 获得的数据还有很多, 但是暂时我只关心这几个值.
备份
我们将写一个PHP脚本, 用于把推给下载下来并写到数据库里:
我们可以用 TwitterOAuth 来访问 Twitter API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require('TwitterOAuth-1/TwitterOAuth/TwitterOAuth.php'); require('TwitterOAuth-1/TwitterOAuth/Exception/TwitterException.php'); require('TwitterOAuth-1/config.php'); use TwitterOAuth\TwitterOAuth; date_default_timezone_set('UTC'); $config = array( 'consumer_key' => $twitter_apikey, // API key 'consumer_secret' => $twitter_apisecret, // API secret 'oauth_token' => $twitter_accesstoken, // not needed for app only 'oauth_token_secret' => $twitter_accesstokensecret, 'output_format' => 'object' ); $tw = new TwitterOAuth($config); |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require('TwitterOAuth-1/TwitterOAuth/TwitterOAuth.php'); require('TwitterOAuth-1/TwitterOAuth/Exception/TwitterException.php'); require('TwitterOAuth-1/config.php'); use TwitterOAuth\TwitterOAuth; date_default_timezone_set('UTC'); $config = array( 'consumer_key' => $twitter_apikey, // API key 'consumer_secret' => $twitter_apisecret, // API secret 'oauth_token' => $twitter_accesstoken, // not needed for app only 'oauth_token_secret' => $twitter_accesstokensecret, 'output_format' => 'object' ); $tw = new TwitterOAuth($config);
保存成 twitter.php 方便以下调用.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require("twitter.php"); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 300, 'include_rts' => 1, 'exclude_replies' => false ); $tweets = $tw->get('statuses/user_timeline', $params); mysql_query("SET NAMES utf8"); if(!empty($tweets)) { foreach($tweets as $tweet) { $id = $tweet->id; $retweet_count = (integer)$tweet->retweet_count; $created_at = $tweet->created_at; $text = $tweet->text; $text = mysql_real_escape_string($text); $query = "select count(1) from `tweets` where `id` = '$id'"; $result = mysql_query($query); $cnt = mysql_result($result, 0, 0); if ($cnt == 0) { $query = "insert into `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count'"; } else { $query = "update `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count' where `id`='$id'"; } mysql_query($query); } } |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support require("twitter.php"); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 300, 'include_rts' => 1, 'exclude_replies' => false ); $tweets = $tw->get('statuses/user_timeline', $params); mysql_query("SET NAMES utf8"); if(!empty($tweets)) { foreach($tweets as $tweet) { $id = $tweet->id; $retweet_count = (integer)$tweet->retweet_count; $created_at = $tweet->created_at; $text = $tweet->text; $text = mysql_real_escape_string($text); $query = "select count(1) from `tweets` where `id` = '$id'"; $result = mysql_query($query); $cnt = mysql_result($result, 0, 0); if ($cnt == 0) { $query = "insert into `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count'"; } else { $query = "update `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count' where `id`='$id'"; } mysql_query($query); } }
mysql_query(“SET NAMES utf8”) 保证了中文字符不会出现乱码. 如果你使用 mb_detect_encoding 你就会发现, 所有通过API得到的文本都是基于 UTF-8 编码的. 重复执行此脚本并不会重复的插入到数据库中, 因为我们通过了 ID 来判断是否重复, 第一次写入, 第二次就是更新了 (比如你的被转发次数会更新)
每次调用API获得推的最大数目是 300. 如果你有多于 300 的推你就需要重复执行脚本, 但是你需要指定一个 max_id 参数用于限定返回推的ID范围.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support $query = "select min(`id`) from `tweets`"; $result = mysql_query($query) or die(mysql_error()); $cnt = mysql_result($result, 0, 0); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 1000, 'max_id' => $cnt, 'include_rts' => 1, 'exclude_replies' => false ); |
// helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support $query = "select min(`id`) from `tweets`"; $result = mysql_query($query) or die(mysql_error()); $cnt = mysql_result($result, 0, 0); $params = array( 'screen_name' => $twitter_screenname, 'user_id' => $twitter_ownerid, 'count' => 1000, 'max_id' => $cnt, 'include_rts' => 1, 'exclude_replies' => false );
原理就是, 每次我们先检查数据库中最老的推的ID, 然后通过API返回比这条推更老的, 直到所有推都下载下来.
然后我们就可以在 VPS server 上定期执行 这个PHP脚本用于更新到最新的 Tweets (crontab -e)
在博客中分页显示所有推
这个英文页面: helloacm.com/tweets-history/ 就是显示了我所有的推(600多条), 分页显示.
你需要一个插件, 用于在页面中执行PHP脚本, 然后指定PHP代码文件:
[ include ]tweets.php[ / include ]
下面就是tweets.php 的内容, 用于从数据库中取得推, 分页显示.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <php // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support global $wpdb; $query = "select count(1) from `tweets`"; $total = $wpdb->get_var($query); $per = 50; $page = get_query_var('page'); if (!$page) { $page = 1; } // pagination $totalpages = ceil($total / $per); if ($page > $totalpages) { $page = 1; } $lowerbound = ($page - 1) * $per; $upperbound = $lowerbound + $per; $lmt=" limit " . $lowerbound . "," . $per; $query = "select * from `tweets` order by `id` desc $lmt"; $result = $wpdb->get_results($query); if ($result) { foreach ($result as $tweet) { $created_at = $tweet->created_at; $text = $tweet->text; $retweet_count = $tweet->retweet_count; // display tweets echo "$text - $created_at"; if ($retweet_count > 0) { echo "($retweet_count Retweeted)"; } } } // show prev/next page links if ($page > 1) { echo "<a href='?page=".($page-1)."'>Newer Tweets</a> - "; } if ($page < $totalpages) { echo "<a href='?page=".($page+1)."'>Older Tweets</a>"; } |
<php // helloacm.com // How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support global $wpdb; $query = "select count(1) from `tweets`"; $total = $wpdb->get_var($query); $per = 50; $page = get_query_var('page'); if (!$page) { $page = 1; } // pagination $totalpages = ceil($total / $per); if ($page > $totalpages) { $page = 1; } $lowerbound = ($page - 1) * $per; $upperbound = $lowerbound + $per; $lmt=" limit " . $lowerbound . "," . $per; $query = "select * from `tweets` order by `id` desc $lmt"; $result = $wpdb->get_results($query); if ($result) { foreach ($result as $tweet) { $created_at = $tweet->created_at; $text = $tweet->text; $retweet_count = $tweet->retweet_count; // display tweets echo "$text - $created_at"; if ($retweet_count > 0) { echo "($retweet_count Retweeted)"; } } } // show prev/next page links if ($page > 1) { echo "<a href='?page=".($page-1)."'>Newer Tweets</a> - "; } if ($page < $totalpages) { echo "<a href='?page=".($page+1)."'>Older Tweets</a>"; }
可以通过函数 get_query_var(‘page’) 来获得现在显示哪一页推.
也算内容原创了,坐等google来收录.
a WordPress rating system
上一篇: 舍得给员工培训的公司是好公司
下一篇: 网站 把 GB2312 转成 UTF-8 全攻略
你说你有强迫症,但我在你的标题里: 怎样在 WordPress 里 创建 所有 推特 ? 一点也没有看出来.留这么空格干什么?
哈哈, 本来想用引号的, 习惯性打空格了….
就不说你在中文中使用英文半角符号的标点了……而且,我相信你现在是无法更改回中文标点符号了——因为你批量一改,所有代码中的点号也会跟着换……让你的强迫症发作吧.
不会的, 我不喜欢中文的符号…. 就喜欢英文的…………………………………….你看, 我一下子用了这么多英文的.
那就好,否则这强迫症一来,无药可治.
有没有更加详细的教程,菜鸟表示看得不太懂,需要大祸详细步骤指导.上面的代码到底需要建立几个文件,具体怎么搞?我也想搞一个,找遍整个网络,就你这个合适一点.求大神指导一二.
分三步:第一步, twitter.php 通过API把推下载下来到数据库中, 第二步, tweets.php 分页显示推.第三步就是 通过WP创建一个页面 用于加载这个 tweets.php