Различная почта wp от и почта wp от имени для конкретных ситуаций
Мне интересно, как создать различия wp_mail_from
и wp_mail_from_name
для конкретных действий, которые используют встроенную почтовую систему в Wordpress.
Например, когда появляется новый комментарий, уведомите пользователя, используя это:
function comments_new_mail_from($old) {return '[email protected]';}
function comments_new_mail_from_name($old) {return 'Comments at Example.com';}
add_filter('wp_mail_from', 'comments_new_mail_from');
add_filter('wp_mail_from_name', 'comments_new_mail_from_name');
Но когда регистрируется новый пользователь, используйте:
function users_new_mail_from($old) {return '[email protected]';}
function users_new_mail_from_name($old) {return 'Users at Example.com';}
add_filter('wp_mail_from', 'users_new_mail_from');
add_filter('wp_mail_from_name', 'users_new_mail_from_name');
Я хочу сделать это, чтобы выяснить, как это сделать правильно, и избежать каких-либо проблем с плагинами, использующими встроенную почтовую систему Wordpress.
1 answers
Есть два способа:
Проверьте исходное значение и, если оно специфично для данного случая, верните определенное новое значение.
Цепочка фильтров: регистрируйте почтовый фильтр только на определенных крючках. Поэтому вам нужно найти крючок, который произойдет до вызова
wp_mail()
.
Простой пример, не проверенный, просто руководство:
// change mod mails for new comments
add_filter( 'pre_option_moderation_notify', array ( 'WPSE_Mail_Filter', 'init' ) );
// new user registration
add_filter( 'load-user-new.php', array ( 'WPSE_Mail_Filter', 'init' ) );
class WPSE_Mail_Filter
{
protected static $new_mail = NULL;
protected static $new_name = NULL;
public static function init( $input = NULL )
{
if ( 'pre_option_moderation_notify' === current_filter() )
{
self::$new_mail = '[email protected]';
self::$new_name = 'Comments at Example.com';
}
if ( 'load-user-new.php' === current_filter() )
{
self::$new_mail = '[email protected]';
self::$new_name = 'Users at Example.com';
}
// add more cases
// then check if we set a new value:
if ( ! empty ( self::$new_mail ) )
add_filter( 'wp_mail_from', array ( __CLASS__, 'filter_email' ) );
if ( ! empty ( self::$new_name ) )
add_filter( 'wp_mail_from_name', array ( __CLASS__, 'filter_name' ) );
// we do not change anything here.
return $input;
}
public static function filter_name( $name )
{
remove_filter( current_filter(), array ( __CLASS__, __FUNCTION__ ) );
return self::$new_name;
}
public static function filter_email( $email )
{
remove_filter( current_filter(), array ( __CLASS__, __FUNCTION__ ) );
return self::$new_mail;
}
}
Трудная часть - найти правильный крючок.
Например, когда был написан новый комментарий, вызывается функция wp_notify_moderator()
. В этой функции нет действительно хорошего крючка, но она вызывает...
if ( 0 == get_option( 'moderation_notify' ) )
...рано. Это снова запускает крючок pre_option_moderation_notify
, и именно здесь мы можем запустить наш фильтр. Вам нужно просмотреть основной код, чтобы найти лучший стартовый хук для всех случаев, но обычно всегда есть что-то.