{"id":3579,"date":"2016-06-28T09:00:03","date_gmt":"2016-06-28T12:00:03","guid":{"rendered":"https:\/\/www.mxcursos.com\/blog\/?p=3579"},"modified":"2019-03-16T03:00:53","modified_gmt":"2019-03-16T06:00:53","slug":"wordpress-criando-widgets-personalizados","status":"publish","type":"post","link":"https:\/\/www.mxcursos.com\/blog\/wordpress-criando-widgets-personalizados\/","title":{"rendered":"WordPress &#8211; Criando Widgets personalizados"},"content":{"rendered":"<p>A utiliza\u00e7\u00e3o de widgets se torna um diferencial em nossos temas pela facilidade de utilizar,\u00a0implementar\u00a0e explorar novos recursos.<\/p>\n<p>Para desenvolver um widget, voc\u00ea precisar\u00e1 basicamente\u00a0entender a classe <em>WP_Widget<\/em> e implementar alguns m\u00e9todos, que seriam: <strong>\u00a0<\/strong><em>__construct, widget, form, e update.<\/em><\/p>\n<p>Veremos neste artigo como criar widget para <a href=\"http:\/\/br.wordpress.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">WordPress<\/a> de forma simples e pr\u00e1tica.<\/p>\n<p>Abaixo temos uma classe de exemplo com\u00a0os\u00a0m\u00e9todos comentados:<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n \r\nclass Exemplo_Widget extends WP_Widget {\r\n \r\n \/**\r\n * Registrar o Widget no WordPress\r\n *\r\n *\/\r\n public function __construct() {\r\n \/**\r\n * Chamando a classe __construct pai\r\n * $id_base =&gt; Define Identifica\u00e7\u00e3o\r\n * $name =&gt; Define o Nome que ser\u00e1 exibido\r\n * $widget_options =&gt; Configura\u00e7\u00f5es extras\r\n *\/\r\n parent::__construct($id_base, $name, $widget_options);\r\n }\r\n \r\n \/**\r\n * O que ser\u00e1 mostrado na parte administrativa\r\n * do WordPress\r\n *\/\r\n public function form($instance) {\r\n \r\n }\r\n \r\n \/**\r\n * O que salvar\u00e1 os dados do widget no banco de dados\r\n *\/\r\n public function update($new_instance, $old_instance) {\r\n \r\n }\r\n \r\n \/**\r\n * O que ser\u00e1 exibido no Tema\r\n *\/\r\n public function widget($args, $instance) {\r\n \r\n }\r\n \r\n}<\/pre>\n<p>Agora vamos criar algo pr\u00e1tico.<\/p>\n<p>No nosso site, precisamos criar um widget que exiba os posts mais comentados, informando o titulo do post, o link e quantidade de coment\u00e1rios.<\/p>\n<p><em>Obs: Para nosso tutorial, utilizarei a vers\u00e3o\u00a04.5.2 do WordPress e o tema twentytwelve, mas voc\u00ea poder\u00e1 utilizar\u00a0outras vers\u00f5es do WordPress e outros temas tamb\u00e9m.<\/em><\/p>\n<p>Criaremos uma pasta chamada <em>widget<\/em>\u00a0e dentro dela ser\u00e1 criado um arquivo chamado : <em>most_commented_posts.php<\/em><br \/>\n<a href=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_01.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-3580\" src=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_01.jpg\" alt=\"criando_widget_01\" width=\"237\" height=\"333\" srcset=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_01.jpg 237w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_01-17x24.jpg 17w\" sizes=\"(max-width: 237px) 100vw, 237px\" \/><\/a><\/p>\n<p>Colocarei por partes pra facilitar o entendimento.<\/p>\n<p>O c\u00f3digo estar\u00e1 com coment\u00e1rios.<\/p>\n<p>Criamos a classe <em>Most_Commented_Posts<\/em> e estendemos a classe <em>WP_Widget.<\/em><\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n \r\n\/**\r\n * Criamos a classe, estendendo WP_Widget\r\n *\/\r\nclass Most_Commented_Posts extends WP_Widget {<\/pre>\n<p>Agora vamos definir o construtor e chamar classe Pai do construtor pra definir as configura\u00e7\u00f5es do Widget.<\/p>\n<div>\n<pre class=\"lang:php decode:true\">\/**\r\n * Vamos registrar o Widget no WordPress\r\n *\/\r\npublic function __construct() {\r\n    \/\/Identificador do widget\r\n    $id_base = 'most_commented_posts';\r\n    \/\/Nome do Widget que ser\u00e1 exibido\r\n    $name = 'Posts Mais Comentados';\r\n    \/\/Adicionado Descri\u00e7\u00e3o do widget\r\n    $widget_options = array('description' =&gt; 'Exibir os posts mais comentados');\r\n    parent::__construct($id_base, $name, $widget_options);\r\n}<\/pre>\n<\/div>\n<div>\n<p>Definiremos agora\u00a0o <em>m\u00e9todo form<\/em>, que \u00e9 respons\u00e1vel por exibir o formul\u00e1rio na parte administrativa do WordPress<\/p>\n<div>\n<pre class=\"lang:php decode:true\">\/**\r\n  * O formul\u00e1rio que ser\u00e1 exibido\r\n  * no painel administrativo no WordPress\r\n  *\/\r\n public function form($instance) {\r\n     \/\/Verifica se existe um titulo, sen\u00e3o ficar\u00e1 em branco\r\n     $title = isset($instance['title']) ? $instance['title'] : '';\r\n     \/\/Verficia se existe o valor que ser\u00e1 exibido, sen\u00e3o ter\u00e1 o valor de 5\r\n     $number = isset($instance['number']) ? $instance['number'] : 5;\r\n \r\n     \/**\r\n      * Aqui criamos label, e input para ser inserido e exibido o valor do t\u00edtulo\r\n      *\/\r\n    \/**\r\n      * Aqui criamos label, e input para ser inserido e exibido o valor do t\u00edtulo\r\n      *\/\r\n     echo '&lt;p&gt;\r\n                 &lt;label for=\"' . $this-&gt;get_field_id('title') . '\"&gt;T\u00edtulo&lt;\/label&gt;\r\n                 &lt;input class=\"widefat\" id=\"' . $this-&gt;get_field_id('title') . '\" name=\"' . $this-&gt;get_field_name('title') . '\" value=\"' . esc_attr($title) . '\"&gt;\r\n          &lt;\/p&gt;';\r\n     \/**\r\n      * Aqui criamos label, e input para ser inserido\r\n      * e exibido a quantidade de post que ser\u00e1 exibido\r\n      *\/\r\n     echo '&lt;p&gt;\r\n                 &lt;label for=\"' . $this-&gt;get_field_id('number') . '\"&gt;Quantidade a ser Exibido&lt;\/label&gt;\r\n                 &lt;input class=\"widefat\" id=\"' . $this-&gt;get_field_id('number') . '\" name=\"' . $this-&gt;get_field_name('number') . '\" value=\"' . esc_attr($number) . '\"&gt;\r\n             &lt;\/p&gt;';\r\n }<\/pre>\n<p>Agora vamos para o m\u00e9todo update, que ser\u00e1 respons\u00e1vel por salvar as novas informa\u00e7\u00f5es.<\/p>\n<\/div>\n<div>\n<pre class=\"lang:php decode:true \">\/**\r\n   * Vamos salvar as informa\u00e7\u00f5es\r\n   * $new_instance =&gt; valores que ser\u00e3o salvos\r\n   * $old_instance =&gt; valores que est\u00e3o no banco de dados\r\n   *\/\r\n  public function update($new_instance, $old_instance) {\r\n      $instance = array();\r\n      $instance['title'] = (!empty($new_instance['title']) ) ? strip_tags($new_instance['title']) : '';\r\n      $instance['number'] = (!empty($new_instance['number']) ) ? (int) $new_instance['number'] : '';\r\n  }<\/pre>\n<\/div>\n<div>\n<p>Abaixo temos o\u00a0m\u00e9todo widget, que ser\u00e1 respons\u00e1vel por exibir widget no tema<\/p>\n<div>\n<pre class=\"lang:php decode:true \">\/**\r\n   * O que ser\u00e1 exibido no tema (FronteEnd)\r\n   *\/\r\n  public function widget($args, $instance) {\r\n      \/\/Aplica o t\u00edtulo,  criado por n\u00f3s, atribuido ao widget\r\n      $title = apply_filters('widget_title', $instance['title']);\r\n      $number = $instance['number'] ? (int) $instance['number'] : 5;\r\n \r\n      \/**\r\n       * Instancia a classe WP_Query:\r\n       * Ordernar poelo total comentarios, em forma descrecente\r\n       * exibindo o valor determinado: $number\r\n       *\/\r\n      $wp = new WP_Query(array('orderby' =&gt; 'comment_count', 'order' =&gt; 'DESC', 'posts_per_page' =&gt; $number));\r\n \r\n      \/\/Verifica se tem post\r\n      if ($wp-&gt;have_posts()) {\r\n \r\n          \/\/Elemento a ser inserido antes de todo widget.\r\n          echo $args['before_widget'];\r\n          \/\/Verifica se n\u00e3o tiver vazio o $title\r\n          if (!empty($title)) {\r\n              \/**\r\n               * $args['before_title']: Texto a ser inserido antes de todo t\u00edtulo.\r\n               * $title : Titulo definido no wiget\r\n               * $args['after_title'] :Texto a ser inserido depois de todo t\u00edtulo.\r\n               *\/\r\n              echo $args['before_title'] . $title . $args['after_title'];\r\n          }\r\n \r\n          \/\/\r\n          echo '&lt;ul class=\"most_commented_posts\"&gt;';\r\n          \/\/Listar os posts\r\n          while ($wp-&gt;have_posts()) {\r\n              $wp-&gt;the_post();\r\n              \/**\r\n               * Exibi O t\u00edtulo com link, e total de coment\u00e1rios\r\n               *\/\r\n              echo '&lt;li&gt;';\r\n              echo '&lt;h3&gt;&lt;a href=\"' . get_permalink() . '\"&gt;' . get_the_title() . ' (' . get_comments_number(get_the_ID()) . ')&lt;\/a&gt;&lt;\/h3&gt;';\r\n              echo '&lt;li&gt;';\r\n          }\r\n          echo '&lt;\/ul&gt;';\r\n          \/\/Elemento a ser inserido depois de todo widget.\r\n          echo $args['before_widget'];\r\n      }\r\n  }<\/pre>\n<p>Agora vamos ao c\u00f3digo da classe <em>Most_Commented_Posts<\/em><\/p>\n<div>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n \r\n\/**\r\n * Criamos a classe, estendendo WP_Widget\r\n *\/\r\nclass Most_Commented_Posts extends WP_Widget {\r\n \r\n    \/**\r\n     * Vamos registrar o Widget no WordPress\r\n     *\/\r\n    public function __construct() {\r\n        \/\/Identificador do widget\r\n        $id_base = 'most_commented_posts';\r\n        \/\/Nome do Widget que ser\u00e1 exibido\r\n        $name = 'Posts Mais Comentados';\r\n        \/\/Adicionado Descri\u00e7\u00e3o do widget\r\n        $widget_options = array('description' =&gt; 'Exibir os posts mais comentados');\r\n        parent::__construct($id_base, $name, $widget_options);\r\n    }\r\n \r\n    \/**\r\n     * O formul\u00e1rio que ser\u00e1 exibido\r\n     * no painel administrativo no WordPress\r\n     *\/\r\n    public function form($instance) {\r\n        \/\/Verifica se existe um titulo, sen\u00e3o ficar\u00e1 em branco\r\n        $title = isset($instance['title']) ? $instance['title'] : '';\r\n        \/\/Verficia se existe o valor que ser\u00e1 exibido, sen\u00e3o ter\u00e1 o valor de 5\r\n        $number = isset($instance['number']) ? $instance['number'] : 5;\r\n \r\n         \/**\r\n         * Aqui criamos label, e input para ser inserido e exibido o valor do t\u00edtulo\r\n         *\/\r\n        echo '&lt;p&gt;\r\n                    &lt;label for=\"' . $this-&gt;get_field_id('title') . '\"&gt;T\u00edtulo&lt;\/label&gt;\r\n                    &lt;input class=\"widefat\" id=\"' . $this-&gt;get_field_id('title') . '\" name=\"' . $this-&gt;get_field_name('title') . '\" value=\"' . esc_attr($title) . '\"&gt;\r\n             &lt;\/p&gt;';\r\n        \/**\r\n         * Aqui criamos label, e input para ser inserido\r\n         * e exibido a quantidade de post que ser\u00e1 exibido\r\n         *\/\r\n        echo '&lt;p&gt;\r\n                    &lt;label for=\"' . $this-&gt;get_field_id('number') . '\"&gt;Quantidade a ser Exibido&lt;\/label&gt;\r\n                    &lt;input class=\"widefat\" id=\"' . $this-&gt;get_field_id('number') . '\" name=\"' . $this-&gt;get_field_name('number') . '\" value=\"' . esc_attr($number) . '\"&gt;\r\n                &lt;\/p&gt;';\r\n    }\r\n \r\n    \/**\r\n     * Vamos salvar as informa\u00e7\u00f5es\r\n     * $new_instance =&gt; valores que ser\u00e3o salvos\r\n     * $old_instance =&gt; valores que est\u00e3o no banco de dados\r\n     *\/\r\n    public function update($new_instance, $old_instance) {\r\n        $instance = array();\r\n        $instance['title'] = (!empty($new_instance['title']) ) ? strip_tags($new_instance['title']) : '';\r\n        $instance['number'] = (!empty($new_instance['number']) ) ? (int) $new_instance['number'] : '';\r\n    }\r\n \r\n    \/**\r\n     * O que ser\u00e1 exibido no tema (FronteEnd)\r\n     *\/\r\n    public function widget($args, $instance) {\r\n        \/\/Aplica o t\u00edtulo,  criado por n\u00f3s, atribuido ao widget\r\n        $title = apply_filters('widget_title', $instance['title']);\r\n        $number = $instance['number'] ? (int) $instance['number'] : 5;\r\n \r\n        \/**\r\n         * Instancia a classe WP_Query:\r\n         * Ordernar poelo total comentarios, em forma descrecente\r\n         * exibindo o valor determinado: $number\r\n         *\/\r\n        $wp = new WP_Query(array('orderby' =&gt; 'comment_count', 'order' =&gt; 'DESC', 'posts_per_page' =&gt; $number));\r\n \r\n        \/\/Verifica se tem post\r\n        if ($wp-&gt;have_posts()) {\r\n \r\n            \/\/Elemento a ser inserido antes de todo widget.\r\n            echo $args['before_widget'];\r\n            \/\/Verifica se n\u00e3o tiver vazio o $title\r\n            if (!empty($title)) {\r\n                \/**\r\n                 * $args['before_title']: Texto a ser inserido antes de todo t\u00edtulo.\r\n                 * $title : Titulo definido no wiget\r\n                 * $args['after_title'] :Texto a ser inserido depois de todo t\u00edtulo.\r\n                 *\/\r\n                echo $args['before_title'] . $title . $args['after_title'];\r\n            }\r\n \r\n            \/\/\r\n            echo '&lt;ul class=\"most_commented_posts\"&gt;';\r\n            \/\/Listar os posts\r\n            while ($wp-&gt;have_posts()) {\r\n                $wp-&gt;the_post();\r\n                \/**\r\n                 * Exibi O t\u00edtulo com link, e total de coment\u00e1rios\r\n                 *\/\r\n                echo '&lt;li&gt;';\r\n                echo '&lt;h3&gt;&lt;a href=\"' . get_permalink() . '\"&gt;' . get_the_title() . ' (' . get_comments_number(get_the_ID()) . ')&lt;\/a&gt;&lt;\/h3&gt;';\r\n                echo '&lt;li&gt;';\r\n            }\r\n            echo '&lt;\/ul&gt;';\r\n            \/\/Elemento a ser inserido depois de todo widget.\r\n            echo $args['before_widget'];\r\n        }\r\n    }\r\n \r\n}<\/pre>\n<\/div>\n<p>Nessa pasta widget, vamos criar um arquivo chamado bootstrap.php. Esse arquivo ser\u00e1 respons\u00e1vel por registrar o <em>widget<\/em> que criamos:<\/p>\n<div>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n \r\n\/\/Inclui o arquivo : most_commented_posts.php\r\nrequire_once \"most_commented_posts.php\";\r\n \r\n\/\/Fun\u00e7\u00e3o para registar o widget\r\nfunction register_most_commented_widget(){\r\n    \/\/Registra o widget que criamos\r\n     register_widget( 'Most_Commented_Posts' );\r\n}\r\n \r\n\/\/Com fun\u00e7\u00e3o add_action, atribuimos uma fun\u00e7\u00e3o, usando o gancho widgets_init\r\nadd_action( 'widgets_init', 'register_most_commented_widget' );<\/pre>\n<\/div>\n<p>Agora no arquivo <em>functions.php<\/em>, incluiremos o arquivo <em>boostrap.php<\/em><\/p>\n<div>\n<pre class=\"lang:php decode:true \">require_once \"widget\/bootstrap.php\";<\/pre>\n<p>Agora acesse <em>Apar\u00eancia &gt; Widgets.<\/em> Do lado esquerdo \u00e9 poss\u00edvel observar o novo\u00a0widget que criamos.<\/p>\n<\/div>\n<div><a href=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_03.jpg\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-3581\" src=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_03-473x480.jpg\" alt=\"criando_widget_03\" width=\"473\" height=\"480\" srcset=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_03-473x480.jpg 473w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_03-24x24.jpg 24w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_03.jpg 700w\" sizes=\"(max-width: 473px) 100vw, 473px\" \/><\/a><\/div>\n<\/div>\n<\/div>\n<div>\n<p>Agora basta arrastar para a \u00e1rea da sidebar do tema.<\/p>\n<\/div>\n<div><a href=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_02.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-3582\" src=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_02.jpg\" alt=\"criando_widget_02\" width=\"386\" height=\"238\" srcset=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_02.jpg 386w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_02-385x238.jpg 385w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2016\/06\/criando_widget_02-24x15.jpg 24w\" sizes=\"(max-width: 386px) 100vw, 386px\" \/><\/a><\/div>\n<div>Pronto! Seu Widget customizado est\u00e1 criado.<\/div>\n<\/div>\n<div>\n<p>Gostou do artigo? Compartilhe e deixe seu coment\u00e1rio.<\/p>\n<p>Um abra\u00e7o e at\u00e9 a pr\u00f3xima.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A utiliza\u00e7\u00e3o de widgets se torna um diferencial em nossos temas pela facilidade de utilizar,\u00a0implementar\u00a0e explorar novos recursos. Para desenvolver um widget, voc\u00ea precisar\u00e1 basicamente\u00a0entender a classe WP_Widget e implementar alguns m\u00e9todos, que seriam: \u00a0__construct, widget, form, e update. Veremos neste artigo como criar widget para WordPress de forma simples e pr\u00e1tica. Abaixo temos uma [&hellip;]<\/p>\n","protected":false},"author":67,"featured_media":3369,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[291],"tags":[],"class_list":["post-3579","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"_links":{"self":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/3579","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/comments?post=3579"}],"version-history":[{"count":0,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/3579\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media\/3369"}],"wp:attachment":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media?parent=3579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/categories?post=3579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/tags?post=3579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}