The difference is in their source code. If you have a look in the source code of esc_attr__() we’ll have this-
function esc_attr__( $text, $domain = 'default' ) {
return esc_attr( translate( $text, $domain ) );
}
And if we go for the source code of esc_attr_e we’ll get this below code block-
function esc_attr_e( $text, $domain = 'default' ) {
echo esc_attr( translate( $text, $domain ) );
}
Now you can clearly see the difference. esc_attr__() is returning the value and esc_attr_e is echoing the value.
esc_attr__() Use Case Example:
Now if you just want put the translated value of an attribute to some variable you have to use esc_attr__(). See below example-
$translated_value = esc_attr__( 'Your Text', 'your_text_domain' );
<input title="<?php echo $translated_value ?>" type="submit" value="submit" >
Look we are putting the value to $translated_value variable first and then we are echoing it in input field’s title attribute.
esc_attr_e Use Case Example:
Well, if you need to echo the attribute directly after translation then you should use esc_attr_e. Example given below-
<input title="<?php esc_attr_e( 'Read More', 'your_text_domain' ) ?>" type="submit" value="submit" >
Hope this above helps.