web-dev-qa-db-fra.com

envoi du formulaire via admin-ajax.php

Essayer:

Soumettez le formulaire à l'aide de admin-ajax.php pour mettre à jour les données de publication du statut "brouillon" au statut "publier" et ajouter un champ méta personnalisé pour le type de filtre.

Contenu du formulaire:

<form action="<?php echo admin_url( 'admin-ajax.php' ) ?>" method="post">

        <?php wp_nonce_field( 'submit_filter', 'my_filter_nonce' ); ?>

        <div class="small-6 medium-3 large-3 columns">
            <div class="card">
                <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, 'thumbnail' ); ?>" class="" id="normal">
                    <div class="card-section">
                        <input type="submit" value="No Filter" name="normal">
                    </div>
            </div>
        </div>
</form>

Action de forme:

// process form actions
add_action( 'wp_ajax_nopriv_submit_filter', 'my_submission_filter' );
add_action( 'wp_ajax_submit_filter', 'my_submission_filter' );


function my_submission_filter() {

    $postid = get_the_ID();
    $post_data = array(
          'ID'              => $postid,
          'post_status'     => 'publish'

     );


// add filter meta data
add_post_meta($postid, 'filter', $_POST['filter']); 

// Update the post into the database
wp_update_post( $my_post );

// redirect back to site to see post
wp_redirect( site_url());

die();

}

Résultats:

Page vierge avec un "0" dans le coin supérieur droit et aucune mise à jour à publier.

Voudrais:

Aide à faire ce travail :)

1
WordyDudeGuyMan

Vous ne définissez pas d'action dans votre formulaire, donc rien n'est exécuté.

Ajoutez un champ masqué avec action au formulaire:

<input type="hidden" value="submit_filter" name="action">

Notez également que ceci:

$postid = get_the_ID();

ne fonctionnera pas. Il s'agit d'une nouvelle demande, il n'y a donc pas d'article pour obtenir l'ID. Vous devez également transmettre ceci avec vos données de formulaire.

1
Milo

admin-ajax.php est destiné aux demandes AJAX, mais il ne s'agit pas d'une demande AJAX, mais d'une soumission de formulaire! Peut-être que s'il s'agissait d'une soumission javascript, cela serait approprié, mais vous devriez éviter les bizarreries d'Admin AJAX et créer un gestionnaire de formulaire standard.

Lorsque vous soumettez un formulaire, soumettez-le sur la même page sur laquelle se trouve le formulaire. De cette façon, le traitement et l'affichage des formulaires sont côte à côte et la validation devient beaucoup plus facile à afficher.

Par exemple:

if ( ! empty( $_POST['submission'] )) {
    // the form was submitted!

    $success = false;
    // fetch the parameters, do some validation, etc

    // ... handle the form submission

    // all done, if successful say so else load the form
    if ( true === $success ) {
        get_template_part( 'theform', 'success' ); // theform-success.php
    } else {
        // show the form again with whatever validation errors there were
        get_template_part( 'theform' ); 
    }
} else {
    // the form was not submitted, DISPLAY THE FORM!!! First page
    get_template_part( 'theform' );
}

theform.php contiendra votre formulaire, et pour l'action du formulaire, vous le laisserez simplement vide, par exemple. <form method="POST" action="">

Gestion de plusieurs pages

Vous pouvez ajouter un champ caché nommé page, puis charger différents modèles en fonction de sa valeur et les traiter lorsque, sur la dernière page, vous devez garder à l'esprit que les valeurs de la page 1 ne seront pas présentes lors de la soumission. page 2, vous devez donc les reporter dans des champs cachés.

1
Tom J Nowell

Vous ne soumettez pas vos données avec AJAX, vous n'avez donc pas besoin d'utiliser admin-ajax.php et le hook wp_ajax. Au lieu de cela, vous avez besoin du hook admin_post.

Vous devez apporter quelques modifications à votre code afin de le faire fonctionner. Commencez par modifier votre action de formulaire en <?php echo esc_url( admin_url('admin-post.php') ); ?> et ajoutez un champ d'action masqué à la fin de votre formulaire <input type="hidden" name="action" value="submit_filter">.

Ainsi, chaque fois qu'une demande est envoyée à WordPress et que le paramètre d'action est défini sur "submit_filter", le hook admin_post_submit_filter sera exécuté.

Voici à quoi devrait ressembler votre code de formulaire:

<form action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
   <?php wp_nonce_field( 'submit_filter', 'my_filter_nonce' ); ?>
   <div class="small-6 medium-3 large-3 columns">
      <div class="card">
          <img src="<?php echo get_the_post_thumbnail_url( $posts[0]->ID, 'thumbnail' ); ?>" class="" id="normal">
          <div class="card-section">
              <input type="submit" value="No Filter" name="normal">
          </div>
      </div>
    </div>
    <input type="hidden" name="action" value="submit_filter">
</form>

Et le code de fonction pour traiter votre demande:

add_action( 'admin_post_nopriv_submit_filter', 'my_submission_filter' );
add_action( 'admin_post_submit_filter', 'my_submission_filter' );

function my_submission_filter() {
  $postid = get_the_ID();

  $post_data = array(
    'ID'              => $postid,
    'post_status'     => 'publish'
  );

  add_post_meta($postid, 'filter', $_POST['filter']); 
  wp_update_post( $my_post );

  wp_redirect( site_url());
}

Il est également bon de vérifier les erreurs en utilisant is_wp_error

https://codex.wordpress.org/Plugin_API/Action_Reference/admin_post_(action)https://codex.wordpress.org/Function_Reference/is_wp_error

1
Boris Kuzmanov