Различная почта 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.

Author: Sydney Beau, 2013-04-11

1 answers

Есть два способа:

  1. Проверьте исходное значение и, если оно специфично для данного случая, верните определенное новое значение.

  2. Цепочка фильтров: регистрируйте почтовый фильтр только на определенных крючках. Поэтому вам нужно найти крючок, который произойдет до вызова 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, и именно здесь мы можем запустить наш фильтр. Вам нужно просмотреть основной код, чтобы найти лучший стартовый хук для всех случаев, но обычно всегда есть что-то.

 2
Author: fuxia, 2013-04-12 17:07:16