归档搜索页面顶部的自定义查询,参数将被覆盖

时间:2017-09-26 作者:Paul Canning

我正在为自定义帖子类型使用自定义存档模板。

在页面顶部,我想显示一个特定的帖子,使用新的wp_query() 呼叫

$args = [
    \'posts_per_page\' => 1,
    \'post_type\' => \'document\',
    \'order\' => \'DESC\',
    \'orderby\' => \'date\',
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        the_title();
        the_date( \'F Y\' );
    }
    wp_reset_postdata();
}
自定义搜索表单

<form id="document-filter" method="post">
    <select name="order_by">
        <option value="date">Date</option>
        <option value="title">Name</option>
    </select>
    <select name="order">
        <option value="desc">DESC</option>
        <option value="asc">ASC</option>
    </select>
    <input name="s" type="text" placeholder="Filter by keyword" value=""/>
    <input name="post_type" type="hidden" value="document"/>
    <input type="submit" />
</form>
最初,它是有效的。但是,如果使用自定义搜索表单对存档列表(日期/名称、asc/desc)进行排序,则自定义wp_query() 受到影响,而query_vars 数组正在重写我提供的参数。

实例

按日期顺序递减的帖子:

最初,我在页面顶部的自定义查询将输出Post C, 这是正确的。

如果我使用搜索/筛选表单将帖子的顺序更改为:

现在,单数查询的帖子将是Post A, 这是不正确的。我的自定义查询参数没有更改,但正在被搜索表单以某种方式覆盖。

2 个回复
SO网友:Mike Malyi

根据我的经验,wp\\u reset\\u postdata()工作不正常。您可以尝试以下代码:

global $wp_query;
$temp_wp_query = $wp_query;
//Your custom WP_Query code
$wp_query = $temp_wp_query;

SO网友:Paul Canning

所以我终于成功了,但没有使用wp_query().

相反,我必须使用自定义查询$wpdb.

示例:

$latest_document = $wpdb->get_results( $wpdb->prepare( "
        SELECT $wpdb->posts.*
        FROM $wpdb->posts
        WHERE $wpdb->posts.post_status = %s
        AND $wpdb->posts.post_type = %s
        ORDER BY $wpdb->posts.post_date DESC
        LIMIT 1
     ", \'publish\', \'document\' ), OBJECT );
有趣的是,虽然我只想要一行,但当我使用$wpdb->get_row() 我遇到了与之前相同的问题,结果记录将按照搜索表单中的参数进行排序。

使用$wpdb->get_results() 无论我使用搜索表单选择何种排序,都可以正常工作,并且记录始终相同。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post