Je développe une partie Forum sur un site Wordpress et avant la soumission du formulaire de question, l'utilisateur a le choix de se connecter ou non.
S'il clique sur le lien "Connectez-vous", il est redirigé vers la page de connexion.
Les données du formulaire sont stockées dans un cookie et une fois connecté, il se retrouve à nouveau sur le formulaire et n'a plus qu'a poster sa question.
Le problème c'est qu'il ne peut pas poster car la vérification du nonce échoue (après avoir testé avec plusieurs navigateurs sans extension de cache Wordpress et vidage du cache des navigateurs) :
Dans le fichier log :
[15-Sep-2023 16:05:24 UTC] Échec de la vérification du nonce
[15-Sep-2023 16:05:24 UTC] Nonce soumis: e7dd5abbe4
[15-Sep-2023 16:05:24 UTC] Nonce attendu: b0911380a5
[15-Sep-2023 16:05:24 UTC] ID utilisateur: 1
[15-Sep-2023 16:05:24 UTC] URL actuelle: http://informatic
[15-Sep-2023 16:05:24 UTC] Agent utilisateur: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 OPR/101.0.0.0
[15-Sep-2023 16:05:24 UTC] Âge du nonce: plus de 12 heures mais moins de 24 heures
[15-Sep-2023 16:05:24 UTC] Heure actuelle: 2023-09-15 18:05:24
[15-Sep-2023 16:05:24 UTC] Date/heure de création du nonce: 2023-09-15 18:03:30
(je précise que c'est en local avec Wampserver)
Mon formualire :
<?php
/*
* Template Name: Template Question Forum
* Template Post Type: page
*/
get_header();
?>
<div class="section pt-3 pb-5">
<div class="container p-0">
<h2 class="heading ps-0 border-bottom border-dark mb-5">Posez votre question sur le forum</h2>
<div class="row justify-content-center">
<div class="col-lg-6">
<?php
if (is_user_logged_in()) {
$current_user = wp_get_current_user();
echo '<div class="mb-3">Bonjour <strong>' . esc_html($current_user->display_name) . '</strong> vous pouvez poser votre question.</div>';
} else {
echo '<div class="mb-3">Bienvenue, visiteur!</div>';
}
?>
<form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post">
<input placeholder="Titre de la question" class="form-control mb-3 rounded-3" type="text" name="question_title" value="<?php echo isset($_SESSION['saved_form_data']['question_title']) ? esc_attr($_SESSION['saved_form_data']['question_title']) : ''; ?>" required>
<?php
$content = isset($_SESSION['saved_form_data']['question_content']) ? stripslashes($_SESSION['saved_form_data']['question_content']) : '';
$editor_id = 'question_content'; // ID pour l'éditeur
$settings = array(
'textarea_name' => 'question_content',
'media_buttons' => false,
'quicktags' => false,
'textarea_rows' => 10,
'tinymce' => array(
'theme_advanced_buttons1' => 'bold,italic,underline,|,bullist,numlist',
'theme_advanced_buttons2' => '',
'theme_advanced_buttons3' => '',
'theme_advanced_buttons4' => '',
'init_instance_callback' => 'function (editor) {
editor.getBody().setAttribute("data-placeholder", "Votre question détaillée ici...");
}'
)
);
wp_editor($content, $editor_id, $settings);
?>
<input placeholder="Votre pseudo" class="form-control mb-3 rounded-3 mt-3" type="text" name="user_pseudo" value="<?php echo isset($_SESSION['saved_form_data']['user_pseudo']) ? esc_attr($_SESSION['saved_form_data']['user_pseudo']) : ''; ?>" required>
<input placeholder="Votre e-mail" class="form-control mb-3 rounded-3" type="email" name="user_email" value="<?php echo isset($_SESSION['saved_form_data']['user_email']) ? esc_attr($_SESSION['saved_form_data']['user_email']) : ''; ?>" required>
<?php if (!is_user_logged_in()) : ?>
<p>
Vous souhaitez suivre les réponses à votre question ?
<a id="login-link" href="<?php echo wp_login_url(get_permalink()); ?>">Connectez-vous</a>
ou
<a id="register-link" href="<?php echo wp_registration_url(); ?>">enregistrez-vous</a> maintenant.
</p>
<?php endif; ?>
<?php $nonce = wp_create_nonce('post_question_nonce');
// Affiche le champ nonce
echo '<input type="hidden" name="question_nonce_field" value="' . esc_attr($nonce) . '">';
// Affiche un champ caché pour la date et l'heure actuelles
$current_time = current_time('mysql');
echo '<input type="hidden" name="nonce_creation_time" value="' . esc_attr($current_time) . '">'; ?>
<?php wp_nonce_field('post_question_nonce', 'question_nonce_field'); ?>
<!-- Pour test -->
<?php echo 'Le nonce du formulaire est : ' . wp_create_nonce('post_question_nonce'); ?>
<input type="hidden" name="action" value="post_question">
<input class="btnArticleContact mt-3" type="submit" value="Poser la question">
</form>
<?php unset($_SESSION['saved_form_data']); ?>
</div>
</div>
</div>
</div>
<?php
get_footer();
?>
Dans mon fuctions.php :
add_filter('nonce_life', function() {
return 24 * HOUR_IN_SECONDS;
});
add_action('admin_post_post_question', 'handle_post_question');
add_action('admin_post_nopriv_post_question', 'handle_post_question'); // Ceci permet aux utilisateurs non connectés de soumettre le formulaire
function handle_post_question()
{
global $wp;
// Vérification du nonce
$nonce = $_POST['question_nonce_field'];
$action = 'post_question_nonce';
$nonce_creation_time = isset($_POST['nonce_creation_time']) ? $_POST['nonce_creation_time'] : 'N/A';
if (!wp_verify_nonce($nonce, $action)) {
error_log("Échec de la vérification du nonce");
error_log("Nonce soumis: " . $nonce);
error_log("Nonce attendu: " . wp_create_nonce($action));
$current_user_id = get_current_user_id();
error_log("ID utilisateur: " . $current_user_id);
$current_url = home_url(add_query_arg(array(), $wp->request));
error_log("URL actuelle: " . $current_url);
$user_agent = $_SERVER['HTTP_USER_AGENT'];
error_log("Agent utilisateur: " . $user_agent);
$nonce_age = wp_verify_nonce($nonce, $action) ? "moins de 12 heures" : "plus de 12 heures mais moins de 24 heures";
error_log("Âge du nonce: " . $nonce_age);
$current_time = current_time('mysql');
error_log("Heure actuelle: " . $current_time);
error_log("Date/heure de création du nonce: " . $nonce_creation_time);
return; // Si le nonce n'est pas valide, on arrête l'exécution ici
}
$question_title = sanitize_text_field($_POST['question_title']);
$question_content = sanitize_textarea_field($_POST['question_content']);
$user_pseudo = isset($_POST['user_pseudo']) ? sanitize_text_field($_POST['user_pseudo']) : '';
$user_email = isset($_POST['user_email']) ? sanitize_email($_POST['user_email']) : '';
// Si l'utilisateur est connecté, on utilise son ID sinon rien
$post_author_id = is_user_logged_in() ? get_current_user_id() : '';
$question_post = array(
'post_title' => $question_title,
'post_content' => $question_content,
'post_status' => 'publish',
'post_type' => 'question',
'post_author' => $post_author_id,
);
// Insértion de la question en tant que nouveau post
$post_id = wp_insert_post($question_post);
// Après avoir créé le post, ajout des métadonnées du pseudo et de l'e-mail
if ($user_pseudo) {
update_post_meta($post_id, 'user_pseudo', $user_pseudo);
}
if ($user_email) {
update_post_meta($post_id, 'user_email', $user_email);
}
// Redirige l'utilisateur vers la page de la question après la soumission
if (!is_wp_error($post_id)) {
wp_redirect(get_permalink($post_id));
exit;
} else {
error_log("Erreur lors de l'insertion du post : " . $post_id->get_error_message());
}
}
/* POUR LE USER CONNECTE */
add_action('wp_login', 'handle_post_login_form_submission', 10, 2);
function handle_post_login_form_submission($user_login, $user)
{
// Vérifie si des données de formulaire sont stockées dans la session
if (!session_id()) session_start();
if (isset($_SESSION['saved_form_data'])) {
// Récupére les données du formulaire stockées
$data = $_SESSION['saved_form_data'];
// Crée un nouveau post avec ces données
$question_post = array(
'post_title' => $data['question_title'],
'post_content' => $data['question_content'],
'post_status' => 'publish',
'post_type' => 'question',
'post_author' => $user->ID,
);
$post_id = wp_insert_post($question_post);
if ($post_id && !is_wp_error($post_id)) {
// Ajoute les métadonnées si elles sont présentes
if (isset($data['user_pseudo'])) {
update_post_meta($post_id, 'user_pseudo', $data['user_pseudo']);
}
if (isset($data['user_email'])) {
update_post_meta($post_id, 'user_email', $data['user_email']);
}
// Redirige l'utilisateur vers le post nouvellement créé
wp_redirect(get_permalink($post_id));
exit;
}
// Supprime les données du formulaire de la session pour éviter des soumissions multiples
unset($_SESSION['saved_form_data']);
}
}
Je vous remercie de votre aide