web-dev-qa-db-fra.com

Comment créer un message admin_notices qui disparaît une fois que l'utilisateur a quitté cette page particulière?

C'est assez facile de trouver de l'aide avec admin_notices qui:

  • afficher en permanence dans l'écran d'administration
  • afficher uniquement lorsqu'un type de page particulier est affiché
  • afficher jusqu'à ce que l'utilisateur le rejette

Mais je ne peux pas trouver d'aide pour créer un message indiquant que l'utilisateur n'a pas quitté cette page. c'est à dire. exactement ce que WordPress montre régulièrement avec son message Post updated. View post..

enter image description here

Vous ne voyez ce message que jusqu'à ce que vous décidiez de passer à autre chose, vous ne le revoyez plus et vous n'avez pas à le rejeter activement.

Voici ce que nous avons eu jusqu’à présent (cela crée un message permanent, c’est évidemment loin du message discret que nous recherchons):

function my_admin_notice() {
?>
<div class="updated">
    <p><?php _e( 'Updated!', 'my-text-domain' ); ?></p>
</div>
<?php
}
add_action( 'admin_notices', 'my_admin_notice' );
4
hawbsl

La réponse courte est: Utiliser des chaînes de requête.

Si vous remarquez dans la barre d'adresse immédiatement après avoir publié une publication ... vous verrez quelque chose de similaire à ceci: domain.com/wp-admin/post.php?post=4935&action=edit&message=6

Il y a quelques variables de requête différentes:

  1. post contient l'ID du message en cours de modification.
  2. action indique que nous sommes en train de "modifier" la publication.
  3. message fait référence à quel avis de l'administrateur doit être affiché en fonction de ce qui a été fait à la poste.

Regardez ici pour obtenir un exemple d'affichage des messages de type de message par défaut et de la personnalisation des messages (notifications de l'administrateur/k/a) spécifiquement pour votre type de message personnalisé.

L'exemple ci-dessus est relatif à un type de message personnalisé et WordPress gère toutes les conditions pour vous. Tout ce que vous avez à faire est de personnaliser les messages.

Si vous vouliez le faire sur une page de paramètres personnalisés pour votre plugin, par exemple. Plusieurs étapes sont nécessaires pour accomplir la même chose.

Dans un écrou Shell:

Envoyez l'utilisateur à votre page de paramètres personnalisés AVEC une variable de requête supplémentaire ajoutée à l'URL.

Accrocher dans admin_notices .

Dans la fonction de rappel que vous spécifiez pour le hook admin_notices, vous avez un tableau de messages dans lequel la clé de tableau correspond à la valeur de votre variable de requête et la valeur du tableau correspond au message approprié.

Vérifiez si votre variable de requête est présente. (Assurez-vous de vérifier que l'utilisateur se trouve spécifiquement sur la page de configuration de votre plugin en utilisant: get_current_screen(); - sinon, vous effectuerez une vérification globale sur toutes les pages d'administration.)

Effectuez des vérifications conditionnelles supplémentaires pour les différentes valeurs possibles de votre variable de requête et affichez la notification de l'administrateur appropriée en fonction de la valeur de votre variable de requête.

Donc en gros:

  • Vérifiez si l'utilisateur est sur la page des paramètres de votre plugin.
  • Vérifiez si votre variable de requête est présente.
  • Vérifiez si la valeur de votre variable de requête correspond à celle attendue.
  • Sélectionnez le message approprié en fonction de la valeur attendue de votre variable de requête avec une clé de tableau dans le tableau de messages.
  • Affiche l'avis de l'administrateur avec le message correspondant à la clé de groupe de messages.
6
Michael Ecklund

Cette réponse suppose que vous souhaitiez le faire sur un écran de post-édition.

Explication:

Fondamentalement, vous avez besoin de certaines conditions:

  1. Pour adresser un écran d'administration spécifique:

  2. Pour afficher uniquement le message jusqu'à ce que la page spécifique soit laissée:

De plus, bien sûr, utilisation du admin_notices hook. Et - pour l'exemple ci-dessous - le save_post hook.

Exemple:

function wpse183752_the_admin_notice() {
    // get screen information
    $screen = get_current_screen();
    // screen condition    
    // TODO: change to the screen you want to address
    if ( $screen->id != 'post' ) {
        return;
    }
    // query variable condition
    if ( ! isset( $_GET[ 'the_message' ] ) || $_GET[ 'the_message' ] != 'show' ) {
        return;
    }
    ?>
    <div class="updated">
        <p>
            <?php _e( 'The Message', 'the-text-domain' ); ?>
        </p>
    </div>
    <?php
}
add_action( 'admin_notices', 'wpse183752_the_admin_notice' );

function wpse183752_the_message( $old_query_string ) {
    // add the new query variable
    $new_query_string = add_query_arg( 'the_message', 'show', $old_query_string );
    // return the new query string
    return $new_query_string;
}

function wpse183752_set_message_variable() {
    // usage of wpse183752_the_message() callback with redirect_post_location
    // to setup the query variable on a hook, here save_post
    add_filter( 'redirect_post_location', 'wpse183752_the_message' );
}
// TODO: change to the hook you need
add_action( 'save_post', 'wpse183752_set_message_variable' );

Remarque:

L'exemple ci-dessus est à peu près générique. Il s’adresse à l’écran de post-édition du type de post intégré. Vous devez modifier certaines choses pour que cela fonctionne pour vous, voir l'exemple ci-dessus. Comme vous vous-même vous voulez probablement vous adresser à publish_mycpt, qui est un type de hook {status}_{post_type}, voir Codex: Transitions post-statut pour plus d'informations.

2
Nicolai

Je ne suis pas tout à fait sûr de comprendre ce que vous faites, mais serait-il possible d'ajouter une option (add_option) lors de la publication du CPT, puis de vérifier l'existence de cette option et, le cas échéant, d'afficher la notification. Dans la fonction, vous devez afficher la notification, vous pouvez également supprimer l'option permettant de l'arrêter à nouveau.

Vous pouvez également ajouter une méta utilisateur et la supprimer lorsque la notification est affichée - meilleure option si vous ne ciblez qu'un seul utilisateur.

0
Mike