Query Posts Based on Serialized Meta Value

Recently I was working on an “inventory management” system where we I had to work with lots of products and their variations in color, size, sku, upc code, dimensions, price & other related data. Yes, I took help of meta box to take inputs and store them on the meta table. Now, if I were to save one meta value to one row as many would suggest, I would end up with 30 different meta data row for one product only. So basically for 1000 products and their meta data would require me 30,000 rows. Frankly, speaking I didn’t quite like the idea. I thought of using one meta data row for each product and that’s exactly when I thought of serializing each products meta data and save them in one row. So, I would end up with only 1000 rows on my meta data table.

Yes, it might sound a bit complicated but it’s fairly easily and WP works just fine with data serialization. Here is a sample of one product’s meta data on an array which I slimmed down a bit for better understanding.

   [sku] => SKU-BEL
   [cost] => 10
   [retail] => 20
   [notify] => on
   [height] => 6
   [width] => 7
   [length] => 8
   [depth] => 5
   [weight] => 4
   [volume] => 3
   [stock] => Array(
      [0] => Array(
          [color] => Red
          [sku] => SKU-BEL-RED
          [quantity] => 1
          [upc] => 1111111111111)
      [1] => Array(
          [color] => Blue
          [sku] => SKU-BEL-BLUE
          [quantity] => 5
          [upc] => 2222222222222)
      [2] => Array(
          [color] => Yellow
          [sku] => SKU-BEL-YELLOW
          [quantity] => 3
          [upc] => 3333333333333)

As you can see from this array, I have lots of array keys and their values along with nested array. This array would be serialized first and only then it would be saved with a meta key (product_details) on our postmeta table in WordPress. This is how the serialized data should look like on our postmeta table row.

Serialized Meta DataSerialized Meta Data.

Now, if you take a close look at the array you would find a key "notify" which has a value "on". This came from a checkbox input which is one of our key to list all the products that has this value. You can easily query to list those products like this.

global $post;
$args = array(
   'post_type' => 'products',
   'post_status' => 'publish',
   'meta_key' => 'product_details',
   'nopaging' => true,
   'orderby' => 'modified',
   'order' => 'ASC');
$myposts = get_posts($args);
foreach ($myposts as $post) : setup_postdata($post); 
    // unserialize metadata
    $data = unserialize(get_post_meta($post->ID,'product_details',true));
    // check meta key value
    if($data['notify'] == 'on'){
        echo get_the_title();

This is as simple as it can get. I understand that serialization may not be the best way to about it but hey as long as you can get your job done, where is the problem? I hope you would find this post useful. Please let us know your thoughts on this from the comment section below. Thank you.

Today In History



Leave a Reply

Note: Convet HTML, PHP, JavaScripts from HTMLify, before posting from comment section.
License: By submitting a comment here you grant this site a perpetual license to reproduce your words and name/Web site in attribution. Please use your real name or a pseudonym (i.e., pen name, alias, nom de plume) when commenting. If you add your site name, company name, or something completely random, I'll likely change it to whatever I want.