So fügen Sie nach dem Speichern / Aktualisieren einen Administratorhinweis hinzu

16

Ich habe einen Post-Typ, der post_save verwendet, um die Adresse aus dem Post-Meta zu entnehmen und die Lat / Lng-Koordinaten von der Google-API abzurufen. Ich muss den Benutzer benachrichtigen, wenn beim Abrufen der Koordinaten ein Problem aufgetreten ist. Ich habe versucht, admin_notices zu verwenden, aber nichts angezeigt:

public static function update_notice() {
  echo "<div class='error'><p>Failed to retrieve coordinates. Please check key and address.<p></div>";
  remove_action('admin_notices', 'update_notice');
}

add_action('admin_notices', array('GeoPost', 'update_notice'));

Ich bin nicht sicher, ob ich es falsch oder im falschen Kontext verwende. Um klar zu sein, befindet sich die add_action im aktuellen Code in einer anderen Funktion in derselben Klasse. Das funktioniert gut.

Jason
quelle
Ich habe ein Skript entwickelt, mit dem Sie einfach Benachrichtigungen für unzulässige
Yoav Kadosh

Antworten:

30

Der Grund, warum dies nicht funktioniert, ist, dass nach der Aktion save_post eine Umleitung stattfindet. Eine Möglichkeit, wie Sie die gewünschten Ergebnisse erzielen können, besteht darin, eine schnelle Problemumgehung mithilfe von Abfragevariablen zu implementieren.

Hier ist ein Beispiel für eine Demonstrationsklasse:

class My_Awesome_Plugin {
  public function __construct(){
   add_action( 'save_post', array( $this, 'save_post' ) );
   add_action( 'admin_notices', array( $this, 'admin_notices' ) );
  }

  public function save_post( $post_id, $post, $update ) {
   // Do you stuff here
   // ...

   // Add your query var if the coordinates are not retreive correctly.
   add_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
  }

  public function add_notice_query_var( $location ) {
   remove_filter( 'redirect_post_location', array( $this, 'add_notice_query_var' ), 99 );
   return add_query_arg( array( 'YOUR_QUERY_VAR' => 'ID' ), $location );
  }

  public function admin_notices() {
   if ( ! isset( $_GET['YOUR_QUERY_VAR'] ) ) {
     return;
   }
   ?>
   <div class="updated">
      <p><?php esc_html_e( 'YOUR MESSAGE', 'text-domain' ); ?></p>
   </div>
   <?php
  }
}

Hoffe das hilft dir ein bisschen. Prost

jonathanbardo
quelle
Funktioniert super, danke! Aber es gibt eine fehlende schließende Klammer in der ersten Zeile in der public function admin_notices()(eine zusätzliche schließende Klammer in der if ( ! isset(..Zeile)
Rhys Wynne
Ich habe hinzugefügt, remove_query_arg('YOUR_QUERY_VAR');wie ich fand, dass es vom letzten Update eingestellt werden kann.
Tony O'Hagan
+1 Gute Antwort.
Mark
12

Erstellt eine Wrapper-Klasse für diese Art von Szenario. Tatsächlich kann die Klasse in jedem Szenario verwendet werden, in dem Benachrichtigungen angezeigt werden. Ich verwende die PSR-Standards, daher ist die Benennung für Wordpress-Code untypisch.

class AdminNotice
{
    const NOTICE_FIELD = 'my_admin_notice_message';

    public function displayAdminNotice()
    {
        $option      = get_option(self::NOTICE_FIELD);
        $message     = isset($option['message']) ? $option['message'] : false;
        $noticeLevel = ! empty($option['notice-level']) ? $option['notice-level'] : 'notice-error';

        if ($message) {
            echo "<div class='notice {$noticeLevel} is-dismissible'><p>{$message}</p></div>";
            delete_option(self::NOTICE_FIELD);
        }
    }

    public static function displayError($message)
    {
        self::updateOption($message, 'notice-error');
    }

    public static function displayWarning($message)
    {
        self::updateOption($message, 'notice-warning');
    }

    public static function displayInfo($message)
    {
        self::updateOption($message, 'notice-info');
    }

    public static function displaySuccess($message)
    {
        self::updateOption($message, 'notice-success');
    }

    protected static function updateOption($message, $noticeLevel) {
        update_option(self::NOTICE_FIELD, [
            'message' => $message,
            'notice-level' => $noticeLevel
        ]);
    }
}

Verwendung:

add_action('admin_notices', [new AdminNotice(), 'displayAdminNotice']);
AdminNotice::displayError(__('An error occurred, check logs.'));

Der Hinweis wird einmal angezeigt.

DarkNeuron
quelle
6

Neben @ jonathanbardo Antwort , die auch große und Funktionen ist, wenn Sie die Abfrage Argument , nachdem die neue Seite geladen wird entfernen möchten, können Sie das verwenden removable_query_args Filter. Sie erhalten eine Reihe von Argumentnamen, an die Sie Ihr eigenes Argument anhängen können. Dann kümmert sich WP darum, alle Argumente in der Liste aus der URL zu entfernen.

public function __construct() {
    ...
    add_filter('removable_query_args', array($this, 'add_removable_arg'));
}

public function add_removable_arg($args) {
    array_push($args, 'my-query-arg');
    return $args;
}

Etwas wie:

'...post.php?post=1&my-query-arg=10'

Wird werden:

'...post.php?post=1'
AncientRo
quelle
1

Einfach, elegant, basierend auf get_settings_errors().

function wpse152033_set_admin_notice($id, $message, $status = 'success') {
    set_transient('wpse152033' . '_' . $id, [
        'message' => $message,
        'status' => $status
    ], 30);
}

function wpse152033_get_admin_notice($id) {
    $transient = get_transient( 'wpse152033' . '_' . $id );
    if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && $transient ) {
        delete_transient( 'wpse152033' . '_' . $id );
    }
    return $transient;
}

Verwendung

In Ihrem Post-Request-Handler:

wpse152033_set_admin_notice(get_current_user_id(), 'Hello world', 'error');
wp_redirect(add_query_arg('settings-updated', 'true',  wp_get_referer()));

Wo möchten Sie den Admin-Hinweis verwenden, in der Regel in den admin_noticesHaken.

$notice = $this->get_admin_notice(get_current_user_id());
if (!empty($notice) && is_array($notice)) {
    $status = array_key_exists('status', $notice) ? $notice['status'] : 'success';
    $message = array_key_exists('message', $notice) ? $notice['message'] : '';
    print '<div class="notice notice-'.$status.' is-dismissible">'.$message.'</div>';
}
Fleuv
quelle