Comment gérer au mieux les actions de page de plugin personnalisées?

21

Je suis constamment confronté au même ennui, alors je pensais voir s'il y avait des idées ou de l'expérience dans le monde ...

J'ai créé un plugin qui utilise sa propre page d'administration. Il doit. Maintenant que j’ai réglé le problème WP_List_Table (), je dois dire que c’est génial ... mais ....

Les pages de plug-in personnalisées se chargent toujours en tant que admin.php?page=... sauf si je veux les charger directement du répertoire du plug-in, ce que je ne fais pas. Maintenant, si je fais une 'action' à partir de cette page, j'ai besoin de la traiter d'une manière ou d'une autre, puis de la rediriger vers la page sans le paramètre d'action. Peu importe si je fais un GET ou un post, vraiment.

Sur toutes ses pages internes, WP fait la même chose sur la même page, il vérifie s’il ya une action, le cas échéant, puis la redirige vers elle-même sans action. Ceci est possible car sur ces pages le admin-header n'a pas encore été chargé.

Si vous essayez de le faire sur votre propre page, la moitié de l'interface d'administration a déjà été envoyée au navigateur. Une redirection n'est donc plus possible. Clairement, la solution consiste à POST / GET directement sur une autre page, à charger le framework WP, à effectuer le traitement, puis à rediriger vers la page d'origine ... mais ... c'est un peu ennuyeux, car ... mon original page est chargée via un rappel, elle est donc exécutée dans une méthode de ma classe. C'est beau.

Si je charge une page distincte, je dois inclure manuellement wp-load.php et je suis en dehors de ma classe, ce qui est gênant et, dans mon cas particulier, me perturbe particulièrement, car je n'instancie anonymement ma classe de plug-in de sorte que personne ne peut y accéder de l'extérieur.

Donc, après cette longue histoire ... quelqu'un a-t-il trouvé une bonne solution pour charger une autre page via un rappel sans que l'interface d'administration ne soit déjà configurée?

(Je connais une solution de contournement ... Je peux raccorder une fonction à load-.... qui vérifie le paramètre action, effectue le traitement et la redirection. Mais je me demande s’il existe un meilleur moyen.)

Merci.

    
posée wyrfel 26.02.2011 - 01:44

3 réponses

28

En règle générale, vous devez utiliser une requête POST pour la plupart des actions, afin de vous assurer qu'elles ne sont pas exécuté par accident . Cependant, il est également recommandé de rediriger les utilisateurs vers une page normale après une requête POST afin d'éviter toute duplication lors de l'actualisation de la page.

Donc, le flux est comme ça:

  1. Votre page de plug-in avec un formulaire POST qui soumet à
  2. Une page qui gère la demande, qui redirige vers
  3. Votre page de plug-in, qui affiche le résultat de l'action

La page du milieu ne doit pas nécessairement être votre page de plugin. Cela signifie que vous pouvez utiliser le "gestionnaire POST générique" inclus il y a trois ans, the 'admin_action_' . $_REQUEST['action'] hook dans admin.php .

Un exemple d'utilisateur est le plug-in Akismet . Si vous souhaitez l'utiliser de manière fiable, vous devez soumettre à admin.php directement et non à une autre page contenant admin.php .

Voici un exemple très basique d'utilisation:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
    
réponse donnée Jan Fabry 28.02.2011 - 22:08
3

J'ai abordé cette question légèrement différemment en ajoutant simplement noheader = true à l'URL de l'action sur la page où l'utilisateur soumet cette action.

Mon gestionnaire exécute ensuite l'action (c'est-à-dire généralement une opération d'ajout, de mise à jour ou de suppression), puis se termine par une action wp_redirect () vers la page suivante (par exemple, ajouter une page - > éditer une page, supprimer une page - > liste page - > modifier la page). Je passe également un message sur l'URL afin de pouvoir afficher un statut tel qu'une mise à jour réussie ou échouée.

Cette approche conserve toutes les actions: lister, ajouter, éditer, supprimer, supprimer en bloc, etc. dans la même classe et avec le même slug d’administrateur, ce qui en facilite la maintenance et la compréhension.

    
réponse donnée Russell Jamieson 29.08.2011 - 14:22
0

Une autre approche différente consiste simplement à ajouter un champ de saisie masqué au formulaire:

<input type="hidden" name="page" value="your-page-slug" />

De cette façon, WordPress semble gérer la redirection automatiquement.

    
réponse donnée simonthesorcerer 16.01.2015 - 17:02

Lire d'autres questions sur les étiquettes