web-dev-qa-db-fra.com

Comment ajouter un avis d'administrateur après l'enregistrement/la mise à jour

J'ai une publication tapez les utilisations post_save pour prendre 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.

15
Jason

Cela ne fonctionne pas parce qu’une redirection se produit après l’action save_post. Une façon dont vous pouvez obtenir ce que vous voulez consiste à 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. À votre santé

29
jonathanbardo

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

Usage:

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

La notice est affichée une fois.

10
DarkNeuron

En plus de la réponse de @ jonathanbardo qui est excellente et fonctionne bien, si vous souhaitez supprimer l’argument de la requête une fois la nouvelle page chargée, vous pouvez utiliser le filtre 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'

Va devenir:

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

Simple, élégant, basé sur 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;
}

Usage

Dans votre gestionnaire de demande de publication:

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

Où vous voulez utiliser la notification admin, généralement dans le 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