{"id":232729,"date":"2023-01-27T12:47:00","date_gmt":"2023-01-27T09:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232729"},"modified":"2022-11-10T17:31:40","modified_gmt":"2022-11-10T14:31:40","slug":"como-mostrar-o-arquivo-de-tweets-no-wordpress-usando-php-e-mysql-com-suporte-crontab","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-mostrar-o-arquivo-de-tweets-no-wordpress-usando-php-e-mysql-com-suporte-crontab\/","title":{"rendered":"Como mostrar o arquivo de tweets no WordPress usando PHP e MySQL com suporte Crontab?"},"content":{"rendered":"\n<p>O Tweeter n\u00e3o \u00e9 bom em exibir todos os tweets. Tenho mais de 600 tweets at\u00e9 agora (a maioria deles s\u00e3o enviados por <a href=\"https:\/\/helloacm.com\/php-function-to-post-to-twitter\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">script PHP<\/a> no <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> ). Se voc\u00ea deseja salvar uma c\u00f3pia de todos os seus tweets hist\u00f3ricos em seu pr\u00f3prio banco de dados localmente, \u00e9 claro que voc\u00ea pode solicitar um arquivo em sua conta do Twitter [Configura\u00e7\u00f5es \u2013 Conta \u2013 Solicitar arquivo].<\/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=\"Como mostrar o arquivo de tweets no Wordpress usando PHP e MySQL com suporte Crontab?\" ><\/a><\/p>\n<p>pedido-twitter-arquivo<\/p>\n<p>Que tal salvar todos os tweets e exibi-los em seu blog (p\u00e1gina WordPress)? A ideia \u00e9 \u00f3tima porque os tweets podem ser vistos como artigos para fins de SEO. Ent\u00e3o, voc\u00ea precisaria criar uma tabela no banco de dados wordpress, por exemplo, vamos nome\u00e1-la <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=\"Como mostrar o arquivo de tweets no Wordpress usando PHP e MySQL com suporte Crontab?\" ><\/a><\/p>\n<p>tabela de hist\u00f3rico de tweets<\/p>\n<p>Temos quatro colunas, s\u00e3o elas: <strong>ID do tweet<\/strong>, <strong>texto<\/strong>, <strong>data\/hora<\/strong>, <strong>contagem de retu\u00edtes<\/strong>. Claro, voc\u00ea pode obter mais informa\u00e7\u00f5es do twitter API <strong>status\/user_timeline<\/strong>, mas estamos interessados \u200b\u200bapenas nesses quatro.<\/p>\n<h3>Armazenando localmente<\/h3>\n<p>Sempre h\u00e1 um limite de taxa para usar as APIs do Twitter para que voc\u00ea n\u00e3o possa us\u00e1-las com muita frequ\u00eancia. No entanto, a ideia aqui \u00e9 ter um script PHP que rode no <a href=\"https:\/\/helloacm.com\/crontab-generator\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">crontab<\/a> (a cada poucas horas) e recupere os tweets e os armazene localmente no banco de dados.<\/p>\n<p>Podemos usar a biblioteca php <strong>TwitterOAuth<\/strong> para interagir com as APIs do Twitter:<\/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>Salve acima como <strong>twitter.php<\/strong> para que possamos inclu\u00ed-los sempre que quisermos acessar as APIs do Twitter.<\/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>O <strong>mysql_query(&#8220;SET NAMES utf8&quot;)<\/strong> garante que os tweets sejam inseridos corretamente no banco de dados. O <strong>mb_detect_encoding<\/strong> verificar\u00e1 se os tweets retornados das APIs s\u00e3o realmente codificados em UTF-8. ID) para que na primeira vez um novo tweet seja inserido, mas na segunda vez, ele ser\u00e1 apenas atualizado.<\/p>\n<p>Existe um n\u00famero m\u00e1ximo de tweets que voc\u00ea pode obter por uma chamada de API, por exemplo, 300. Se voc\u00ea tiver mais tweets, voc\u00ea sempre pode chamar v\u00e1rias vezes o script para baixar todos os tweets. No entanto, precisamos especificar o par\u00e2metro <strong>max_id<\/strong>, que retornar\u00e1 tweets mais antigos que esse ID (IDs menores). Ent\u00e3o n\u00f3s podemos:<\/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>A ideia \u00e9 verificar o tweet mais antigo (com o id m\u00ednimo) e retornar apenas os tweets mais antigos, ent\u00e3o se voc\u00ea executar os scripts v\u00e1rias vezes, voc\u00ea importar\u00e1 todos os tweets.<\/p>\n<p>Agora, temos os dados prontos e podemos fazer este script rodar no <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\">servidor VPS a<\/a> cada poucas horas (frequ\u00eancia at\u00e9 voc\u00ea) usando o comando <strong>crontab -e<\/strong>.<\/p>\n<h3>Exibir tweets em p\u00e1ginas do WordPress<\/h3>\n<p>Agora, esta p\u00e1gina <a href=\"https:\/\/helloacm.com\/tweets-history\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">helloacm.com\/tweets-history\/<\/a> mostra todas as \u00e1rvores do banco de dados. Voc\u00ea precisaria de um plugin para executar PHP\/HTML dentro de uma p\u00e1gina wordpress. Voc\u00ea pode encontrar facilmente esses plugins wordpress.<\/p>\n<p>Crie uma p\u00e1gina wordpress e coloque o seguinte:<\/p>\n<pre><code>[ include ]tweets.php[ \/ include ]<\/code><\/pre>\n<p>Ent\u00e3o precisamos colocar o script PHP neste <strong>tweets.php<\/strong> especificado acima.<\/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>Usamos <strong>get_query_var(&#8216;page&#8217;)<\/strong> para obter a string de consulta para que saibamos em qual p\u00e1gina estamos visualizando.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como mostrar o arquivo de tweets no WordPress usando PHP e MySQL com suporte 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":[898,722,837,998,920,846,867],"tags":[1170],"class_list":["post-232729","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-marketing-de-conteudo","category-outro","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232729","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=232729"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/232729\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224614"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=232729"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=232729"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=232729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}