it-swarm.com.de

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

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. Im aktuellen Code befindet sich add_action in einer anderen Funktion derselben Klasse. Das funktioniert gut.

15
Jason

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 eine Beispielklasse zum Demonstrieren:

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

29
jonathanbardo

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

Verwendungszweck:

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

Der Hinweis wird einmal angezeigt.

10
DarkNeuron

Zusätzlich zu @ jonathanbardos Antwort, die großartig ist und gut funktioniert, können Sie den removable_query_args -Filter verwenden, wenn Sie das Abfrageargument entfernen möchten, nachdem die neue Seite geladen wurde. 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;
}

So etwas wie:

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

Wird werden:

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

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

Verwendungszweck

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 Sie den Administratorhinweis verwenden möchten, normalerweise im Hook admin_notices.

$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>';
}
0
Fleuv