¿Cuándo usar esc_html y cuándo usar sanitize_text_field?
Parece que realizan casi el mismo tipo de trabajo. Entonces...
¿Cuándo debería usar esc_html()
en lugar de sanitize_text_field()
?

esc_html()
es más o menos sin pérdida — simplemente convierte el marcado HTML en texto visible codificado, para que no sea interpretado como marcado por el navegador.
Semánticamente es un escape, por lo que está diseñado para usarse para hacer que la salida a la página sea segura.
sanitize_text_field()
, sin embargo, realmente elimina todo el marcado HTML, así como los espacios en blanco adicionales. Solo deja texto plano.
Semánticamente es un sanitizado, por lo que está diseñado para usarse para hacer que los datos que se guardan sean seguros.

¿no sería mejor usar esc_html tanto para la salida como para guardar? De todos modos no voy a mostrar ningún marcado... ¿entonces cuándo usaría sanitize_text_field()?

@yeahman ¿"mejor" en qué sentido? Hacen cosas claramente diferentes. Descartar marcado se usa normalmente para cosas donde no se espera marcado, por ejemplo un formulario que recibe un nombre.

Me refiero a que almacena lo que el usuario ve e ingresó... como dijiste es sin pérdida (ej. si ingresa "la etiqueta <head> es donde debes incluir tus archivos css", espera ver el <head> en su publicación).
Para un campo de nombre, controlaría el ingreso mediante validación; ¿no sería más adecuado?

Estoy interesado en las diferencias entre sanitize_text_field()
y strip_tags

Si introduces contenido en un array codificado en JSON, los valores del array contienen "
(MUY probable si tu contenido es, por ejemplo, datos de posts) entonces - aunque sanitize_text_field()
SERÍA lo correcto para hacer cuando GUARDAS datos, no funcionará. Necesitarás usar esc_html
, que codifica las "
y por lo tanto, en el momento que decodifiques tu JSON, NO romperá el valor devuelto.
