Comment ajouter une notification de l'administrateur lors de l'enregistrement / de la mise à jour de la publication

14

J'ai un type de message qui utilise post_save pour extraire l'adresse de la post-méta et récupérer les coordonnées lat / lng de l'API Google. J'ai besoin d'un moyen d'avertir l'utilisateur s'il y avait un problème avec la récupération des coordonnées. J'ai essayé d'utiliser admin_notices, mais rien ne s'affiche:

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

Je ne suis pas sûr de ne pas l'utiliser correctement ou dans un contexte erroné. Pour être clair, dans le code actuel add_action est dans une autre fonction de la même classe. Cela fonctionne bien.

    
posée Jason 27.06.2014 - 18:37

3 réponses

26

Cela ne fonctionne pas parce qu’une redirection se produit après l’action save_post. Une façon de réaliser ce que vous voulez est de mettre en place un moyen rapide de contourner l’utilisation des vars de requête.

Voici un exemple de classe à démontrer:

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

J'espère que cela vous aide un peu. A la vôtre

    
réponse donnée jonathanbardo 27.06.2014 - 21:47
9

Construit une classe wrapper pour ce genre de scénario. En réalité, la classe peut être utilisée dans n'importe quel scénario impliquant l'affichage d'avis. J'utilise les normes PSR, donc la dénomination est atypique du code 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
        ]);
    }
}

Utilisation:

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

L'avis est affiché une fois.

    
réponse donnée DarkNeuron 29.03.2016 - 19:01
5

En plus de la réponse de @ jonathanbardo qui est excellente et qui fonctionne bien, si vous souhaitez supprimer l’argument de la requête une fois la nouvelle page chargée, vous pouvez utiliser le amovible_query_args . Vous obtenez un tableau de noms d'arguments auquel vous pouvez ajouter votre propre argument. Ensuite, WP se chargera de supprimer tous les arguments de la liste de l'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;
}

Quelque chose comme:

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

deviendra:

'...post.php?post=1'
    
réponse donnée AncientRo 20.03.2017 - 22:20

Lire d'autres questions sur les étiquettes