web-dev-qa-db-fra.com

Comment puis-je obtenir la valeur d'un tableau de cookies lorsque j'appuie sur un bouton?

J'ai fait un plugin préféré. Avec un shortcode, je peux afficher le bouton sur "une liste de souhaits/favoris" où je le souhaite. Ce bouton sert à ajouter les post_ID de pages/posts/blogs/articles etc. dans un tableau de cookies avec le code suivant:

<?php 
 if (isset($_POST['submit_wishlist'])){
  if (!isset($_COOKIE['favorites'])){
   //echo 'not set <br>';
   $cookie_value = get_the_ID();
   $init_value = array($cookie_value);
   $init_value = serialize($init_value);
   //echo $init_value;
   setcookie('favorites', $init_value, time() + (86400 * 30), "/");
   wp_redirect($_SERVER['HTTP_REFERER']);
 } else {
   //echo 'set <br>';
   $cookie_value = get_the_ID();
   $prev_value = $_COOKIE['favorites'];
   $prev_value = stripslashes($prev_value);
   $prev_value = unserialize($prev_value);

   array_Push($prev_value, $cookie_value);
   $new_value = serialize($prev_value);
   //echo $new_value;
   setcookie('favorites', $new_value, time() + (86400 * 30), "/");
   wp_redirect($_SERVER['HTTP_REFERER']);
 }
} 
?>

Cela fonctionne très bien et les post_ids sont stockés dans le tableau de cookies. Avec le code print_r(unserialize($_COOKIE['favorites']));, je peux imprimer le cookie et obtenir une vue d'ensemble de tous les post_ids enregistrés.

Problème/Question
Actuellement, j'ai ajouté un nouveau code court pour afficher la liste des favoris. Chaque valeur de cette liste reçoit un bouton corbeille pour supprimer/annuler la définition de ce cookie. Maintenant, j'ai besoin que le code suivant fonctionne:

<?php 
$all_favorites= unserialize($_COOKIE['favorites']);

echo '<table>';
foreach($all_favorites as $key => $value) {
 echo '<tr>';
  echo 'Post-ID = ' . $value . ' ';
  ?>
  <form method="POST"><button type="submit" class="btn btn-default" name="delete"><span class="glyphicon glyphicon-trash"></span></button>
  <input type="hidden" name="delete_id" value="<?php echo $value; ?>" />
  </form><br>
  <?php
 echo '</tr>';
}
echo '</table>';
if (isset($_POST['delete'])){
  //function for setting new cookie, function is displayed on each page before the get_header()
  set_cookie_delete();
}
?>

La sortie de cette partie de code:

 enter image description here 

Modifier
La fonction:

<?php
function set_cookie_delete(){
  $all_favorites = unserialize($_COOKIE['favorites']);
  $delete_id = $_POST['delete_id'];
  echo 'deleted value = ' . ' ' . $delete_id . '<br>';

  $array_delete = array_diff($all_favorites, array($delete_id));
  $array_delete = serialize($array_delete);
  print_r($array_delete);

  wp_redirect($_SERVER['HTTP_REFERER']);
  setcookie('favorites', $array_delete, time() + (86400 * 30), "/");

  //echo '<br><br>';
  //print_r($_COOKIE);

  }
  ?>

Ce que je ne comprends pas, c'est pourquoi ma setcookie(); ne fonctionne pas. C'est au début de la page et j'ai tout d'abord actualisé la page pour que le cookie puisse s'installer, non?

Toute aide sera appréciée, merci d'avance!

1
W. White

Vous devez mettre l'identifiant de chaque élément dans le formulaire pour indiquer l'élément à supprimer.

<?php 
$all_favorites= unserialize($_COOKIE['favorites']);

echo '<table>';
foreach($all_favorites as $key => $value) {
 echo '<tr>';
  echo 'Post-ID = ' . $value . ' ';
  ?>
  <form method="POST">
    <input type="hidden" name="id" value="<?php echo $value; ?>">
    <button type="submit" class="btn btn-default" name="delete">
        <span class="glyphicon glyphicon-trash"></span>
    </button>
  </form><br>
  <?php
 echo '</tr>';
}
echo '</table>';
if (isset($_POST['delete'])){
   $id = $_POST['id']; // do security checks (sanitize etc)
   // unset post with $id from cookie

}
?>
3
Laxmana

SOLUTION

Tout d’abord, merci à Laxmana de m’avoir poussé dans la bonne direction!

J'ai la fonction set_cookie_delete() à ce code:
La fonction

<?php
  if (isset($_POST['delete'])){
  $all_favorites = unserialize($_COOKIE['favorites']);
  $delete_id = $_POST['delete_id'];
  //echo 'deleted value = ' . ' ' . $delete_id . '<br>';

  $array_delete = array_diff($all_favorites, array($delete_id));
  $array_delete = serialize($array_delete);
  //print_r($array_delete);

  setcookie('favorites', $array_delete, time() + (86400 * 30), "/");
  wp_redirect($_SERVER['HTTP_REFERER']);
 }
?>
1
W. White