Como adicionar um aviso de administrador após a postagem salvar / atualizar

14

Eu tenho uma postagem que usa o post_save para pegar o endereço da postagem e recuperar as coordenadas lat / lng da API do Google. Eu preciso de uma maneira de notificar o usuário se houve um problema com a recuperação dos coordintes. Eu tentei usar admin_notices, mas nada exibido:

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

Não tenho certeza se estou usando de maneira incorreta ou no contexto errado. Para ser claro, no código real o add_action está em outra função na mesma classe. Isso está funcionando bem.

    
por Jason 27.06.2014 / 18:37

3 respostas

26

A razão pela qual isso não funciona é porque existe um redirecionamento após a ação save_post. Uma maneira pela qual você pode obter o que deseja é implementando um trabalho rápido com o uso de query vars.

Aqui está uma amostra de classe para demonstrar:

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

Espero que isso ajude você um pouco. Felicidades

    
por jonathanbardo 27.06.2014 / 21:47
9

Fiz uma classe wrapper para esse tipo de cenário. Na verdade, a classe pode ser usada em qualquer cenário que envolva a exibição de avisos. Eu uso os padrões PSR, então a nomenclatura é atípica do código 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.'));

O aviso é exibido uma vez.

    
por DarkNeuron 29.03.2016 / 19:01
5

Além da resposta do @jonathanbardo, que é ótima e funciona bem, se você quiser remover o argumento da consulta depois que a nova página for carregada, você pode usar o removable_query_args . Você obtém uma matriz de nomes de argumentos para os quais você pode anexar seu próprio argumento. Então o WP se encarregará de remover todos os argumentos da lista da 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;
}

Algo como:

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

se tornará:

'...post.php?post=1'
    
por AncientRo 20.03.2017 / 22:20