web-dev-qa-db-de.com

Wie kann ich nach dem Aktualisieren der Plugin-Einstellungen einen Administrator-Hinweis anzeigen?

Ich habe ein Plugin mit einer Einstellungsseite und es gibt einige Aktionen, die ausgeführt werden müssen, wenn eine bestimmte Option gespeichert wird. Ich benutze den pre_update_option_-Haken, um dies zu tun. So weit, ist es gut. Wenn jedoch etwas schief geht, muss ich dies auch dem Benutzer mitteilen. Ich habe diese Dinge ausprobiert:

1) Füge einen Hook zu admin_notices hinzu, bevor du den Code aktualisierst

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) add_action('admin_notices', 'my_notification_function' )
    return ($valid)? $new_value : $old_value;
});

Die Validierung funktioniert, aber die Benachrichtigung wird nicht angezeigt, da bis dahin die mit admin_notices verknüpften Funktionen bereits ausgeführt wurden.

2) Validierung in der mit admin_notices verknüpften Funktion Um das oben genannte Problem zu lösen, hatte ich diese Idee.

add_action('admin_notices', function () {

      //Do my validation
      $valid = ( 'correct_value' == $_POST['my_var'] );
      if (!$valid) { /* Display error message */ }
      //Store the value of $valid
});

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //fetch the value of $valid which I stored 
    return ($valid)? $new_value : $old_value;
});

Nun, das scheint gut zu funktionieren, ich sehe die Benachrichtigung jetzt. Das Problem ist, dass ich aus irgendeinem seltsamen Grund die angegebenen Werte nicht sehe. Ich habe versucht, $_POST zu drucken und es ist immer leer! Vermutlich übergibt WordPress die Werte auf eine andere Weise? Wenn das so ist, wie?

Welcher ist der richtige Weg und wie kann ich das Problem beheben? Natürlich ist es willkommen, wenn eine andere Methode besser ist als diese beiden und das Problem löst.

4
DavidTonarini

Nachdem ich in der Einstellungs-API gebuddelt hatte, fand ich die Antwort. Methode 1 war korrekt, aber die Benachrichtigung sollte nicht durch Verknüpfen mit admin_notices erfolgen, sondern durch die Funktion add_settings_error

add_action ('pre_update_option_my_var', function( $new_value, $old_value) {
    //Do my validation
    $valid = ( 'correct_value' == $new_value );

    if ( !$valid ) {
         //This fixes the issue
         add_settings_error( 'my_var', $error_code, $message );
    }
    return ($valid)? $new_value : $old_value;
});

Um sie anzuzeigen, muss dies auch am Anfang der Einstellungsseite hinzugefügt werden:

<h2>The heading of my settings page</h2>
<?php settings_errors(); ?>
3
DavidTonarini

Nein, du machst es falsch. add_action muss sich in __construct() Ihres Plugin-Objekts befinden. Hier ist der Auszug aus meinem kleinen Plugin WOOF nach Kategorie , Sie können den gesamten Code von wordpress.org herunterladen:

public function __construct() {
    //...
    add_action( 'admin_notices', array( $this, 'wbc_plugin_not_found' ) );
    //...
}

In meinem Code überprüfe ich eine Bedingung (Validierung - in Ihrem Fall) und gebe das Ergebnis über wbc_requirements_met() zurück. Wenn das Ergebnis falsch ist, füge ich eine Benachrichtigung mit wbc_admin_message hinzu.

public function wbc_plugin_not_found() {
    if ( $this->wbc_requirements_met() ) {
        return;
    }

    $message = __( 'WOOF by Category plugin requires the following plugins installed and activated: ', 'woof-by-category' );
    //...
    $this->wbc_admin_message( $message, 'error notice is-dismissible' );
    }

private function wbc_admin_message( $message, $class ) {
    ?>
    <div class="<?php echo esc_attr( $class ); ?>">
        <p>
            <span style="display: block; margin: 0.5em 0.5em 0 0; clear: both;">
            <?php echo wp_kses( $message, wp_kses_allowed_html( 'post' ) ); ?>
            </span>
        </p>
    </div>
    <?php
}
1
KAGG Design

Ich bin vor ein paar Monaten dieser gleichen Herausforderung begegnet. Ich musste Administratorbenachrichtigungen basierend auf bestimmten Überprüfungen anzeigen, die ich mit einigen benutzerdefinierten Feldern in einem benutzerdefinierten Beitragstyp hatte.

Da sich meine Überprüfung in einem pre_save-Hook befand, besteht das Problem darin, dass der Browser nach dem Auslösen dieses Hooks aktualisiert wird.

Also habe ich eine Klasse von John Oleksowicz gefunden, die im Grunde genommen die Administratorbenachrichtigungen in der Optionstabelle speichert und sie löscht, wenn sie nicht benötigt werden.

Es heißt: Easy WordPress Admin Notifications

Die Klasse ist ziemlich einfach und Sie können einfach das Plugin verwenden. In meinem Fall habe ich die Klasse verwendet und angepasst, indem ich die Art und Weise geändert habe, wie die Funktionen für Verwaltungsnachrichten aufgerufen werden.

Nun, wann immer ich eine Administratorbenachrichtigung auslösen muss, mache ich Folgendes:

planner_notices_add_error( $message );
1
Armando Duran

Wir haben eine kleine Bibliothek für Wordpress-Administratorbenachrichtigungen geschrieben: https://gitlab.com/wpdesk/wp-notice

Das Anzeigen des Administrationshinweises ist jetzt so einfach wie das Erstellen eines neuen Objekts:

$notice = new \WPDesk\Notice\Notice( 'info', 'Notice text goes here' );

0
Grzegorz Rola