3

一些背景:

  • 我正在尝试替换存档模板的默认主查询,并返回自定义帖子类型(“天”)的子集,其中针对键“日期”的元值介于某个值之间
  • “days”自定义帖子类型有一个“dates”自定义变量字段,它将与该帖子关联的每个日期的各个数据库行存储在标准 wp_postmeta 表中,以 Epoch 格式(“U”)存储
  • 我相当有信心 SQL 查询运行正常;对于查询的日期范围,它返回的帖子 ID 在每种情况下似乎都是正确的。

我在我的函数文件中运行以下查询:

   function modify_queries( $query ) { 
        global $wpdb;
        if ( $query->is_post_type_archive('days') && $query->is_main_query() ) {
            // Get Days with a date within the archive range
            $year = substr($query->query_vars['m'],0,4);
            $month = substr($query->query_vars['m'],4,2);
            $day = substr($query->query_vars['m'],6,2);

            if (is_year()) {
                $startDate = date('U', mktime(0, 0, 0, 1, 1, $year));
                $endDate = date('U', mktime(0, 0, 0, 12, 31, $year));
            }
            if (is_month()) {
                $startDate = date('U', mktime(0, 0, 0, $month, 1, $year));
                $endDate = date('U', mktime(0, 0, 0, $month, cal_days_in_month(CAL_GREGORIAN, $month, $year), $year));
            }
            if (is_day()) {
                $startDate = date('U', mktime(0, 0, 0, $month, $day, $year));
                $endDate = date('U', mktime(0, 0, 0, $month, $day, $year));
            }

            $request  = "SELECT ID FROM $wpdb->posts, $wpdb->postmeta";
            $request .= " WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id";
            $request .= " AND post_status='publish' AND post_type='days'";
            $request .= " AND $wpdb->postmeta.meta_key = 'dates' AND $wpdb->postmeta.meta_value >= $startDate AND $wpdb->postmeta.meta_value <= $endDate LIMIT 0 , 30";
            $postsList = $wpdb->get_results($request,ARRAY_N);
            if ($postsList) {


                foreach ($postsList as $thePost) {
                    $thePostList[] = $thePost[0];
                }
                $query->set( 'post__in', $thePostList);
                $query->set( 'post_type', 'days');

                return;
            } else {
                return false;
            }

}
add_action( 'pre_get_posts', 'modify_queries',1 );

我的理解是,这应该获取查询的输出,并使用从 SQL 查询返回的 ID 替换普通查询 - 但是,它只是返回 5 个最近的“天”帖子。

目前,archive.php 文件仅包含以下内容,因此我们可以排除任何干扰:

<?
while ( have_posts() ) : the_post();
global $post;
the_title();
endwhile;
?>  

我得到了最近发布的 5 个“天”帖子,它似乎忽略了 pre_get_posts 过滤器应该通过它的 ID。

我有一个偷偷摸摸的怀疑,部分问题与在主查询上设置“post_id”有关,而不是“p”,但我似乎根本没有得到任何结果。

我四处寻找,但找不到太多关于 pre_get_posts 的文档,除了它作为 query_posts 的替代品有多么有用和有益。

实时调试输出:http ://dev.daysoftheyear.com/days/2012/10

4

2 回答 2

3

您可以在此处找到有关pre_get_post过滤器的文档http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

在我看来,问题实际上是您如何设置要检索的 post_ids。如果您参考上面的链接,您可以看到可以在$query传递给过滤器的对象上设置的不同值,而post_id不是其中之一,这就是为什么当您设置它时它“有效”,并且“设置时不起作用” p。后者用于单个帖子 ID,因此如果您只想要 100,则可以使用$query->set('p', 100). 如果要返回帖子 ID 在数组中的结果,请使用$query->set('post__in', array(100, 120)). 您的 SQL 代码只是返回 ID,因此您可以直接获取一个数组,而不是返回对象,我假设回显标题和print_r行只是调试:

// get results as a numeric array
$post_ids = $wpdb->get_results($request, ARRAY_N);
// pass post id array to $query
$query->set( 'post__in', $post_ids );

如果$query. 您可以检查这些值var_dump($query->query_vars)并将任何可能与空字符串冲突的值设置为 - 在您的情况下$query->set( 'm', '' );

于 2012-10-20T23:29:20.663 回答
0

认为我已经成功了;给 'm' 一个空白值以阻止它认为这是一个基于日期的查询。谢谢!:)

于 2012-10-21T11:20:33.760 回答