自定义帖子类型+自定义元查询不显示2012年帖子

时间:2011-12-08 作者:David Odin Kether

我为客户端创建了一个自定义的“事件”帖子类型,一旦帖子过期(即事件已经发生),它基本上会“隐藏”帖子。事件按开始日期的顺序显示,而不是按发布顺序显示。最终,这一切都很好。然而,现在我们快到年底了,我的比较操作符似乎不允许显示明年的任何帖子,我不完全确定如何更改操作符以使其正常工作。

    $args = array(
                    \'post_type\'         => \'event\',
                    \'post_status\'       => \'publish\',
                    \'posts_per_page\'    => $num,
                    \'paged\'             => $paged,
                    \'meta_key\'          => \'startDate\',
                    \'meta_query\'        => array(
                                                array( 
                                                    \'key\'     => \'startDate\',
                                                    \'value\'   => date("m/d/Y"),
                                                    \'compare\' => \'>=\',
                                                    \'type\'    => \'NUMERIC\'
                                                )
                                            ),
                    \'orderby\'           => \'meta_value\',
                    \'order\'             => \'ASC\'
        );
    $e_query = new WP_Query($args);

    // get the current date to compare to post\'s dates
    $currentDate = date("m/d/Y");

    if($e_query->have_posts()){
        // while we have posts
        while($e_query->have_posts()) : $e_query->the_post();

            // get the post\'s start date to compare to the current date
            $startDate_compare = date(\'m/d/Y\', strtotime(get_post_meta(get_the_ID(), "startDate", true)));

            if ($startDate_compare >= $currentDate) {
                // this is where all my code to output the post\'s data lives and which is ultimately working fine except for the fact that no posts that are dated to start in 2012 will show up here


            }


        endwhile;
    } else{
        $e_content .= \'<p>Sorry, there is currently no events scheduled at this time.</p>\';
    }
这似乎与我的meta\\u查询有关,因为我只是在进行

if($startDate_compare >= $currentDate){ 
比较一下,只有2011年发布的帖子才会出现。

谢谢你对我的帮助。

UPDATE IN RESPONSE TO user9347\'s COMMENT

当我将meta\\u查询的“type”更改为“date”时,自定义帖子类型返回到没有找到帖子,这对我来说意味着如何为“startDate”键保存潜在值存在问题?我认为meta\\u查询“value”中的“date(“m/d/Y”)”可以解决这个问题。。。但是我不是一个知识渊博的php开发人员。。。更像是一个黑客。

这是我的自定义元字段的代码,我的客户机在其中使用jquery日期选择器选择startDate。jquery日期选择器返回如下日期值:“2012年2月18日”。

    <tr valign="top">
        <th scope="row" style="width: 200px; text-align: left; vertical-align:top;">Start Date</th>
        <td><input type="text" name="startDate" id="startDate" class="datepicker" style="width: 200px;" value=\'<?php echo $startDate; ?>\' /></td>
    </tr>
然后,在附加到“save\\u post”操作的函数中,它被保存为:

update_post_meta($post->ID, \'startDate\', $_POST[\'startDate\']);
在我看来,我需要将这个“startDate”值保存为date对象,以便使meta\\u查询按其应该的方式工作。。。这看起来像这样吗?

$startDateToTime = date(\'m/d/Y\', strtotime($_POST[\'startDate\']);
update_post_meta($post->ID, \'startDate\', $startDateToTime);
*当我创建一篇新帖子,保存它,并将meta\\u查询“type”更改为“DATE”时,这最后一部分似乎不起作用,所以我仍然有点迷茫*

2 个回复
最合适的回答,由SO网友:David Odin Kether 整理而成

我最终通过在几个地方做一件事来解决这个问题。Wordpress不允许您为元数据指定特定的类型,并将所有内容存储为字符串。因此,我添加了一个额外的元数据字段,用作从$startDate值保存帖子时创建的实际时间戳(使用strotime将其转换为unix数字时间戳)。

$startDateTimeStamp = strtotime($_POST[\'startDate\']);

在此基础上,我使用我原来的meta\\u query按新的元数据值对帖子进行排序:

$args = array(
                    \'post_type\'         => \'event\',
                    \'post_status\'       => \'publish\',
                    \'posts_per_page\'    => $num,
                    \'paged\'             => $paged,
                    \'meta_key\'          => \'startDateTimeStamp\',
                    \'orderby\'           => \'meta_value_num\',
                    \'meta_query\'        => array(
                                                array( 
                                                    \'key\'     => strtotime(\'startDateTimeStamp\'),
                                                    \'value\'   => strtotime(date("m/d/Y")),
                                                    \'compare\' => \'>=\',
                                                    \'type\'    => \'NUMERIC\'
                                                )
                                            ),
                    \'order\'             => \'ASC\'
        );
    $e_query = new WP_Query($args);
*请注意:在我确保通过strtotime 函数,并将orderby更改为“meta\\u value\\u num”。

SO网友:SteveAgl

使用类型“DATE”。您正在使用数字。日期值不是数字。

结束

相关推荐

在POST_CATEGORIES_METABOX中实施类别层次结构的更好方法?

目的是确保在编辑帖子时,列出层次分类法的元盒不会在更新时重新排序,以将选中的项放在顶部。马上edit-form-advanced.php 呼叫add_meta_box(), 传递的回调post_categories_meta_box, 定义于meta-boxes.php.post_categories_meta_box() 调用wp_terms_checklist(), 离开checked_ontop 参数未定义。wp_terms_checklist() 该参数默认为true, 这是所有这些胡闹的根本原因