web-dev-qa-db-fra.com

Deux fonctions utilisant le filtre registration_errors

J'ai écrit deux plugins qui utilisent le filtre registration_errors:

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

add_filter( 'registration_errors', 'add_user_to_SF', 10, 3 );

Lorsque add_user_to_SF renvoie des erreurs, la fonction process_payment s'exécute correctement (je le sais car elle traite un paiement).

Comment puis-je configurer cela pour que, lorsque l'un d'eux renvoie une erreur, l'autre ne s'exécute pas et que l'enregistrement de l'utilisateur ne se produise pas?

1
MF1

Identifier les erreurs via un code d'erreur

Exécuter add_user_to_SF avec une priorité antérieure, pour le faire exécuter en premier

add_filter( 'registration_errors', 'add_user_to_SF', 9, 3 );`

Supposons que vous avez deux erreurs possibles dans votre 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;
}

Recherchez ensuite ces erreurs dans la dernière fonction en utilisant la méthode $errors de l'objet 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;
}

Via un drapeau

Ce qui suit est une maquette de la façon dont vous le feriez avec un indicateur en tant que propriété de classe:

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();
2
Johannes Pille