{"id":2793,"date":"2014-07-31T03:21:24","date_gmt":"2014-07-31T03:21:24","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=2793"},"modified":"2014-07-31T03:21:24","modified_gmt":"2014-07-31T03:21:24","slug":"criando-seu-primeiro-widget-no-wordpress","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2014\/07\/31\/criando-seu-primeiro-widget-no-wordpress\/","title":{"rendered":"Criando seu primeiro widget no WordPress"},"content":{"rendered":"<p>Fala minha gente!! Trago at\u00e9 voc\u00eas mais um artigo sobre desenvolvimento, dessa sobre WordPress! (Atendendo o pedido do Phelipp de Avila, que me segue no Twitter)<\/p>\n<p>Segundo a documenta\u00e7\u00e3o oficial sobre widgets do WordPress voc\u00ea deve criar Widgets utilizando um modelo de classe definido por eles, que \u00e9 o que vou ensinar no artigo de hoje.<\/p>\n<p>Nesse exemplo, iremos criar um widget de \u201cSobre o autor\u201d, que pode ser inserido no sidebar geral do blog (ou num sidebar espec\u00edfico para posts)\u2026 Esse widget ir\u00e1 verificar se estamos em um post (que o WordPress chama de single), e caso estejamos, ir\u00e1 exibir o nome, o avatar e a descri\u00e7\u00e3o do autor do post, todos esses dados vindos diretamente do banco de dados do WordPress.<\/p>\n<p>A prepara\u00e7\u00e3o<\/p>\n<p>Antes de tudo, voc\u00ea vai precisar separar seu widget em tr\u00eas m\u00e9todos dentro de uma classe:<\/p>\n<p>Um m\u00e9todo para gerar e exibir o HTML que aparecer\u00e1 na lateral do seu blog\/site<br \/>\nUm m\u00e9todo que ser\u00e1 usado para gerar e exibir o HTML do formul\u00e1rio que aparecer\u00e1 no painel de controle do blog\/site<br \/>\nUm m\u00e9todo que ser\u00e1 usado para salvar os dados vindos desse formul\u00e1rio<br \/>\nSabendo disso.. vamos come\u00e7ar a nossa classe:<\/p>\n<p>01<br \/>\n< ?php\n02\n \n03\n\/**\n04\n * Widget de Sobre o Autor\n05\n *\n06\n * @author Thiago Belem <contato@thiagobelem.net><br \/>\n07<br \/>\n * @link http:\/\/blog.thiagobelem.net\/criando-seu-primeiro-widget-no-wordpress\/<br \/>\n08<br \/>\n *\/<br \/>\n09<br \/>\nclass SobreAutorWidget extends WP_Widget {<br \/>\n10<\/p>\n<p>11<br \/>\n}<br \/>\n12<\/p>\n<p>13<br \/>\n?><br \/>\nLembrando que a sua classe DEVE estender a classe WP_Widget, do pr\u00f3prio WordPress.<\/p>\n<p>Agora vamos inserir quatro m\u00e9todos vazios para deixar a estrutura da classe pronta:<\/p>\n<p>11<br \/>\n\/**<br \/>\n12<br \/>\n * Construtor<br \/>\n13<br \/>\n *\/<br \/>\n14<br \/>\npublic function SobreAutorWidget() { parent::WP_Widget(false, $name = &#8216;Sobre o autor&#8217;); }<br \/>\n15<\/p>\n<p>16<br \/>\n\/**<br \/>\n17<br \/>\n * Exibi\u00e7\u00e3o final do Widget (j\u00e1 no sidebar)<br \/>\n18<br \/>\n *<br \/>\n19<br \/>\n * @param array $argumentos Argumentos passados para o widget<br \/>\n20<br \/>\n * @param array $instancia Inst\u00e2ncia do widget<br \/>\n21<br \/>\n *\/<br \/>\n22<br \/>\npublic function widget($argumentos, $instancia) {<br \/>\n23<\/p>\n<p>24<br \/>\n}<br \/>\n25<\/p>\n<p>26<br \/>\n\/**<br \/>\n27<br \/>\n * Salva os dados do widget no banco de dados<br \/>\n28<br \/>\n *<br \/>\n29<br \/>\n * @param array $nova_instancia Os novos dados do widget (a serem salvos)<br \/>\n30<br \/>\n * @param array $instancia_antiga Os dados antigos do widget<br \/>\n31<br \/>\n *\/<br \/>\n32<br \/>\npublic function update($nova_instancia, $instancia_antiga) {<br \/>\n33<\/p>\n<p>34<br \/>\n}<br \/>\n35<\/p>\n<p>36<br \/>\n\/**<br \/>\n37<br \/>\n * Formul\u00e1rio para os dados do widget (exibido no painel de controle)<br \/>\n38<br \/>\n *<br \/>\n39<br \/>\n * @param array $instancia Inst\u00e2ncia do widget<br \/>\n40<br \/>\n *\/<br \/>\n41<br \/>\npublic function form($instancia) {<br \/>\n42<\/p>\n<p>43<br \/>\n}<br \/>\nM\u00e9todo form()<\/p>\n<p>Agora vamos come\u00e7ar pelo m\u00e9todo form(), que exibe o formul\u00e1rio\u2026 Esse widget n\u00e3o precisaria de formul\u00e1rio e op\u00e7\u00f5es pois ele n\u00e3o tem nenhum tipo de configura\u00e7\u00e3o, mas vamos deixar uma coisa opcional como exibir o link do site do autor.<\/p>\n<p>O nosso m\u00e9todo form() ficar\u00e1 da seguinte forma:<\/p>\n<p>38<br \/>\n\/**<br \/>\n39<br \/>\n * Formul\u00e1rio para os dados do widget (exibido no painel de controle)<br \/>\n40<br \/>\n *<br \/>\n41<br \/>\n * @param array $instancia Inst\u00e2ncia do widget<br \/>\n42<br \/>\n *\/<br \/>\n43<br \/>\npublic function form($instancia) {<br \/>\n44<br \/>\n    $widget[&#8216;link_autor&#8217;] = (boolean)$instancia[&#8216;link_autor&#8217;];<br \/>\n45<br \/>\n    ?><br \/>\n46<\/p>\n<p><label for=\"<?php echo $this->get_field_id(&#8216;link_autor&#8217;); ?>&#8221;><input id=\"<?php echo $this-\/>get_field_id(&#8216;link_autor&#8217;); ?>&#8221; name=&#8221;< ?php echo $this->get_field_name(&#8216;link_autor&#8217;); ?>&#8221; type=&#8221;checkbox&#8221; value=&#8221;1&#8243; < ?php if ($widget['link_autor']) echo 'checked=\"checked\"'; ?> \/> < ?php _e('Exibe o link do autor'); ?><\/label><\/p>\n<p>47<br \/>\n    < ?php   \n48\n}\nEu sei que parece complicado, mas estamos apenas criando um par\u00e1grafo com um checkbox e um label\u2026 Para definir o ID e o name do input utilizamos recursos do pr\u00f3prio WordPress, assim n\u00e3o ca\u00edmos no problema de usar um name que j\u00e1 exista\u2026 O resultado \u00e9 um checkbox onde voc\u00ea pode decidir se exibe ou n\u00e3o o link do autor no widget.\n\nLogo no come\u00e7o do m\u00e9todo pegamos uma informa\u00e7\u00e3o da inst\u00e2ncia atual do widget, assim caso estejamos editando um widget, saberemos a op\u00e7\u00e3o salva no banco de dados.\n\nM\u00e9todo update()\n\nAgora vamos partir para o m\u00e9todo update(), que salva os dados e configura\u00e7\u00f5es do widget (nesse caso, apenas o checkbox) no banco de dados.\n\nEsse m\u00e9todo precisar\u00e1 retornar os dados a serem salvos no banco de dados, ficando assim:\n\n28\n\/**\n29\n * Salva os dados do widget no banco de dados\n30\n *\n31\n * @param array $nova_instancia Os novos dados do widget (a serem salvos)\n32\n * @param array $instancia_antiga Os dados antigos do widget\n33\n *\n34\n * @return array $instancia Dados atualizados a serem salvos no banco de dados\n35\n *\/\n36\npublic function update($nova_instancia, $instancia_antiga) {\n37\n    $instancia = array_merge($instancia_antiga, $nova_instancia);\n38\n     \n39\n    return $instancia;\n40\n}\nMais uma vez, n\u00e3o tem mist\u00e9rio: sobrescrevemos os valores de $instancia_antiga (o que estava salvo no banco de dados) com os valores de $nova_instancia e retornamos esses dados \u201cmesclados\u201d para serem salvos no banco de dados.\n\nE pra finalizar, o m\u00e9todo mais importante\u2026\n\nM\u00e9todo widget()\n\nEsse m\u00e9todo ser\u00e1 respons\u00e1vel por mostrar os dados (HTML) do widget na lateral do seu blog\u2026 Vamos faz\u00ea-lo passo-a-passo:\n\nEsse widget ir\u00e1 funcionar apenas nas p\u00e1ginas de post\u2026 ent\u00e3o precisamos evitar que ele seja exibido nas outras p\u00e1ginas, dessa forma:\n\n24\npublic function widget($argumentos, $instancia) {\n25\n    if (!is_single()) return;\n26\n}\nAgora vamos trazer alguns dados sobre o autor:\n\n27\n$autor = array(\n28\n    'nome' => get_the_author_meta(&#8216;display_name&#8217;),<br \/>\n29<br \/>\n    &#8217;email&#8217; => get_the_author_meta(&#8216;user_email&#8217;),<br \/>\n30<br \/>\n    &#8216;descricao&#8217; => get_the_author_meta(&#8216;description&#8217;),<br \/>\n31<br \/>\n    &#8216;link&#8217; => get_the_author_meta(&#8216;user_url&#8217;)<br \/>\n32<br \/>\n);<br \/>\nFeito isso \u00e9 s\u00f3 come\u00e7ar a exibir o HTML do Widget:<\/p>\n<p>34<br \/>\n\/\/ Exibe o HTML do Widget<br \/>\n35<br \/>\necho $argumentos[&#8216;before_widget&#8217;];<br \/>\n36<br \/>\necho $argumentos[&#8216;before_title&#8217;] . $argumentos[&#8216;widget_name&#8217;] . $argumentos[&#8216;after_title&#8217;];<br \/>\n37<br \/>\necho get_avatar($autor[&#8217;email&#8217;], $size = &#8217;59&#8217;);<br \/>\n38<br \/>\necho &#8220;<\/p>\n<h4>{$autor[&#8216;nome&#8217;]}<\/h4>\n<p>&#8220;;<br \/>\n39<br \/>\necho &#8220;<\/p>\n<p>{$autor[&#8216;descricao&#8217;]}<\/p>\n<p>&#8220;;<br \/>\n40<br \/>\nif (isset($instancia[&#8216;link_autor&#8217;]) &#038;&#038; $instancia[&#8216;link_autor&#8217;]) {<br \/>\n41<br \/>\n    echo &#8216;<\/p>\n<p>Visite o <a href=\"\/&#039;.%20$autor%5B&#039;link&#039;%5D%20.&#039;\" title=\"'. $autor['nome'] .'\" rel=\"nofollow\" target=\"_blank\">site do autor<\/a><\/p>\n<p>&#8216;;<br \/>\n42<br \/>\n}<br \/>\n43<br \/>\necho $argumentos[&#8216;after_widget&#8217;];<br \/>\nE o nosso widget est\u00e1 pronto!<\/p>\n<p>Agora voc\u00ea precisa de apenas uma linha para habilit\u00e1-lo no seu painel de controle:<\/p>\n<p>1<br \/>\nadd_action(&#8216;widgets_init&#8217;, create_function(&#8221;, &#8216;return register_widget(&#8220;SobreAutorWidget&#8221;);&#8217;));<\/p>\n<p>Widget em funcionamento<\/p>\n<p>Espero que tenham gostado! Agora \u00e9 s\u00f3 voc\u00ea editar o CSS do seu blog para deixar o widget bem apresent\u00e1vel. \ud83d\ude09<\/p>\n<p>Fa\u00e7a o download do c\u00f3digo-fonte completo do widget: http:\/\/blog.thiagobelem.net\/arquivos\/widget_sobre-autor.class.phps<\/p>\n<p>Gostou do artigo? Criou um widget pro seu blog? Comente como foi! Diga o que voc\u00ea conseguiu fazer! \ud83d\ude42<\/p>\n<p>Um grande abra\u00e7o e at\u00e9 a pr\u00f3xima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fala minha gente!! Trago at\u00e9 voc\u00eas mais um artigo sobre desenvolvimento, dessa sobre WordPress! (Atendendo o pedido do Phelipp de Avila, que me segue no Twitter) Segundo a documenta\u00e7\u00e3o oficial sobre widgets do WordPress voc\u00ea deve criar Widgets utilizando um modelo de classe definido por&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[6],"tags":[],"class_list":["post-2793","post","type-post","status-publish","format-standard","hentry","category-php"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=2793"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2793\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=2793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=2793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=2793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}