使用自定义元数据的订单查询

时间:2012-06-27 作者:BrettAdamsGA

我创建了一个名为Events 姓名为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\');
我使用以下方法创建自定义元框

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;
        }
    }
}
我的自定义框如下所示

<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>
我正在使用此查询查询网站主页上自定义帖子类型中的帖子。

<?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;
?>
我想使用自定义元框中的事件开始日期对查询进行排序。我试过这个,但运气不好。有人能帮我吗?

1 个回复
SO网友:Milo

您必须将日期保存在其自己的元键下,才能对其进行查询和排序。现在,您的元被序列化为单个字符串,因此MySQL无法查询该数据。

结束

相关推荐