我正在为自定义帖子类型使用自定义存档模板。
在页面顶部,我想显示一个特定的帖子,使用新的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
, 这是不正确的。我的自定义查询参数没有更改,但正在被搜索表单以某种方式覆盖。
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()
无论我使用搜索表单选择何种排序,都可以正常工作,并且记录始终相同。