特定情况下不同的wp_mail_from和wp_mail_from_name

时间:2013-04-11 作者:Sydney Beau

我想知道如何创造不同wp_mail_fromwp_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 个回复
最合适的回答,由SO网友:fuxia 整理而成

有两种方法:

检查原始值,如果特定于这种情况,则返回特定的新值。

链接过滤器:仅在特定挂钩上注册邮件过滤器。所以你必须找到一个以前发生过的钩子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, 这就是我们可以启动过滤器的地方。您必须搜索核心代码以找到所有情况下的最佳开始挂钩,但通常总会有一些东西。

结束

相关推荐

Functions.php:从博客中排除类别

所以很明显,如何从模板中排除某些类别,但我不想修改4个模板,使它们忽略某个类别。有没有一种方法可以将某个类别从阅读设置的“博客”集中排除?我正在将博客分配到名为“博客”的页面。。。但显然,档案和搜索也需要对这一超出类别的内容视而不见。我宁愿在里面做functions.php