web-dev-qa-db-fra.com

Comment appeler des fonctions WordPress à partir d'un script de traitement de formulaire

Je travaille sur un plugin qui soumet des données via un formulaire à partir d'une page d'administration personnalisée. Ceci est une version simplifiée de mon formulaire:

<form action="<?php echo plugin_dir_path(); ?>/process.php" method="post">
    <input type="text" name="keyName">
    <input type="submit" value="Update">
</form>

Le formulaire est à l'intérieur de mon fichier php principal pour le plugin, il a donc accès à toutes les fonctions WordPress comme le plugin_dir_path () que j'ai appelé ci-dessus.

Cependant, lorsque l'utilisateur clique sur le bouton "submit" et que la variable $ _POST est soumise au script "process.php", je perds l'accès à toutes les fonctions WordPress de ce script de processus.

J'ai cherché comment ajouter des fonctions WordPress dans des scripts externes et j'ai vu cette question: Comment appeler les fonctions principales de WordPress dans des scripts externes?

La réponse fournie est que j'inclus cette ligne de code en haut de mon script de traitement:

require_once("wp-load.php");

Cependant, lorsque je fais le "wp-load.php" est ajouté à la fin de l'URL en cours qui entraîne une erreur de type 404. Je ne peux pas utiliser la fonction "get_site_directory ()" pour désigner le répertoire d'installation principal de WordPress, car il s'agit d'une fonction WordPress.

Comment puis-je faire ce travail? Existe-t-il un crochet d’action que je devrais utiliser pour soumettre le formulaire par rapport à mon propre bouton de soumission personnalisé?

2
YAHsaves

Vous ne devriez jamais rien envoyer aux fichiers de plugins directement. C'est presque toujours une faille de sécurité qui empêche le propriétaire du site de renforcer correctement le site (dans une situation idéale, aucune demande de fichiers PHP à l'intérieur de wp-content ne devrait être nécessaire).

La bonne pratique consiste à utiliser admin_post actions ... (similaire à admin_ajax).

Donc, votre formulaire devrait ressembler à ceci:

<form action="<?php echo esc_attr('admin-post.php'); ?>" method="post">
    <input type="hidden" name="action" value="my_action" />
    <input type="text" name="keyName">
    <input type="submit" value="Update">
</form>

Et puis dans votre plugin, vous ajoutez votre méthode d'action:

add_action( 'admin_post_my_action', 'prefix_admin_my_action' );
add_action( 'admin_post_nopriv_my_action', 'prefix_admin_add_foobar' );

function prefix_admin_my_action() {
    // Handle request then generate response using echo or leaving PHP and using HTML
}

PS C'est toujours une bonne idée d'inclure des nonces dans cette forme aussi.

5
Krzysiek Dróżdż