Esta página do códice explica isso muito bem, eu acho.
A função mais importante e mais usada é provavelmente esc_attr
. Veja este exemplo:
<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>">
<?php print $author_name; ?>
</a>
Se $author_name
contiver um caractere "
, seu atributo será fechado e, se esse caractere for seguido por onclick="do_something();"
, poderá piorar:)
Fazer print esc_attr($author_name)
garante que esses caracteres sejam codificados e o navegador não faz coisas que não deve fazer.
Há um caso em que você não precisa dele: quando você está esperando um número, caso em que você pode simplesmente converter os dados de entrada para números inteiros, por exemplo:
print (int)$_POST['some_number'];
As funções meta * listadas aqui já tomam cuidado com a limpeza da entrada para o armazenamento do banco de dados, portanto, você não precisa se preocupar com isso.
O método wpdb->prepare()
precisa ser usado quando você mesmo fizer as consultas do banco de dados. Aqui está um exemplo:
$sql = $wpdb->prepare('
UPDATE wp_posts SET post_title = %s WHERE ID = %d',
$_POST['title'], $_POST['id']);
$wpdb->query($sql);
As palavras-chave %s
e %d
serão substituídas pelos seus valores sanitizados $ _POST.
Um erro muito comum que eu vejo em muitos plugins no repositório do WP.org é passar uma consulta já preparada para ele (e mal preparada), como:
$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...
Não faça isso:)
Além disso, a higienização precisa ser feita de forma diferente ao ecoar HTML em PHP contra PHP embutido em HTML?
Ambas as declarações acima alcançar a mesma coisa. Mas eles precisam ser santificados de forma diferente?
Não.