按 DESC 和 ASC 排序搜索结果
Posted
技术标签:
【中文标题】按 DESC 和 ASC 排序搜索结果【英文标题】:Ordering search results by DESC and ASC 【发布时间】:2011-07-04 16:54:15 【问题描述】:在 searchresults.php 中
当我选择“价格升序”时,它可以正常工作,但会将所有属性加载到页面上。例如,当我搜索亚利桑那州,然后从选择中选择“价格升序”,它在亚利桑那州没有订购属性,它会在页面上加载所有属性,然后按“价格升序”排序。
谢谢
您可以在 sedefemlak.com 上观看直播
搜索结果.php
<div id="resultsorder" style="">
<form name="formorder" method="POST" action="<?php bloginfo('url'); ?>/?page_id=<?php echo $wp_searchpageid; ?>">
<select name="resultsorder" onChange="formorder.submit();">
<option>Order</option>
<option>Date Descending</option>
<option>Date Ascending</option>
<option>Price Descending</option>
<option>Price Ascending</option>
<option>Random</option>
</select>
</form>
</div>
search_query.php
if($resultsorder)
//get value from order dropdown on search results page
$resultsorder = $resultsorder;
else
$resultsorder = get_option('wp_searchorder');
switch ($resultsorder)
case "Price Descending":
$metakey = 'price_value';
$order = 'DESC';
$orderby = 'meta_value_num';
break;
case "Price Ascending":
$metakey = 'price_value';
$order = 'ASC';
$orderby = 'meta_value_num';
break;
case "Date Descending":
$metakey = '';
$order = 'DESC';
$orderby = 'date';
break;
case "Date Ascending":
$metakey = '';
$order = 'ASC';
$orderby = 'date';
break;
case "Random":
$metakey = '';
$order = '';
$orderby = 'rand';
break;
if (!empty($_ids) && !$alllistings)
$wpq = array ('post_type' => 'listing', 'meta_key' => $metakey, 'orderby' => $orderby, 'order' => $order, 'post__in' => $_ids, 'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => 9999 );
elseif (empty($_ids) && !$alllistings)
// $_ids array is empty because search got no results
// $_ids array will be empty if page is an "All Listings" page. Don't run this code if is All Listings because All Listings will show all listings. This code will display "no results found"
$wpq = array ('post_type' =>'listing', 'meta_key' => $metakey, 'orderby' => $orderby, 'order' => $order, 'post__in' => array('0'),'post_status' => 'publish', 'paged' => $paged, 'posts_per_page' => 9999);
elseif ($alllistings)
// This is an All Listings page, so show all results
$wpq = array ('post_type' =>'listing', 'paged' => $paged, 'meta_key' => $metakey, 'orderby' => $orderby, 'order' => $order, 'post_status' => 'publish', 'posts_per_page' => 9999);
$listing = new WP_Query($wpq);
【问题讨论】:
【参考方案1】:据我了解,您遇到的问题是,当您从搜索结果页面中选择一个排序选项时,排序有效,但页面显示所有记录,而不是仅限于原始搜索的结果.
发生这种情况是因为您的“formorder”表单(在发布的 searchresults.php 文件中)在提交时没有传递任何搜索参数。当用户从“resultsorder”选择框中选择一个选项时,“formorder”表单被提交。但是该表单只提交了一条数据,即排序顺序。因此,脚本 search_query.php 不会接收任何包含有关原始搜索内容的信息的 $_POST 或 $_GET 数据。这意味着到达了 search_query.php 中的最后一个“elseif ($alllistings) ”子句。换句话说,随着“resultsorder”表单的提交,原始搜索数据会丢失,并且您在 search_query.php 中的脚本会继续执行,就好像它有显示所有列表的请求一样。
您需要做的是将原始搜索参数作为隐藏标签包含在“resultsorder”表单中。隐藏字段的 html 如下所示:
<input type="hidden" id="searchLocation" name="searchLocation" value="California" />
隐藏字段允许您在提交表单时将数据传递给脚本,而用户不会看到页面上显示的数据。这让您的“resultsorder”表单可以传递当前搜索参数以及选择的排序顺序。这样一来,您的脚本在应用排序顺序时,也会有数据将其结果限制在最初显示的范围内。
所以在“searchresults.php”里面你应该有这样的东西:
<form name="formorder" method="POST" [ETC]>
<select name="resultsorder" onChange="formorder.submit();">
[OPTIONS]
</select>
<input type="hidden" name="location_level1" id="location_level1"
value="<?php echo $location_level1; ?>" />
<input type="hidden" name="beds" id="beds" value="<?php echo $beds; ?>" />
</form>
等等,不管有多少隐藏字段,您都需要包含所有搜索参数。
【讨论】:
以上是关于按 DESC 和 ASC 排序搜索结果的主要内容,如果未能解决你的问题,请参考以下文章