使用REGISTION_ERROR过滤器的两个函数

时间:2013-04-18 作者:MF1

我编写了两个利用registration\\u errors过滤器的插件:

add_filter( \'registration_errors\', \'process_payment\', 10, 3 );

add_filter( \'registration_errors\', \'add_user_to_SF\', 10, 3 );
何时add_user_to_SF 返回错误process_payment 函数成功运行(我知道这一点,因为它处理付款)。

我如何设置它,以便当其中一个返回错误时,另一个不会运行,并且不会发生用户注册?

1 个回复
最合适的回答,由SO网友:Johannes Pille 整理而成

通过错误代码识别错误运行add_user_to_SF 使用较早的优先级,使其首先执行

add_filter( \'registration_errors\', \'add_user_to_SF\', 9, 3 );`
假设您的add_user_to_SF:

function add_user_to_SF( $errors, $sanitized_user_login, $user_email )
{
    $has_errors = false;

    if ( /* some condition that should throw an error */ ) {
        $errors->add( \'some_error\', \'some message\' );
        $has_errors = true;
    }
    if ( /* another condition that should throw an error */ ) {
        $errors->add( \'another_error\', \'another message\' );
        $has_errors = true;
    }

    if ( ! $has_errors ) {
        /* write to your external DB */
    }

    return $errors;
}
然后使用$errors 对象的get_error_codes 方法:

function process_payment( $errors, $sanitized_user_login, $user_email )
{
    $error_codes = $errors->get_error_codes();

    if (
        is_array( $error_codes ) &&
        ! empty( $error_codes ) &&
        ! empty( array_intersect( array( \'some_error\', \'another_error\' ), $error_codes ) )
    ) {
        return $errors;
    } else {
        /* run your payment processing */
    }

    return $errors;
}

通过标志

以下是如何将标志作为类属性的模型:

if ( ! class_exists( \'WPSE_96362_Registration_Errors\' ) ) {
    class WPSE_96362_Registration_Errors
    {
        /* error flag */
        private $has_errors = false;

        /* constructor with filters */
        public function __construct()
        {
            /* earlier priority for "add_user_to_SF" method */
            add_filter( \'registration_errors\', array( $this, \'add_user_to_SF\' ), 9, 3 );
            add_filter( \'registration_errors\', array( $this, \'process_payment\' ), 10, 3 );
        }

        public function add_user_to_SF( $errors, $sanitized_user_login, $user_email )
        {
            if ( /* some condition that should throw an error */ ) {
                 $errors->add( \'some_error\', \'some message\' );
                 $this->has_errors = true;
            }
            if ( /* another condition that should throw an error */ ) {
                 $errors->add( \'another_error\', \'another message\' );
                 $this->has_errors = true;
            }

            if ( ! $this->has_errors ) {
                /* write to your external DB */
            }

            return $errors;
        }

        public function process_payment( $errors, $sanitized_user_login, $user_email )
        {
            if ( $this->has_errors ) {
                return $errors;
            } else {
                /* run your payment processing */
            }

            return $errors;
        }
    }
}

$wpse_96362_registration_errors = new WPSE_96362_Registration_Errors();

结束

相关推荐

Taxonomy search filters

我使用几种分类法开发了几个国家的教育课程数据库。国家、研究所、研究水平和其他一些是分类法。如果用户单击某个国家/地区,将显示该国家/地区的所有课程。如何在保留在同一国家/地区的情况下过滤结果(研究所、学习水平等)。我想把它放在存档页上,这样每个搜索都可以进一步过滤。