Cómo agregar un aviso de administrador después de guardar / actualizar

14

Tengo un tipo de publicación que usa post_save para tomar la dirección de post-meta y recuperar las coordenadas de lat / lng de la API de Google. Necesito una forma de notificar al usuario si hubo un problema con la recuperación de los coordinados. Intenté usar admin_notices, pero no se muestra nada:

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

No estoy seguro de si lo estoy usando incorrectamente o en el contexto incorrecto. Para que quede claro, en el código real el add_action está en otra función en la misma clase. Eso está funcionando bien.

    
pregunta Jason 27.06.2014 - 18:37

3 respuestas

26

La razón por la que esto no funciona es porque se está produciendo una redirección después de la acción save_post. Una forma en la que puede lograr lo que desea es implementando un método rápido para evitar el uso de las barras de consulta.

Aquí hay una clase de muestra para demostrar:

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 esto te ayude un poco. Saludos

    
respondido por el jonathanbardo 27.06.2014 - 21:47
9

Hice una clase de envoltorio para este tipo de escenario. En realidad, la clase se puede utilizar en cualquier escenario que implique mostrar avisos. Yo uso los estándares de PSR, por lo que la denominación es atípica del código de 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.'));

El aviso se muestra una vez.

    
respondido por el DarkNeuron 29.03.2016 - 19:01

Lea otras preguntas en las etiquetas