2

There are some values in Post Meta Data stored as a multi dimensional array. I want to update some of their data.

Here is the Post Meta value displayed using <?php the_meta(); ?>

voter: a:1:{s:5:"voter";a:5:
     {s:7:"post_id";s:6:"219585";s:8:"voter_id";s:4:"1540";s:8:"voter_ip";s:13:"182.4
     8.238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:1:"1";}}, 

     a:1:{s:5:"voter";a:5:          
     {s:7:"post_id";s:6:"219585";s:8:"voter_id";s:3:"832";s:8:"voter_ip";s:13:"182.48
     .238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:2:"-1";}}, 

     a:1:{s:5:"voter";a:5:
     {s:7:"post_id";s:6:"219585";s:8:"voter_id";s:2:"10";s:8:"voter_ip";s:13:"182.48.
     238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:1:"1";}}

Now I want to update the vote or voter_ip where user_id is 832 or 1540. I tried using update_post_meta() but its updating everything.

So how to update the post meta of single value stored in multi dimension array?

Update:

array using the-meta()

voter: a:1:{s:5:"voter";a:5:{s:7:"post_id";s:6:"219585";s:8:"voter_id";s:3:"832";s:8:"voter_ip";s:13:"182.48.238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:1:"1";}}, 
 a:1:{s:5:"voter";a:5:{s:7:"post_id";s:6:"219585";s:8:"voter_id";s:4:"1540";s:8:"voter_ip";s:13:"182.48.238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:2:"-1";}}, , , 
a:1:{s:5:"voter";a:5:{s:7:"post_id";s:6:"219585";s:8:"voter_id";s:3:"832";s:8:"voter_ip";s:13:"182.48.238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:1:"1";}}, 
a:1:{s:5:"voter";a:5:{s:7:"post_id";s:6:"219585";s:8:"voter_id";s:4:"1540";s:8:"voter_ip";s:13:"182.48.238.86";s:9:"author_id";s:4:"1540";s:4:"vote";s:2:"-1";}}

array using print_r()

Array( [0] => Array ( [voter] => Array ( [post_id] => 219585 [voter_id] =>
832 [voter_ip] => 182.48.238.86 [author_id] => 1540 [vote] => 1 ) ) [1] =>
Array ( [voter] => Array ( [post_id] => 219585 [voter_id] => 1540 [voter_ip]
=> 182.48.238.86 [author_id] => 1540 [vote] => -1 ) ) [2] => [3] => [4] =>
Array ( [voter] => Array ( [post_id] => 219585 [voter_id] => 832 [voter_ip]
=> 182.48.238.86 [author_id] => 1540 [vote] => 1 ) ) [5] => Array ( [voter] 
=> Array ( [post_id] => 219585 [voter_id] => 1540 [voter_ip] => 
182.48.238.86 [author_id] => 1540 [vote] => -1 ) )) 
0

You may need to unserialize the data to get the array and loop through it thus:

$userid = 832; // or 1540
$votes = get_post_meta($postid,'voter');
$votes = maybe_unserialize($votes);

if (is_array($votes)) {
    // votes is the array, key is numeric index, vote is subarray
    foreach ($votes as $key => $vote) {
         // subarray values are in another array with key 'voter'
         if ($vote['voter']['voter_id'] == $userid) {
             $votes[$key]['voter']['vote'] = $newvote;
             $votes[$key]['voter']['voter_ip'] = $newvoterip;
         }                 
    }
    update_post_meta($postid,'voter',$voter);
}
  • its blowing my mind. Can you please explain this to me? actually it's not working. – Ramesh Pardhi Jul 24 '16 at 13:53
  • it is a little hard to read serialized data you should just try print_r(unserialize(get_post_meta($postid,'voter'))); to see the array structure properly. I will try to update me answer I think is slightly off but that will be more help for both of us to see. – majick Jul 24 '16 at 14:35
  • in serial, a: means array and s: means string, the rest is trying to read the array stucture from that, just much easier to read when the array is printed with print_r – majick Jul 24 '16 at 14:40
  • just updated the question. is it ok? – Ramesh Pardhi Jul 24 '16 at 15:21
  • yes that matches what I have for my updated code, I am confused about your usage of the_meta though versus get_post_meta is your intention getting meta from a single post or are you getting it for all posts. – majick Jul 25 '16 at 3:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.