{"id":230758,"date":"2022-12-04T17:11:00","date_gmt":"2022-12-04T14:11:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230758"},"modified":"2022-12-04T17:15:09","modified_gmt":"2022-12-04T14:15:09","slug":"lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-1\/","title":{"rendered":"Lendo e entendendo os logs de erros do WordPress, parte 1"},"content":{"rendered":"\n<p>\u00c0 medida que continuamos analisando o que significa ser <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">um desenvolvedor independente do WordPress<\/a><\/strong>, as ferramentas necess\u00e1rias e as v\u00e1rias estrat\u00e9gias que podem melhorar nosso conjunto de habilidades, venho falando sobre as v\u00e1rias constantes, plugins e ferramentas para nos ajudar.<\/p>\n<p>Se voc\u00ea est\u00e1 apenas trope\u00e7ando neste post, recomendo verificar <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/ferramentas-nativas-de-depuracao-do-wordpress-que-nao-exigem-um-ide\/\" title=\"meu guia para ferramentas nativas de depura\u00e7\u00e3o do WordPress\">meu guia para ferramentas nativas de depura\u00e7\u00e3o do WordPress<\/a><\/strong>, bem como o restante dos posts da s\u00e9rie <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/the-independent-wordpress-developer\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">at\u00e9 agora.<\/a><\/strong><\/p>\n<p>Afinal, acho importante que todos trabalhemos na mesma base \u2013 ou algo intimamente relacionado \u2013 ao analisar essas informa\u00e7\u00f5es.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e7490c88078.png\" 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-163025-61e7490c88078.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 1\"><\/a><\/p>\n<p>Em \u00faltima an\u00e1lise, usar uma ferramenta como o <strong><a href=\"https:\/\/xdebug.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Xdebug<\/a><\/strong> \u00e9 indispens\u00e1vel, mas temos que trabalhar para isso (para quem est\u00e1 curioso, <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-xdebug-com-valet-e-wordpress\/\" title=\"escrevi um breve guia\">escrevi um breve guia<\/a><\/strong> sobre isso h\u00e1 pouco mais de um ano).<\/p>\n<p>Por enquanto, por\u00e9m, vamos come\u00e7ar com o b\u00e1sico. No post anterior, sa\u00ed com a seguinte declara\u00e7\u00e3o:<\/p>\n<blockquote>\n<p>Na pr\u00f3xima postagem, come\u00e7aremos a analisar o que \u00e9 necess\u00e1rio para examinar o log de erros gerado pelo WordPress e como entender as informa\u00e7\u00f5es que vemos.<\/p>\n<\/blockquote>\n<p>E \u00e9 isso que eu quero ver hoje porque, se nada mais, lhe dar\u00e1 algo pr\u00e1tico com o qual trabalhar.<\/p>\n<h2>Entendendo os logs de erros do WordPress, parte 1<\/h2>\n<p>Antes de ir muito longe nisso, quero abordar uma quest\u00e3o que foi levantada por um membro do site.<\/p>\n<p>Ou seja, me perguntaram:<\/p>\n<blockquote>\n<p>Quando vamos olhar para os princ\u00edpios orientados a objetos?<\/p>\n<\/blockquote>\n<p>Embora eu tenha abordado um pouco sobre isso <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">em uma s\u00e9rie anterior<\/a><\/strong>, \u00e9 algo que estou trabalhando para abordar mais detalhadamente mais adiante nesta s\u00e9rie.<\/p>\n<p>Com isso dito, por\u00e9m, vamos come\u00e7ar a examinar os logs de erros.<\/p>\n<h3>Configurando suas constantes<\/h3>\n<p>Se voc\u00ea n\u00e3o configurou as constantes em seu arquivo <strong>wp-config.php<\/strong>, recomendo faz\u00ea-lo agora, pois isso lhe dar\u00e1 o maior n\u00edvel de granularidade ao examinar quaisquer problemas que possam surgir.<\/p>\n<p>Se voc\u00ea n\u00e3o entendeu, n\u00e3o deixe de ler <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/ferramentas-nativas-de-depuracao-do-wordpress-que-nao-exigem-um-ide\/\" title=\"este post\">este post<\/a><\/strong> (e se tiver, certifique-se de que <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-11-wp-config-debug-full-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as seguintes constantes<\/a><\/strong> estejam definidas em seu arquivo de configura\u00e7\u00e3o):<\/p>\n<pre><code>&lt;?php\ndefine( 'WP_DEBUG', true );\ndefine( 'WP_DEBUG_LOG', true );\ndefine( 'WP_DEBUG_DISPLAY', true );\n@ini_set( 'display_errors', 1 );\ndefine( 'SCRIPT_DEBUG', true );\ndefine( 'SAVEQUERIES', true );<\/code><\/pre>\n<p>Uma vez que estejam no lugar, voc\u00ea tem tudo o que precisa para n\u00e3o apenas ver as informa\u00e7\u00f5es na tela, mas tamb\u00e9m no log de depura\u00e7\u00e3o que o WordPress gerar\u00e1.<\/p>\n<h3>Onde est\u00e1 o registro?<\/h3>\n<p>Dependendo da natureza do seu ambiente, isso pode variar; no entanto, na maioria dos casos, voc\u00ea encontrar\u00e1 <strong>debug.log<\/strong> no diret\u00f3rio <strong>wp-content<\/strong> acima dos diret\u00f3rios <strong>plugins<\/strong>, <strong>themes<\/strong> e <strong>uploads<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e74910d3457.png\" 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-163025-61e74910d3457.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 1\"><\/a><\/p>\n<p>Como voc\u00ea pode ver na visualiza\u00e7\u00e3o da captura de tela acima, meu arquivo de depura\u00e7\u00e3o tem muito conte\u00fado. Veremos isso com mais profundidade na pr\u00f3xima se\u00e7\u00e3o, bem como como entend\u00ea-lo. Enquanto isso, verifique se este arquivo existe. Se existir, sinta-se \u00e0 vontade para ir em frente e examinar o conte\u00fado do arquivo. Voc\u00ea pode ou n\u00e3o entender muito do que est\u00e1 acontecendo, mas o conte\u00fado do arquivo significa que algo em um tema ou plugin est\u00e1 acionando v\u00e1rios <strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.error-reporting.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">avisos, avisos e erros do PHP<\/a><\/strong> que o WordPress est\u00e1 capturando e despejando no arquivo de log.<\/p>\n<h3>O que \u00e9 o arquivo de log ainda significa?<\/h3>\n<p>Isso n\u00e3o significa necessariamente que algo est\u00e1 quebrado, mas indica que algo n\u00e3o est\u00e1 funcionando como deveria, n\u00e3o est\u00e1 sendo capturado e tratado adequadamente no n\u00edvel program\u00e1tico ou est\u00e1 simplesmente fazendo algo que n\u00e3o deveria estar fazendo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e749148c865.png\" 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-163025-61e749148c865.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 1\"><\/a><\/p>\n<p>N\u00e3o precisa ser assim (mas pode!).<\/p>\n<p>Como desenvolvedores, devemos nos esfor\u00e7ar para garantir que nosso c\u00f3digo n\u00e3o gere nada que possa ser gravado no log de erros.<\/p>\n<p>Uma coisa \u00e9 fazer isso no desenvolvimento, pois podemos obter informa\u00e7\u00f5es sobre o que estamos fazendo e como o WordPress est\u00e1 se saindo. \u00c9 outra coisa, por\u00e9m, para algo que lan\u00e7amos no n\u00edvel de produ\u00e7\u00e3o para gerar essas coisas.<\/p>\n<h3>Lendo o log de erros<\/h3>\n<p>Obviamente, h\u00e1 mais na leitura do log de erros do que apenas abri-lo. Para muitos, a impress\u00e3o inicial \u00e9 que pode ser um monte de jarg\u00e3o. Eu entendo isso tamb\u00e9m. Mas quando voc\u00ea entende o que est\u00e1 mostrando, \u00e9 muito mais f\u00e1cil de entender.<\/p>\n<p>Ent\u00e3o, vamos dar uma olhada em um exemplo muito simples. Este tamb\u00e9m n\u00e3o \u00e9 um exemplo inventado. Na verdade, este \u00e9 um que veio de um plugin no qual eu estava trabalhando. O log de erros cont\u00e9m <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-12-error-log-example-1-txt\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as seguintes informa\u00e7\u00f5es<\/a><\/strong> :<\/p>\n<pre><code>[05-Jul-2018 19:43:53 UTC] PHP Fatal error:  Uncaught Error: Class 'EasyEmailExportAdminEmailExportSubmenu' not found in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php:37\n#8 \/U in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 37\n[05-Jul-2018 19:44:03 UTC] PHP Warning:  include_once(.\/src\/Admin\/EmailExportSubmenu.php): failed to open stream: No such file or directory in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25\n[05-Jul-2018 19:44:03 UTC] PHP Warning:  include_once(): Failed opening '.\/src\/Admin\/EmailExportSubmenu.php' for inclusion (include_path='.:\/usr\/local\/Cellar\/php\/7.2.5\/share\/php\/pear') in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>Observe que, na ess\u00eancia acima, existem tr\u00eas linhas. O melhor curso de a\u00e7\u00e3o ao ler os logs de erros \u00e9 come\u00e7ar de baixo e ir subindo. Isso ocorre porque as coisas, ao serem executadas em execu\u00e7\u00e3o, operam em uma pilha.<\/p>\n<h4>Uma breve digress\u00e3o sobre as pilhas<\/h4>\n<p>N\u00e3o vou entrar na defini\u00e7\u00e3o do termo em ci\u00eancia da computa\u00e7\u00e3o, mas o c\u00f3digo \u00e9 executado e funciona de tal forma que as fun\u00e7\u00f5es ocorrem e, literalmente, na mem\u00f3ria de um computador, empilham-se umas sobre as outras.<\/p>\n<p>Assim, a coisa mais recente a ser executada sempre estar\u00e1 no topo, onde a raiz de onde come\u00e7a est\u00e1 na parte inferior. Como estamos escrevendo c\u00f3digo em um aplicativo pr\u00e9-existente, isso \u00e9 o WordPress; ent\u00e3o nosso c\u00f3digo provavelmente estar\u00e1 sempre no topo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163025-61e74918219d3.png\" 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-163025-61e74918219d3.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 1\"><\/a><\/p>\n<p>Entendendo os logs de erros do WordPress: n\u00e3o \u00e9 esse tipo de pilha<\/p>\n<p>A ideia \u00e9 que o c\u00f3digo comece a ser executado no WordPress e siga at\u00e9 o trabalho que estamos fazendo. Quando h\u00e1 um aviso, um aviso ou um erro, geralmente ser\u00e1 algo em nosso c\u00f3digo (embora o WordPress n\u00e3o seja isento, geralmente \u00e9 esse o caso).<\/p>\n<p>Ent\u00e3o, quando voc\u00ea l\u00ea o log de erros, voc\u00ea est\u00e1, em ess\u00eancia, lendo o que \u00e9 chamado de <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Stack_trace\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">rastreamento de pilha.<\/a><\/strong> A Wikipedia, conforme link, tem uma defini\u00e7\u00e3o bastante aprofundada sobre o assunto, mas talvez a parte mais relevante para este post seja a seguinte:<\/p>\n<blockquote>\n<p>Os programadores geralmente usam o rastreamento de pilha durante a [depura\u00e7\u00e3o] interativa e post-mortem (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Debugging\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/en.wikipedia.org\/wiki\/Debugging<\/a>). Os usu\u00e1rios finais podem ver um rastreamento de pilha exibido como parte de uma <a href=\"https:\/\/en.wikipedia.org\/wiki\/Error_message\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mensagem de erro<\/a>, que o usu\u00e1rio pode relatar a um programador.<\/p>\n<\/blockquote>\n<p>Isso combina com o que eu descrevi acima, certo? Mas chega de falar sobre o que \u00e9 um rastreamento de pilha (se tornar\u00e1 mais claro \u00e0 medida que nos aprofundarmos na depura\u00e7\u00e3o), vamos voltar a ler o arquivo de log como est\u00e1 atualmente.<\/p>\n<h3>Voltar para Ler o Log<\/h3>\n<h4>Incluindo arquivos<\/h4>\n<p>Primeiro, vamos olhar para a linha de fundo na ess\u00eancia acima. Ele cont\u00e9m o seguinte:<\/p>\n<pre><code>[05-Jul-2018 19:44:03 UTC] PHP Warning: include_once(): Failed opening '.\/src\/Admin\/EmailExportSubmenu.php' for inclusion (include_path='.:\/usr\/local\/Cellar\/php\/7.2.5\/share\/php\/pear') in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>Isso est\u00e1 me dizendo que na linha 25 do meu arquivo, <strong>easy-email-export.php,<\/strong> ele falhou ao abrir um arquivo para inclus\u00e3o. Isso significa que eu tenho uma instru\u00e7\u00e3o <strong>include_once<\/strong> no c\u00f3digo que est\u00e1 referenciando <strong>.\/src\/Admin\/EmailExportSubmenu.php<\/strong> que ele n\u00e3o pode encontrar.<\/p>\n<p>Portanto, o melhor curso de a\u00e7\u00e3o seria encontrar a linha 25 e determinar por que ela n\u00e3o est\u00e1 localizando o arquivo. Talvez isso esteja descartando o caminho completo para onde est\u00e1 olhando. Chegaremos a isso momentaneamente quando falarmos sobre gravar no log de erros.<\/p>\n<h4>Entendendo os Erros<\/h4>\n<p>Na pr\u00f3xima linha (ou seja, a linha acima da que acabamos de ver) cont\u00e9m o seguinte:<\/p>\n<pre><code>[05-Jul-2018 19:44:03 UTC] PHP Warning: include_once(.\/src\/Admin\/EmailExportSubmenu.php): failed to open stream: No such file or directory in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 25<\/code><\/pre>\n<p>Essa linha em particular difere apenas um pouco, mas fornece informa\u00e7\u00f5es adicionais e est\u00e1 contida na cl\u00e1usula que diz &#8220;Nenhum arquivo ou diret\u00f3rio&quot;. Isso \u00e9 perspicaz porque est\u00e1 literalmente nos dizendo que o arquivo n\u00e3o existe.<\/p>\n<p>Pelo menos, n\u00e3o existe onde est\u00e1 olhando. Ent\u00e3o as duas possibilidades s\u00e3o:<\/p>\n<ol>\n<li>n\u00e3o criamos o arquivo ao qual somos refer\u00eancias,<\/li>\n<li>estamos referenciando a localiza\u00e7\u00e3o do arquivo no lugar errado<\/li>\n<\/ol>\n<p>Assim, a primeira coisa que precisar\u00edamos verificar \u00e9 se o arquivo existe no local que estamos tentando incluir. Se isso n\u00e3o acontecer, ent\u00e3o devemos criar o arquivo.<\/p>\n<p>Se o arquivo existir, sabemos que o plug-in est\u00e1 tentando carreg\u00e1-lo do caminho errado. Portanto, podemos precisar examinar nosso <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/namespaces-e-carregamento-automatico-no-wordpress\/\" title=\"autoloader\">autoloader<\/a><\/strong>, nosso caminho de inclus\u00e3o ou como os arquivos est\u00e3o sendo recuperados. Porque, provavelmente, se o arquivo existe, ele est\u00e1 tentando ser carregado de um lugar que n\u00e3o reside.<\/p>\n<h3>Um erro n\u00e3o detectado<\/h3>\n<p>Na linha final do c\u00f3digo, voc\u00ea ver\u00e1 algo assim:<\/p>\n<pre><code>[05-Jul-2018 19:43:53 UTC] PHP Fatal error: Uncaught Error: Class 'EasyEmailExportAdminEmailExportSubmenu' not found in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php:37\n#8 \/U in \/Users\/tommcfarlin\/Dropbox\/Projects\/trunk\/wp-content\/plugins\/easy-email-export\/easy-email-export.php on line 37<\/code><\/pre>\n<p>Este \u00e9 um bom exemplo, primeiro, porque declara explicitamente que este \u00e9 um erro n\u00e3o detectado. Isso significa que qualquer que seja a funcionalidade, algo est\u00e1 gerando um erro e n\u00e3o est\u00e1 sendo capturado.<\/p>\n<ul>\n<li>isso pode ser uma exce\u00e7\u00e3o,<\/li>\n<li>isso pode ser um problema ao tentar chamar uma fun\u00e7\u00e3o que n\u00e3o existe,<\/li>\n<li>isso pode estar operando em uma vari\u00e1vel que n\u00e3o est\u00e1 definida,<\/li>\n<li>e assim por diante.<\/li>\n<\/ul>\n<p>Em \u00faltima an\u00e1lise, h\u00e1 uma infinidade de problemas que podem estar presentes. A boa not\u00edcia, neste exemplo, \u00e9 que \u00e9 praticamente igual ao que est\u00e1 acima: Um arquivo n\u00e3o foi encontrado.<\/p>\n<p>Exceto que, em vez de lan\u00e7ar um aviso, o PHP nos segue explicitamente, este \u00e9 um erro fatal e o programa n\u00e3o pode continuar a execu\u00e7\u00e3o at\u00e9 que essa linha de c\u00f3digo seja resolvida. Antes de descartar isso como algo que \u00e9 o mesmo que a se\u00e7\u00e3o anterior (porque, de certa forma, \u00e9), precisamos reconhecer que isso \u00e9 explicitamente declarado como um erro fatal, enquanto no exemplo anterior foi tratado como um erro aviso.<\/p>\n<p>Existem diferentes maneiras de conceituar isso, mas a maneira como eu geralmente penso sobre isso \u00e9:<\/p>\n<ul>\n<li>Um aviso me diz que algo est\u00e1 errado no c\u00f3digo, mas n\u00e3o \u00e9 ruim o suficiente para justificar a interrup\u00e7\u00e3o da execu\u00e7\u00e3o.<\/li>\n<li>Um aviso \u00e9 um pouco mais s\u00e9rio porque significa que algo corre o risco de n\u00e3o funcionar.<\/li>\n<li>Um erro direto diz &quot;isso n\u00e3o funciona e o programa n\u00e3o pode continuar&quot;.<\/li>\n<\/ul>\n<p>Agora sabemos que o problema \u00e9 de parar o show, por assim dizer, e sabemos qual \u00e9 o problema. Simplificando, um arquivo necess\u00e1rio para o programa concluir sua execu\u00e7\u00e3o n\u00e3o \u00e9 encontrado e, portanto, o programa para de funcionar.<\/p>\n<p>Isso \u00e9 certamente um erro fatal.<\/p>\n<h3>Qual \u00e9 a solu\u00e7\u00e3o?<\/h3>\n<p>O que forne\u00e7o como solu\u00e7\u00e3o para o meu problema n\u00e3o ser\u00e1 prescritivo sobre o que funcionar\u00e1 para voc\u00ea. Para mim, era uma quest\u00e3o de uma linha na minha configura\u00e7\u00e3o do Composer de modo que o autoloader do Composer n\u00e3o pudesse localizar o arquivo no local apropriado (mas isso tem mais a ver com organiza\u00e7\u00e3o de arquivos, namespace e assim por diante).<\/p>\n<p>Para voc\u00ea, pode ser algo diferente.<\/p>\n<ul>\n<li>talvez esteja procurando por um arquivo no diret\u00f3rio errado,<\/li>\n<li>talvez o arquivo tenha um nome diferente do que est\u00e1 especificado no c\u00f3digo,<\/li>\n<li>ou talvez seja outra coisa.<\/li>\n<\/ul>\n<p>Seja qual for o caso, o ponto \u00e9 que \u00e9 uma quest\u00e3o de percorrer o arquivo de log de baixo para cima para diagnosticar o problema e rastrear o que PHP, WordPress e seu trabalho est\u00e3o fazendo e, em seguida, diagnostic\u00e1-lo a partir da\u00ed.<\/p>\n<h2>Gravando no log de erros<\/h2>\n<p>No pr\u00f3ximo post, vamos tirar um momento para ver como podemos gravar no log de erros. \u00c0s vezes, ler o arquivo \u00e9 bom e simplesmente ir e voltar entre o que estamos vendo e resolver os problemas \u00e9 bom.<\/p>\n<p>Mas e o caso de quando queremos despejar algo para obter informa\u00e7\u00f5es sobre o que o WordPress ou PHP est\u00e1 vendo? Isso tamb\u00e9m \u00e9 \u00fatil.<\/p>\n<p>Ent\u00e3o, na pr\u00f3xima parte desta s\u00e9rie sobre como entender os logs de erros do WordPress, faremos exatamente isso.<\/p>\n<h3>O que h\u00e1 depois disso?<\/h3>\n<p>Em seguida, veremos como usar alguns dos plug-ins descritos anteriormente para testar o c\u00f3digo e tamb\u00e9m criar o perfil do nosso c\u00f3digo para garantir que fizemos tudo o que podemos para garantir que estamos produzindo um n\u00edvel de qualidade.<\/p>\n<p>Isso n\u00e3o significa que terminamos completamente o processo de depura\u00e7\u00e3o, mas definitivamente estamos um passo mais perto e estamos posicionados para escrever c\u00f3digo com um grau de qualidade que n\u00e3o resulte em um arquivo representando v\u00e1rios problemas sutis fomos muito descuidados para consertar (quanto mais entender).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para come\u00e7ar a depurar seu c\u00f3digo sem o uso de ferramentas de terceiros, por que n\u00e3o ver o que PHP e WordPress geram e funcionam atrav\u00e9s da compreens\u00e3o dos logs de erros do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":163026,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846,867],"tags":[1170],"class_list":["post-230758","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230758","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=230758"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230758\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163026"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}