Prever a ocorrência de erros é uma tarefa fundamental para manter a consistência de seu projeto. Para auxiliar no processo de testes, verificação e validação do código em recursos WordPress; você pode optar por utilizar a classe WP_Error. Através da criação de objetos dessa classe você será capaz de organizar e exibir (quando necessário) a ocorrência de erros em sua aplicação.

Especificações da classe WP_Error

Com o propósito de manipular os erros em seusprojetos, o WordPress disponibiliza a classe WP_Error. Tanto para plugins, quanto para os próprios arquivos do WordPress a classe armazena códigos e mensagens de cada erro por ela captado.

Para trabalhar com a classe WP_Error, é importante conhecer suas propriedades e métodos. A classe é constituída por Código, Mensagem e Dados. Entenda um pouco da estrutura da classe através de suas duas propriedades, $errors e $error_data.

A propriedade $errors é um array que contém uma lista de erros. A outra propriedade, $error_data também é um array, mas este contém listas de dados referentes aos erros organizados por código. Além dessas duas propriedades, a classe WP_Error possui alguns métodos úteis para a manipulação dos problemas encontrados:

__construct – O construtor da classe permite atribuir um erro no momento em que é definido. O parâmetro $code será responsável por organizar as mensagens e dados dos erros, portanto trate de estabelecer um valor a ele;

get_error_codes – Recupera todos os códigos de erro através de um array;

get_error_code – Retorna apenas o primeiro código de erro disponível. Retorna vazio caso não houver nenhum código de erro definido;

get_error_messages – Obtém as mensagens de erro de um ou mais códigos passados como parâmetro;

get_error_message – Uma única mensagem de erro, a primeira encontrada é obtida;

get_error_data – De acordo com o código passado, retorna os dados atrelados a ele;

add – Adicione novas mensagens de erro ao objeto criado;

add_data – Inserção de um dado para um código de erro, cada código de erro pode conter apenas um dado atribuído;

remove – Apague todas as mensagens e dados vinculados ao código de erro passado como parâmetro.

WP_Error em funcionamento

Agora que você já conheceu a classe WP_Error com seus métodos e propriedades, veja como poderá colocar essa técnica de tratamento de erros em prática. Em uma sistema que requer dados provenientes de requisições a serviços externos, caso os dados não tenham sido obtidos você pode definir:

$err = new WP_Error( 'remote', 'Nenhum dado obtido pelo servidor remoto...', 'Problemas com o servidor remoto' );

Com isso você terá um objeto WP_Error definido e já com um erro atribuído. Imagine agora que a solicitação ao outro servidor foi feita, porém não retornou o conteúdo esperado; você pode então adicionar um novo erro a sua instância:

$err->add( 'remote', 'Dados inconsistentes' );

Perceba que o valor de $error_data não foi passado, caso tivesse sido ele iria sobrepor o valor inicialmente criado. Outro detalhe importante é notar a organização dos erros: um único código possui um único dado (em nosso exemplo a definição do erro, do que ele trata), porém várias mensagens (pois diferentes tipos de erros podem ocorrer acerca de um mesmo assunto).

Uso aplicado do controle de erros em formulários

Veja no exemplo abaixo como você poderá aplicar as definições apresentadas para a validação de um formulário. A validação verifica a ocorrência de erros e atribui diferentes mensagens para cada campo analisado.

// $fields = array( 'name', 'email', 'message' );
function form_validate( $fields )
{
    $v = array();
    $err = new WP_Error;
    foreach ( $fields as $field ) {
        $v[ $field ] = ( isset( $_POST[ $field ] ) ) ? sanitize_text_field( $_POST[ $field ] ) : false;
        if ( !$v[ $field ] )
            $err->add( 'field', sprintf( 'Campo $_POST[ "%s" ] vazio', $field ) );
    }

    if ( !ctype_alpha( $v[ 'name' ] ) )
        $err->add( 'field-name', 'Nome inválido', 'Campo "Nome"' );

    if ( !is_email( $v[ 'email' ] ) )
        $err->add( 'field-email', 'E-mail inválido', 'Campo "E-mail"' );

    if ( strlen( $v[ 'message' ] ) < 10 ) 
        $err->add( 'field-message', 'Mensagem muito curta', 'Campo "Mensagem"' );

    if ( strlen( $v[ 'message' ] ) > 255 )
        $err->add( 'field-message', 'Mensagem muito longa' );

    if ( is_wp_error( $err ) ) {
        echo '<ul>';
        foreach ( $err->get_error_messages() as $msg ) {
            printf( '<li>%s</li>', $msg );
        }
        echo '</ul>';
    }
}

Note que no início, ao fazer a varredura e sanitização de todos os campos, o mesmo erro de campo vazio adiciona diferentes mensagens ao objeto WP_Error, referenciando cada campo com o problema encontrado. Caso todos os campos estejam sem preenchimento, o objeto terá três mensagens de erros diferentes para o mesmo código.

Em sequência os campos são verificados separadamente e criado um código para cada um deles a fim de evidenciar problemas específicos. Os dados dos erros estão sendo usados para explicar a que o código se refere (no caso, o campo em questão). Por tal razão não foi atribuído um novo valor para o campo mensagem na segunda condição, pois trata-se do mesmo campo e não é pretendido sobrescrever essa descrição. Ao final as mensagens são recuperadas e exibidas em formato de lista no HTML do site.