Modo de restauração do WordPress: funções e configurações

Enquanto estudava para gravar os vídeos sobre as novidades para desenvolvedores do WordPress 5.2 “Jaco” lá para o canal do YouTube, acabei tendo que escrever um código para salvar o link enviado por e-mail pelo novo Modo de restauração do WordPress.

Assiste aí e se inscreva no canal! 😀

Graças ao novo recurso de detecção de erros fatais, ao perceber um problema em um plugin ou tema, o WordPress envia um e-mail para o administrador do site. Este e-mail contém um link de acesso para o novo Modo de restauração, mas um dos parâmetros deste endereço é salvo criptografado no banco de dados, ou seja, essa informação só está disponível no e-mail. Se o e-mail não chegar, não dá pra acessar (até rimou).

Nos meus testes locais, mesmo com um plugin de SMTP configurado, o e-mail não chegou. Por isso criei o plugin abaixo e o salvei como um must use plugin, isto é, um plugin que não pode ser desabilitado. Para salvar um plugin desta forma basta colocar o arquivo PHP na pasta mu-plugins dentro da pasta wp-content. Ela ficará no mesmo nível que as pastas plugins e themes e, caso ela ainda não exista, você deverá criá-la.

<?php
/*
 * Plugin name: Store Recovery Keys
 */

add_action(
    'generate_recovery_mode_key',
    function( $token, $key ) {
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
        global $wp_filesystem;

        WP_Filesystem();

        $upload_dir = wp_upload_dir();

        $php = '<?php // ' . add_query_arg(
			array(
				'action'   => 'enter_recovery_mode',
				'rm_token' => $token,
				'rm_key'   => $key,
			),
			wp_login_url()
		) . ' ?>';

        $wp_filesystem->put_contents( trailingslashit( $upload_dir['basedir'] ) . 'recovery-links.php', $php, 0644 );
    },
    10,
    2
);

Vale lembrar que a pasta mu-plugins funciona de um jeito um pouco diferente da plugins: os arquivos PHP devem estar na raíz da pasta. Must use plugins dentro de subpastas não são reconhecidos. Então, eu criei um arquivo com o nome store-recovery-keys.php, coloquei o conteúdo acima e salvei. Depois disso, o link de acesso é salvo dentro da pasta wp-content/uploads, em um arquivo com nome recovery-links.php.

Como alterar o e-mail que recebe o link do Modo de restauração

O WordPress 5.2 possibilita que você altere o destinatário do e-mail que contém esse link de duas formas.

A constante RECOVERY_MODE_EMAIL

O primeiro jeito, e o mais simples, é configurando a constante RECOVERY_MODE_EMAIL no seu wp-config.php. Antes da parte que diz /* Isto é tudo, pode parar de editar! :) */, você pode colocar algo como:

define( 'RECOVERY_MODE_EMAIL', '[email protected]' );

O filtro recovery_mode_email

Também é possível alterar o e-mail que recebe o link para o Modo de restauração através do filtro recovery_mode_email, da seguinte forma:

add_filter(
    'recovery_mode_email',
    function( $email_data ) {
        $email_data['to'] = '[email protected]';
        return $email_data;
    }
);

Como alterar o tempo de envio dos e-mails do Modo de restauração

Por padrão, o Modo de restauração do WordPress espera um dia inteiro para enviar outro e-mail. Você pode alterar esse intervalo usando o filtro recovery_mode_email_rate_limit. Recomendo que você coloque este código em um plugin separado, afinal se o código estiver no arquivo functions.php do seu tema e seu tema for “pausado” pela nova funcionalidade, o código vai ser ignorado.

add_filter(
    'recovery_mode_email_rate_limit',
    function( $interval ) {
        return 12 * DAY_IN_SECONDS;
    }
);

Você pode usar as constantes de tempo fornecidas pelo WordPress. Falei sobre elas no post com 4 dicas rápidas de programação no WordPress.

Outras funções e configurações disponíveis

O novo recurso trouxe muitas opções e funções úteis. Falei sobre elas no vídeo, mas vou listar aqui também, afinal um pouco de SEO não faz mal para ninguém.

wp_is_recovery_mode()

Com a função wp_is_recovery_mode() você pode testar se o usuário está no Modo de restauração ou não. Pode ser útil para exibir algum aviso ou fazer seu plugin se comportar de uma forma um pouco diferente talvez.

WP_RECOVERY_MODE_SESSION_ID

Ter essa constante definida no seu wp-config.php vai forçar a entrada no modo de restauração, ou seja, se ela não estiver envolvida por um teste qualquer, todo mundo sempre vai estar no modo de restauração. Use com cuidado.

Drop-ins php-error.php e fatal-error-handler.php

Expliquei o que são drop-ins, ou plugins avançados, no vídeo, mas basicamente são arquivos com nomes predefinidos que ficam na pasta wp-content. O advanced-cache.php é o mais famoso deles.

Com os novos drop-ins você pode alterar a mensagem de erro exibida (php-error.php) ou alterar a forma como o WordPress vai lidar com o erro (fatal-error-handler.php). Neste último você deve estender a classe WP_Fatal_Error_Handler e retornar uma instância no final do arquivo.

Lembre-se que drop-ins que alteram algo exibido na tela, como o php-error.php e o db-error.php, não estão ligados ao tema porque o WordPress possivelmente nem chegou até o ponto de incluir seu tema na execução. Pense nisso ao definir o estilo dos elementos na tela, ou seja, não conte com nada que esteja no seu tema.

Desativar completamente o Modo de restauração

Para desativar completamente o recurso, você pode usar a constante WP_DISABLE_FATAL_ERROR_HANDLER. É só configurá-la no seu arquivo wp-config.php:

define( 'WP_DISABLE_FATAL_ERROR_HANDLER', true );

Útil para os casos de empresas de hospedagem, por exemplo, que lidam com erros de forma personalizada.

Testar se o Modo de restauração está disponível

É possível testar se o modo de restauração está disponível através da função wp_is_fatal_error_handler_enabled(). Esta função serve para descobrir se o modo está disponível, ou seja, se ele não foi desativado pela constante WP_DISABLE_FATAL_ERROR_HANDLER. Esta função é bem diferente da função wp_is_recovery_mode(), que serve para saber se o modo está sendo executado neste exato momento.


Está a fim de ajudar? Compartilhe este conteúdo nas suas redes sociais! 🙂

Felipe Elia

Associate Director of Platform Engineering na 10up, WordPress Core Contributor, Global Polyglots Mentor na comunidade internacional do WordPress e Locale Manager na comunidade WordPress Brasil.