Order query using custom meta data

I have created a custom post type called Events with the name of events

function add_events_post_type() {
    register_post_type("events", array(
        "label"             => __("Events"),
        "singular_label"    => __("events"),
        "public"        => true,
        "capability_type"       => "post",
        "hierarchical"      => false,
        "rewrite"       => array("slug" => "event"),
        "query_var"     => false,
        "show_ui"       => true,
        "supports"      => array("title", "editor", "author")
    ));
}
add_action('init', 'add_events_post_type');

I use the following to create my custom meta box

Read More
define('MY_WORDPRESS_FOLDER',$_SERVER['DOCUMENT_ROOT']);
define('MY_THEME_FOLDER',str_replace("",'/',dirname(__FILE__)));
define('MY_THEME_PATH','/' . substr(MY_THEME_FOLDER,stripos(MY_THEME_FOLDER,'wp-content')));

add_action('admin_init','my_meta_init');

function my_meta_init()
{
    // review the function reference for parameter details
    // http://codex.wordpress.org/Function_Reference/wp_enqueue_script
    // http://codex.wordpress.org/Function_Reference/wp_enqueue_style

    //wp_enqueue_script('my_meta_js', MY_THEME_PATH . '/custom/meta.js', array('jquery'));
    wp_enqueue_style('my_meta_css', MY_THEME_PATH . '/custom/meta.css');

    // review the function reference for parameter details
    // http://codex.wordpress.org/Function_Reference/add_meta_box

    // add a meta box for each of the wordpress page types: posts and pages
    foreach (array('events') as $type)
    {
        add_meta_box('my_all_meta', 'Event Info', 'my_meta_setup', $type, 'normal', 'high');
    }

    // add a callback function to save any data a user enters in
    add_action('save_post','my_meta_save');
}

function my_meta_setup()
{
    global $post;

    // using an underscore, prevents the meta variable
    // from showing up in the custom fields section
    $meta = get_post_meta($post->ID,'_my_meta',TRUE);

    // instead of writing HTML here, lets do an include
    include(MY_THEME_FOLDER . '/custom/events.php');

    // create a custom nonce for submit verification later
    echo '<input type="hidden" name="my_meta_noncename" value="' . wp_create_nonce(__FILE__) . '" />';
}

function my_meta_save($post_id)
{
    // authentication checks

    // make sure data came from our meta box
    if (!wp_verify_nonce($_POST['my_meta_noncename'],__FILE__)) return $post_id;

    // check user permissions
    if ($_POST['post_type'] == 'page')
    {
        if (!current_user_can('edit_page', $post_id)) return $post_id;
    }
    else
    {
        if (!current_user_can('edit_post', $post_id)) return $post_id;
    }

    // authentication passed, save data

    // var types
    // single: _my_meta[var]
    // array: _my_meta[var][]
    // grouped array: _my_meta[var_group][0][var_1], _my_meta[var_group][0][var_2]

    $current_data = get_post_meta($post_id, '_my_meta', TRUE);  

    $new_data = $_POST['_my_meta'];

    my_meta_clean($new_data);

    if ($current_data)
    {
        if (is_null($new_data)) delete_post_meta($post_id,'_my_meta');
        else update_post_meta($post_id,'_my_meta',$new_data);
    }
    elseif (!is_null($new_data))
    {
        add_post_meta($post_id,'_my_meta',$new_data,TRUE);
    }

    return $post_id;
}

function my_meta_clean(&$arr)
{
    if (is_array($arr))
    {
        foreach ($arr as $i => $v)
        {
            if (is_array($arr[$i]))
            {
                my_meta_clean($arr[$i]);

                if (!count($arr[$i]))
                {
                    unset($arr[$i]);
                }
            }
            else
            {
                if (trim($arr[$i]) == '')
                {
                    unset($arr[$i]);
                }
            }
        }

        if (!count($arr))
        {
            $arr = NULL;
        }
    }
}

and my custom box looks like below

<div class="my_meta_control">
<p>Fill out this information so that events will post show.</p>
<label>Event Start Date</label>
<p><input type="text" name="_my_meta[eventstartdate]" class="date-pick" value="<?php if(!empty($meta['eventstartdate'])) echo $meta['eventstartdate']; ?>"/></p>
<label>Event End Date</label>
<p><input type="text" name="_my_meta[eventenddate]" class="date-pick" value="<?php if(!empty($meta['eventenddate'])) echo $meta['eventenddate']; ?>"/></p>
<label>Publish Date</label>
<p><input type="text" name="_my_meta[publish]" class="date-pick" value="<?php if(!empty($meta['publish'])) echo $meta['publish']; ?>"/></p>
<label>Hide Date</label>
<p><input type="text" name="_my_meta[hide]" class="date-pick" value="<?php if(!empty($meta['hide'])) echo $meta['hide']; ?>"/></p>
<label>Sticky</label>
<p><input type="checkbox" name="_my_meta[sticky]" value="sticky" <?php if($meta['sticky'] == 'sticky') { echo 'checked="checked"'; } ?>/></p>
<div id="clearer"></div>
</div>

I am querying the posts in the custom post type on the homepage of the site using this query.

<?php
    $args = array( 'post_type' => 'events', 'posts_per_page' => 3 );
    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        $data = get_post_custom(get_the_ID());
        $data2 = $data['_my_meta'];
        $data3 = unserialize($data2[0]);
        if($data3['sticky'] == 'sticky')
        {
            echo '<strong>'.get_the_title().'</strong><br />';
        } else {
            echo ''.get_the_title().'<br />';
        }
    endwhile;
?>

I would like to order the query using the Event Start Date from the custom meta box. I have tried this with no luck. Can someone help me with this?

Related posts

Leave a Reply

1 comment

  1. You’ll have to save the date under its own meta key to be able to query and order on it. Right now your meta is being serialized into a single string, so MySQL is unable to query on that data.