简体   繁体   English

使用 WP_Query 在 wordpress 搜索中查询日期

[英]date query in wordpress search with WP_Query

I want to Building An Advanced WordPress Search With WP_Query according to this article.我想建立一个高级WordPress的搜索有了WP_Query根据文章。

I use shortcode to build a form search.我使用简码来构建表单搜索。

 function sm_setup() {
    add_shortcode( 'sm_search_form', 'sm_search_form' );
}add_action('init','sm_setup');

Then register custom query vars然后注册自定义查询变量

function sm_register_query_vars( $vars ) {
    $vars[] = 'cat';
    $vars[] = 'timestart';
    $vars[] = 'timeend';
    return $vars;
}
add_filter( 'query_vars', 'sm_register_query_vars' );

I Build a custom query based on several conditions:我根据几个条件构建自定义查询:

function sm_pre_get_posts( $query ) {
    // check if the user is requesting an admin page
    // or current query is not the main query
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }
    // edit the query only when post type is 'accommodation'
    // if it isn't, return
    if ( !is_post_type_archive( 'post' ) ){
        return;
    }
    $date_query = array();
    // get query var values
    // defaults to empty string
    if( !empty( get_query_var( 'cat' ) ) ){
        $query->set( 'cat', get_query_var( 'cat' ) );
    }


     // get date query var values

  $date_query[] = array( 'after' => get_query_var( 'timestart') ,'inclusive'=>'true');
  $date_query[] = array( 'before' => get_query_var( 'timeend'),'inclusive'=>'true');

    $date_query['relation'] = 'AND';

        $query->set( 'date_query', $date_query );
}
add_action( 'pre_get_posts', 'sm_pre_get_posts', 1 );

And finally search form最后搜索表单

function sm_search_form( $args ){
    // The Query
    // meta_query expects nested arrays, even if you only have one query
    // to add the category param
    $sm_query = new WP_Query( array( 'post_type' => 'post', 'posts_per_page' => '-1' ) );
    // The Loop
    $args = array(
        'orderby' => 'name',
        'order' => 'ASC',
        'parent' => 0
    );
    $categories = get_categories($args);
    /* Restore original Post Data */
    wp_reset_postdata();
    if( count($categories) == 0){
        return;
    }
    asort($categories);


    $cat_option = '<select name="cat">';
    $cat_option .= '<option value="">' . __( 'choose category','my_plugin' ) . '</option>';
    foreach ($categories as $category ) {
        $cat_option .= '<option value="' . $category->cat_ID . '">' . $category->cat_name . '</option>';
    }
    $cat_option .= '</select>' . "\n";
    reset($categories);




    $output = '<form id="smform" action="' . esc_url( home_url() ) . '" method="GET" role="search">';
    $output .= '<div class="smtextfield">' . '<input type="text" name="s" placeholder="Search key..." value="' . get_search_query() . '" /></div>';
    $output .= '<div class="smtextfield">' . '<input type="text" name="timestart" placeholder="timestart..."/></div>';
    $output .= '<div class="smtextfield">' . '<input type="text" name="timeend" placeholder="timeend..." /></div>';
    $output .= '<div class="smselectbox">' . $cat_option . '</div>';
    $output .= '<input type="hidden" name="post_type" value="post" />';
    $output .= '<p><input type="submit" value="Go!" class="button" /></p></form>';
    return $output;
}

My problem is date_query!我的问题是 date_query! when I want customize with date.当我想自定义日期时。 search dose not work!搜索不起作用! and show all posts.并显示所有帖子。

Where did I make mistakes?我在哪里犯了错误?

The usage of date_query is wrong here: 'inclusive' should be outside of internal arrays. date_query 的用法在这里是错误的:'inclusive' 应该在内部数组之外。 Before and after can be in the same array if compared column is default:如果比较列是默认值,before 和 after 可以在同一个数组中:

    $date_query[] = array( 
     'after' => get_query_var( 'timestart'),
     'before' => get_query_var('timeend')
    );

   $date_query['relation'] = 'AND';
   $date_query['inclusive'] = true;

And make sure that get_query_var values are correct.并确保 get_query_var 值正确。 Check the syntax here: https://developer.wordpress.org/reference/classes/wp_query/#date-parameters检查这里的语法: https : //developer.wordpress.org/reference/classes/wp_query/#date-parameters

fe print them before the query.在查询之前打印它们。 echo get_query_var( 'timestart'); echo get_query_var('timestart'); - see if they are displayed correctly. - 查看它们是否正确显示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM