web-dev-qa-db-ja.com

ボタンを押したときにcookie配列から値を取得する方法を教えてください。

私は好きなプラグインを作りました。ショートコードを使用して、ボタンを表示したい場所にボタンを「お気に入り/お気に入りリスト」に表示できます。このボタンは、次のコードでクッキーの配列にpages/posts/blogs/articlesなどのpost_IDを追加するためのものです。

<?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']);
 }
} 
?>

これはうまく機能しており、post_idsはcookie配列に格納されています。コードprint_r(unserialize($_COOKIE['favorites']));を使えば、Cookieを印刷して、保存されているすべてのpost_idの概要を見ることができます。

問題/質問
現在、お気に入りリストを表示するための新しいショートコードを追加しました。そのリストの各値は、そのクッキーを削除/設定解除するためのごみ箱を取得しています。今私は働くために次のコードを取得する必要があります。

<?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();
}
?>

この部分のコードの出力:

enter image description here 

編集
関数:

<?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);

  }
  ?>

私が理解できないのは、なぜ私のsetcookie();が機能していないのです。それはページの始めにあり、私は最初にクッキーを設定できるようにページを更新しますね。

すべての助けは感謝します、事前に感謝します!

1
W. White

あなたは削除される項目を示すためにフォームの中に各項目のIDを入れる必要があります。

<?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

_ソリューション_

まず第一に、私を正しい方向に推してくれたLaxmanaに感謝します。

このコードには関数set_cookie_delete()があります。
関数

<?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