{"id":232730,"date":"2023-01-27T12:52:00","date_gmt":"2023-01-27T09:52:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232730"},"modified":"2022-11-10T17:31:50","modified_gmt":"2022-11-10T14:31:50","slug":"jak-wyswietlic-archiwum-tweetow-w-wordpress-za-pomoca-php-i-mysql-z-obsluga-crontab","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/jak-wyswietlic-archiwum-tweetow-w-wordpress-za-pomoca-php-i-mysql-z-obsluga-crontab\/","title":{"rendered":"Jak wy\u015bwietli\u0107 archiwum tweet\u00f3w w WordPress za pomoc\u0105 PHP i MySQL z obs\u0142ug\u0105 Crontab?"},"content":{"rendered":"\n<p>G\u0142o\u015bnik wysokotonowy nie jest dobry w wy\u015bwietlaniu wszystkich tweet\u00f3w. Mam do tej pory ponad 600 tweet\u00f3w (wi\u0119kszo\u015b\u0107 z nich jest wysy\u0142ana przez <a href=\"https:\/\/helloacm.com\/php-function-to-post-to-twitter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">skrypt PHP<\/a> na <a href=\"https:\/\/helloacm.com\/site-news-vps-upgraded-again-to-handle-large-traffic\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">VPS<\/a> ). Je\u015bli chcesz zapisa\u0107 kopi\u0119 wszystkich swoich historycznych tweet\u00f3w lokalnie we w\u0142asnej bazie danych, mo\u017cesz oczywi\u015bcie poprosi\u0107 o archiwum na swoim koncie Twitter [Ustawienia \u2013 Konto \u2013 Popro\u015b o archiwum].<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-155905-61e570c313fac.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-155905-61e570c313fac.jpg\" alt=\"Jak wy\u015bwietli\u0107 archiwum tweet\u00f3w w Wordpress za pomoc\u0105 PHP i MySQL z obs\u0142ug\u0105 Crontab?\" ><\/a><\/p>\n<p>\u017c\u0105danie-archiwum-twittera<\/p>\n<p>Co powiesz na to, \u017ce mo\u017cesz zapisa\u0107 wszystkie tweety i wy\u015bwietli\u0107 je na swoim blogu (strona WordPress)? Pomys\u0142 jest \u015bwietny, poniewa\u017c tweety mog\u0105 by\u0107 postrzegane jako artyku\u0142y do \u200b\u200bcel\u00f3w SEO. Tak wi\u0119c musia\u0142by\u015b utworzy\u0107 tabel\u0119 w bazie danych wordpress, na przyk\u0142ad nazwijmy j\u0105 <code>tweets<\/code>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-155905-61e570c417eb7.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-155905-61e570c417eb7.jpg\" alt=\"Jak wy\u015bwietli\u0107 archiwum tweet\u00f3w w Wordpress za pomoc\u0105 PHP i MySQL z obs\u0142ug\u0105 Crontab?\" ><\/a><\/p>\n<p>tweet-historia-tabela<\/p>\n<p>Mamy cztery kolumny, s\u0105 to: <strong>identyfikator tweeta<\/strong>, <strong>tekst<\/strong>, <strong>data\/godzina<\/strong>, <strong>liczba retweet\u00f3w<\/strong>. Oczywi\u015bcie mo\u017cesz uzyska\u0107 wi\u0119cej informacji z twitter API <strong>statuss\/user_timeline<\/strong>, ale nas interesuj\u0105 tylko te cztery.<\/p>\n<h3>Przechowywanie lokalne<\/h3>\n<p>Zawsze istnieje limit szybko\u015bci korzystania z interfejs\u00f3w API Twittera, wi\u0119c nie mo\u017cna ich u\u017cywa\u0107 zbyt cz\u0119sto. Pomys\u0142 polega jednak na tym, aby skrypt PHP uruchamia\u0142 si\u0119 w <a href=\"https:\/\/helloacm.com\/crontab-generator\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">crontab<\/a> (co kilka godzin) i pobiera\u0142 tweety i zapisywa\u0142 je lokalnie w bazie danych.<\/p>\n<p>Mo\u017cemy u\u017cy\u0107 biblioteki php <strong>TwitterOAuth<\/strong> do interakcji z API Twittera:<\/p>\n<pre><code>\/\/ &lt;a class=\"vglnk\" target=\"_blank\" href=\"http:\/\/helloacm.com\" rel=\"nofollow\"&gt;&lt;span&gt;helloacm&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;com&lt;\/span&gt;&lt;\/a&gt;\n\/\/ How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support\nrequire('TwitterOAuth-1\/TwitterOAuth\/TwitterOAuth.php');\nrequire('TwitterOAuth-1\/TwitterOAuth\/Exception\/TwitterException.php');\nrequire('TwitterOAuth-1\/config.php'); \u00a0\nuse TwitterOAuthTwitterOAuth;\ndate_default_timezone_set('UTC');\n\u00a0\n$config = array(\n\u00a0 \u00a0 'consumer_key' \u00a0 \u00a0 \u00a0 =&gt; $twitter_apikey, \/\/ API key\n\u00a0 \u00a0 'consumer_secret' \u00a0 \u00a0=&gt; $twitter_apisecret, \/\/ API secret\n\u00a0 \u00a0 'oauth_token' \u00a0 \u00a0 \u00a0 \u00a0=&gt; $twitter_accesstoken, \/\/ not needed for app only\n\u00a0 \u00a0 'oauth_token_secret' =&gt; $twitter_accesstokensecret,\n\u00a0 \u00a0 'output_format' \u00a0 \u00a0 \u00a0=&gt; 'object'\n);\n$tw = new TwitterOAuth($config);<\/code><\/pre>\n<p>Zapisz powy\u017cej jako <strong>twitter.php<\/strong>, aby\u015bmy mogli je uwzgl\u0119dni\u0107 za ka\u017cdym razem, je\u015bli chcemy uzyska\u0107 dost\u0119p do API Twittera.<\/p>\n<pre><code>\/\/ &lt;a class=\"vglnk\" target=\"_blank\" href=\"http:\/\/helloacm.com\" rel=\"nofollow\"&gt;&lt;span&gt;helloacm&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;com&lt;\/span&gt;&lt;\/a&gt;\n\/\/ How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support\n\u00a0 require(\"twitter.php\"); \n\u00a0\n\u00a0 $params = array(\n\u00a0 \u00a0 \u00a0 'screen_name' =&gt; $twitter_screenname,\n\u00a0 \u00a0 \u00a0 'user_id' =&gt; $twitter_ownerid,\n\u00a0 \u00a0 \u00a0 'count' =&gt; 300,\n\u00a0 \u00a0 \u00a0 'include_rts' =&gt; 1,\n\u00a0 \u00a0 \u00a0 'exclude_replies' =&gt; false\n\u00a0 );\n\u00a0 $tweets = $tw-&gt;get('statuses\/user_timeline', $params);\n\u00a0\n\u00a0 mysql_query(\"SET NAMES utf8\");\n\u00a0 if(!empty($tweets)) {\n\u00a0 \u00a0 \u00a0 foreach($tweets as $tweet) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $id = $tweet-&gt;id;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $retweet_count = (integer)$tweet-&gt;retweet_count;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $created_at = $tweet-&gt;created_at;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $text = $tweet-&gt;text;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $text = mysql_real_escape_string($text);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $query = \"select count(1) from `tweets` where `id` = '$id'\";\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $result = mysql_query($query);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $cnt = mysql_result($result, 0, 0);\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($cnt == 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $query = \"insert into `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count'\"; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $query = \"update `tweets` set `id`='$id', `text`='$text', `created_at`='$created_at',`retweet_count`='$retweet_count' where `id`='$id'\"; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mysql_query($query);\n\u00a0 \u00a0 \u00a0 }\n\u00a0 }<\/code><\/pre>\n<p>Mysql_query <strong>(\u201eSET NAMES utf8&quot;)<\/strong> zapewnia, \u017ce \u200b\u200btweety s\u0105 poprawnie wstawiane do bazy danych. <strong>mb_detect_encoding<\/strong> zweryfikuje, czy tweety zwr\u00f3cone przez interfejsy API s\u0105 faktycznie zakodowane w UTF-8. Powy\u017cszy skrypt PHP sprawdzi duplikaty (na podstawie Twittera). ID), wi\u0119c za pierwszym razem nowy tweet zostanie wstawiony, ale za drugim razem zostanie po prostu zaktualizowany.<\/p>\n<p>Maksymalna liczba tweet\u00f3w, kt\u00f3re mo\u017cesz uzyska\u0107 jednym wywo\u0142aniem API, np. 300. Je\u015bli masz wi\u0119cej tweet\u00f3w, zawsze mo\u017cesz kilkakrotnie wywo\u0142a\u0107 skrypt, aby pobra\u0107 wszystkie tweety. Musimy jednak okre\u015bli\u0107 parametr <strong>max_id<\/strong>, kt\u00f3ry zwr\u00f3ci tweety starsze ni\u017c ten identyfikator (mniejsze identyfikatory). Wi\u0119c mo\u017cemy:<\/p>\n<pre><code>\/\/ &lt;a class=\"vglnk\" target=\"_blank\" href=\"http:\/\/helloacm.com\" rel=\"nofollow\"&gt;&lt;span&gt;helloacm&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;com&lt;\/span&gt;&lt;\/a&gt;\n\/\/ How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support\n\u00a0 $query = \"select min(`id`) from `tweets`\";\n\u00a0 $result = mysql_query($query) or die(mysql_error());\n\u00a0 $cnt = mysql_result($result, 0, 0); \u00a0 \u00a0\n\u00a0\n\u00a0 $params = array(\n\u00a0 \u00a0 \u00a0 'screen_name' =&gt; $twitter_screenname,\n\u00a0 \u00a0 \u00a0 'user_id' =&gt; $twitter_ownerid,\n\u00a0 \u00a0 \u00a0 'count' =&gt; 1000,\n\u00a0 \u00a0 \u00a0 'max_id' =&gt; $cnt,\n\u00a0 \u00a0 \u00a0 'include_rts' =&gt; 1,\n\u00a0 \u00a0 \u00a0 'exclude_replies' =&gt; false\n\u00a0 );<\/code><\/pre>\n<p>Chodzi o to, aby sprawdzi\u0107 najstarszy tweet (z identyfikatorem mini) i zwr\u00f3ci\u0107 tylko starsze tweety, wi\u0119c je\u015bli uruchomisz skrypt kilka razy, zaimportujesz wszystkie tweety.<\/p>\n<p>Teraz mamy gotowe dane i mo\u017cemy uruchomi\u0107 ten skrypt na <a href=\"https:\/\/helloacm.com\/mysql-server-stopped-due-of-out-of-memory-exception-on-ubuntu-vps\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">serwerze VPS<\/a> co kilka godzin (cz\u0119stotliwo\u015b\u0107 zale\u017cy od Ciebie) za pomoc\u0105 polecenia <strong>crontab -e<\/strong>.<\/p>\n<h3>Wy\u015bwietlaj tweety na stronach WordPress<\/h3>\n<p>Teraz ta strona <a href=\"https:\/\/helloacm.com\/tweets-history\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">helloacm.com\/tweets-history\/<\/a> pokazuje wszystkie drzewa z bazy danych. Potrzebujesz wtyczki do wykonywania PHP\/HTML na stronie WordPress. Mo\u017cesz \u0142atwo znale\u017a\u0107 takie wtyczki wordpress.<\/p>\n<p>Utw\u00f3rz stron\u0119 wordpress i umie\u015b\u0107 nast\u0119puj\u0105ce elementy:<\/p>\n<pre><code>[ include ]tweets.php[ \/ include ]<\/code><\/pre>\n<p>Nast\u0119pnie musimy umie\u015bci\u0107 skrypt PHP w podanym powy\u017cej <strong>tweets.php .<\/strong><\/p>\n<pre><code>&lt;php\n\/\/ &lt;a class=\"vglnk\" target=\"_blank\" href=\"http:\/\/helloacm.com\" rel=\"nofollow\"&gt;&lt;span&gt;helloacm&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;com&lt;\/span&gt;&lt;\/a&gt;\n\/\/ How to Show Tweets Archive in WordPress using PHP and MySQL with Crontab Support\n\u00a0 global $wpdb;\n\u00a0 \n\u00a0 $query = \"select count(1) from `tweets`\";\n\u00a0 $total = $wpdb-&gt;get_var($query);\n\u00a0 \n\u00a0 $per = 50;\n\u00a0 $page = get_query_var('page');\n\u00a0 if (!$page) {\n\u00a0 \u00a0 $page = 1;\n\u00a0 }\n\u00a0 \n\u00a0 \/\/ pagination\n\u00a0 $totalpages = ceil($total \/ $per);\n\u00a0 if ($page &gt; $totalpages) {\n\u00a0 \u00a0 $page = 1;\n\u00a0 }\n\u00a0 \n\u00a0 $lowerbound = ($page - 1) * $per;\n\u00a0 $upperbound = $lowerbound + $per;\n\u00a0 $lmt=\" limit \". $lowerbound. \",\". $per;\n\u00a0 \n\u00a0 $query = \"select * from `tweets` order by `id` desc $lmt\";\n\u00a0 \n\u00a0 $result = $wpdb-&gt;get_results($query);\n\u00a0 \n\u00a0 if ($result) {\n\u00a0 \u00a0 foreach ($result as $tweet) {\n\u00a0 \u00a0 \u00a0 $created_at = $tweet-&gt;created_at;\n\u00a0 \u00a0 \u00a0 $text = $tweet-&gt;text;\n\u00a0 \u00a0 \u00a0 $retweet_count = $tweet-&gt;retweet_count;\n\u00a0 \u00a0 \u00a0 \/\/ display tweets\n\u00a0 \u00a0 \u00a0 echo \"$text - $created_at\";\n\u00a0 \u00a0 \u00a0 if ($retweet_count &gt; 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 echo \"($retweet_count Retweeted)\";\n\u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 } \u00a0\n\u00a0 \n\u00a0 \/\/ show prev\/next page links\n\u00a0 if ($page &gt; 1) {\n\u00a0 \u00a0 echo \"&lt;a href='?page=\".($page-1).\"'&gt;Newer Tweets&lt;\/a&gt; - \";\n\u00a0 }\n\u00a0 if ($page &lt; $totalpages) {\n\u00a0 \u00a0 echo \"&lt;a href='?page=\".($page+1).\"'&gt;Older Tweets&lt;\/a&gt;\";\n\u00a0 }<\/code><\/pre>\n<p>U\u017cywamy <strong>get_query_var(&#8217;page&#8217;),<\/strong> aby uzyska\u0107 ci\u0105g zapytania, aby\u015bmy wiedzieli, na kt\u00f3rej stronie ogl\u0105damy.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak wy\u015bwietli\u0107 archiwum tweet\u00f3w w WordPress za pomoc\u0105 PHP i MySQL z obs\u0142ug\u0105 Crontab?<\/p>\n","protected":false},"author":1,"featured_media":224614,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,919,897,997,836,845,866],"tags":[1169],"class_list":["post-232730","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-inny","category-kod","category-marketing-tresci","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/232730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=232730"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/232730\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224614"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=232730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=232730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=232730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}