使用PRE_GET_POSTS和$_GET按URL参数修改日期查询

时间:2017-08-04 作者:nickpish

我正在尝试使用URL参数修改我的“事件”自定义帖子类型的查询,方法是使用following:

function my_pre_get_posts($query)
    {

    // do not modify queries in the admin

    if (is_admin())
        {
        return $query;
        }

    // only modify queries for \'event\' post type

    if (isset($query->query_vars[\'post_type\']) && $query->query_vars[\'post_type\'] == \'event\')
        {

        // allow the url to alter the query

        if (isset($_GET[\'city\']))
            {
            $query->set(\'meta_key\', \'city\');
            $query->set(\'meta_value\', $_GET[\'city\']);
            }
        }

    // return

    return $query;
    }

add_action(\'pre_get_posts\', \'my_pre_get_posts\');
当使用以下字符串修改查询时,这种方法效果很好www.website.com/events?city=melbourne, 但在我的情况下,我希望将查询的日期范围从当前日期当天或之后开始的事件更改为当前日期之前(使用自定义字段event_start_date). 因此,我现有的查询如下所示:

$args = array(
        \'post_type\'     =>  \'event\',
        \'ignore_sticky_posts\'   => 1,
        \'posts_per_page\'        => 10,
        \'post_status\'           => \'publish\',
        \'paged\' => get_query_var( \'paged\' ),
        \'orderby\'       =>  \'meta_value_num\',
        \'order\'         =>  \'ASC\',
        \'meta_query\' => array(
            array(
                \'key\'     => \'event_start_date\',
                \'type\'    => \'DATE\',
                \'value\'   => current_time(\'Ymd\'),
                \'compare\' => \'>=\',
            ),
        ),
    );
因此,我应该如何修改pre_get_posts 函数将按URL的查询更改为\'<=\' 当前日期?感谢您的帮助。

1 个回复
SO网友:hwl

我不是在哪里可以测试这个,而是为了:www.website.com/events?date=past, 也许下面概述的方法可以奏效。

(我几乎可以保证有一两种类型,所以请确保将其重写/编辑/重做到您的函数中,并确保您不会继承我的错误)。

   if (isset($_GET[\'date\']))
        {
           //using past, present, future as example. not sure what you wanted to pass in url
           switch( $_GET[\'date\'] ) {
               case (\'past\'):
                     $compare = \'<\';
                     break;
               case (\'present\'):
                     $compare = \'=\';
                     break;
               case (\'future\'):
                     $compare = \'>=\';
                     break;
           }//switch

           // $metas will be array of arrays, and we only want one of those,
          //  otherwise we risk altering the compare value of the city or 
         //  some other meta query array

          //get existing meta_query from $query
           $metas = $query->get(\'meta_query\'); 
           foreach ( $metas as $meta ) {

            //limit edits to the one we want, when we want it
            if ( $meta[\'key\'] == \'event_start_date\' && $meta[\'compare\'] != $compare ) {

                //might not need to unset, as setting it will overwrite
                unset( $meta[\'compare\'] ); 

                $meta[\'compare\'] = $compare;

            }//if
          }//foreach

          //now that foreach is over, re-set() the whole meta query
          $query->set( \'meta_query\', $metas );

    }//if (isset)            
此外,请注意

if (isset($_GET[\'city\']))
    {
    $query->set(\'meta_key\', \'city\');
    $query->set(\'meta_value\', $_GET[\'city\']);
    }
}
可能正在覆盖现有的元查询(我不确定以这种方式添加它是否会附加、前置或替换正在处理的任何内容WP_Meta_Query.)在任何情况下,使用$query->get(\'meta_query\'); 首先,您可以将另一个参数数组添加到meta\\u查询:

$meta_query = $query->get(\'meta_query\');
$my_new_meta_query = array(
                          array(
                               \'key\'     => \'city\',
                               \'value\'   => $_GET[\'city\'],
                               ),
                      );
$meta_query[] = $my_new_meta_query;
我只想补充一下,如果您的意图是使用url参数构建元查询,例如www.website.com/events?date=past&city=melbourne. 等

结束

相关推荐

WP_QUERY从只在目录中的WooCommerce产品中检索帖子

我在WooCommerce商店里有一些产品Catalog & Search 还有更多设置为Search.我做了很多工作来确保我的目录是好的和干净的,但现在我需要对它们做一些额外的工作,并试图检索只在我的目录中的产品ID,而不仅仅是搜索。我试过几次,但有些地方出了问题。我错过了什么?$params = array( \'posts_per_page\' => -1, \'post_type\' => \'product\', \'order