Come aggiungere un avviso di amministratore dopo il salvataggio / aggiornamento post


16

Ho un tipo di post che utilizza post_save per prendere l'indirizzo dal post-meta e recuperare le coordinate lat / lng dall'API di Google. Ho bisogno di un modo per avvisare l'utente se si è verificato un problema con il recupero dei coordintes. Ho provato a usare admin_notices, ma non è stato visualizzato nulla:

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'));

Non sono sicuro se lo sto usando in modo errato o nel contesto sbagliato. Per essere chiari, nel codice effettivo add_action si trova in un'altra funzione della stessa classe. Funziona benissimo.


Ho sviluppato uno script che ti consente di aggiungere facilmente notifiche di amministrazione statiche / non consentite github.com/askupasoftware/wp-admin-notification
Yoav Kadosh,

Risposte:


30

Il motivo per cui non funziona è perché si verifica un reindirizzamento dopo l'azione save_post. Un modo in cui puoi ottenere ciò che desideri è implementando una rapida soluzione utilizzando query var.

Ecco una classe di esempio per dimostrare:

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

Spero che questo ti aiuti un po '. Saluti


Funziona benissimo, grazie! Ma c'è una parentesi di chiusura mancante nella prima riga della public function admin_notices()(una parentesi di chiusura extra nella if ( ! isset(..riga)
Rhys Wynne,

Ho aggiunto remove_query_arg('YOUR_QUERY_VAR');come ho scoperto che può essere impostato dall'ultimo aggiornamento.
Tony O'Hagan,

+1 buona risposta.
Segna il

12

Crea una classe wrapper per questo tipo di scenario. In realtà la classe può essere utilizzata in qualsiasi scenario che comporta la visualizzazione di avvisi. Uso gli standard PSR, quindi la denominazione è atipica del codice Wordpress.

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

Uso:

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

L'avviso viene visualizzato una volta.


6

Oltre alla risposta di @ jonathanbardo che è eccezionale e funziona bene, se si desidera rimuovere l'argomento della query dopo aver caricato la nuova pagina, è possibile utilizzare il filtro removibile_query_args . Ottieni una matrice di nomi di argomenti a cui puoi aggiungere il tuo argomento. Quindi WP si occuperà di rimuovere tutti gli argomenti nell'elenco dall'URL.

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

Qualcosa di simile a:

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

Diventerà:

'...post.php?post=1'

1

Semplice, elegante, basato su 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;
}

uso

Nel gestore della tua richiesta di posta:

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

Dove si desidera utilizzare l'avviso di amministratore, di solito in modalità admin_noticeshook.

$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>';
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.