web-dev-qa-db-fra.com

Comment passer la variable Post_ID de Single.php du thème au plugin personnalisé à l'aide de AJAX

Après de nombreuses recherches, il me semble avoir trouvé que get_this_ID (); ni d'autres itérations ne fonctionneront dans une requête AJAX. Je suis certes un PHP noob, quelqu'un peut-il expliquer s'il vous plaît comment ce gars ici a réussi? Il dit qu'il "a simplement renvoyé l'identifiant dans un div caché, puis l'a renvoyé avec l'appel AJAX."

Mon code est ci-dessous.

if(wp_verify_nonce($nonce, 'checkbox') !== false) {

     global $post; 
     $post = $wp_query->get_queried_object();
     $post_ID = $post->ID; 

      $user_ID = get_current_user_id();

       $dataArray[$post_ID] = isset($dataArray['second_checkbox']) ? true : false;

      if($user_ID != NULL) {
        foreach($dataArray as $key=>$value) {

          $status = update_user_meta($user_ID, $key, $value);

        }

        //ajaxStatus('success', 'Meta fields updated.', $post_ID);
        ajaxStatus('success', 'Meta fields updated.', $dataArray);

Il génère une valeur vide pour $ post_ID dans la console.

{"status":"success","message":"Meta fields updated.","data":{"":false}}

Mais dans la page single.php, le $ post_ID est trouvé et l’écho fonctionne

<?php 
global $wp_query; 
$post = $wp_query->get_queried_object();
$post_ID = $post->ID; 
?>                              <div id="test"><?php echo($post_ID); ?></div>

Javascript est ici

jQuery(document).ready(function($) {
    var response;
    $('#checkbox').on('submit',function(e) {

    e.preventDefault();

    $.post( checkbox.ajaxurl, {
          action : 'submit_checkboxes',
          nonce : checkbox.nonce,
          post : $(this).serialize()
      },
      function(response) {
          console.log(response);
          responseSuccess(response);
      });

    return false;
    });
    function responseSuccess(data) {

    response = JSON.parse(data);

    if(response.status === 'success') {
      $('#checkbox-message').text(response.message);
    } else {
      $('#checkbox-message').text(response.message);
    }
    }   });

C'est l'ajax

function ajaxStatus($status, $message, $data = NULL) {

  $response = array (
    'status' => $status,
    'message' => $message,
    'data' => $data
    //'data' => $post_ID
    );
  $output = json_encode($response);

  exit($output);

}
1
DonChi

Il se peut que je manque quelque chose dans votre code; mais:

  1. vous devez "déplacer" le contenu de votre test div vers une variable JS pouvant ensuite être utilisée dans votre Ajax (ou utiliser la valeur div directement dans votre $ .post.

    par exemple. var postID = $('#test').val();

  2. puis utilisez-le pour transmettre les informations nécessaires à votre serveur

    $.post( checkbox.ajaxurl, {
       action : 'submit_checkboxes',
       nonce : checkbox.nonce,
       thispost : postID,
       post : $(this).serialize()
      },
      function(response) {whatever... }
    );
    
  3. dans votre PHP, utilisez say intval($_POST['thispost']) pour obtenir l'identifiant de la publication et utilisez-la en conséquence.

Remarque: non testé et j'ai tendance à utiliser jQuery.ajax avec une chaîne de données de valeurs au lieu de jQuery.post

1
scytale