it-swarm.com.de

Zwei Funktionen, die den registration_errors-Filter verwenden

Ich habe zwei Plugins geschrieben, die den registration_errors-Filter verwenden:

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

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

Wenn add_user_to_SF Fehler zurückgibt, wird die Funktion process_payment erfolgreich ausgeführt (das weiß ich, weil sie eine Zahlung verarbeitet).

Wie kann ich dies einrichten, damit der andere Fehler nicht auftritt und keine Benutzerregistrierung stattfindet, wenn einer von ihnen einen Fehler zurückgibt?

1
MF1

Fehler über Fehlercode identifizieren

Führen Sie add_user_to_SF mit einer früheren Priorität aus, damit es zuerst ausgeführt wird

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

Nehmen wir an, Sie haben zwei mögliche Fehler in Ihrem 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;
}

Überprüfen Sie dann, ob diese Fehler in der letzteren Funktion vorliegen, indem Sie die Methode $errors object's get_error_codes verwenden:

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;
}

Über eine Flagge

Das Folgende ist ein Beispiel dafür, wie Sie es mit einem Flag als Klasseneigenschaft machen würden:

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