2017-02-01 61 views
1

我正在使用wordpress。一些產品價格不是數字,他們就像P.O.R. (價格應要求)。我有一個過濾器,將價格從低到高和從高到低排序。下面你可以看到我的排序代碼:比較/排序價格並將文本價格推到結果的底部 - PHP

低到高

$args = array(
    'post_type' => 'products', 
    'meta_key' => 'product_price', 
    'orderby' => 'meta_value_num', 
    'order' => 'ASC', 
    'posts_per_page'=> -1 
); 
$post_list = get_posts($args); 

前高後低

$args = array(
    'post_type' => 'products', 
    'meta_key' => 'product_price', 
    'orderby' => 'meta_value_num', 
    'order' => 'DESC', 
    'posts_per_page'=> -1 
); 
$post_list = get_posts($args); 

上面的代碼工作它應該如何。當字符串與一個整數進行比較時,它被視爲0,這就是爲什麼第一種情況(低到高)的產品與P.O.R.在第二種情況下(從高到低)他們在底部。但我希望P.O.R.項目總是在底部。研究了很多東西,但沒有找到解決辦法。請有任何想法嗎?

回答

1

一個簡單的解決辦法是排除來自低到高查詢POR的和寫的只是查詢POR產品的附加查詢,然後用低到高查詢合併。要排除從查詢POR的,你可以添加一個meta_compare

$nonpor = array(
    'post_type' => 'products', 
    'meta_key' => 'product_price', 
    'meta_value_num' => '0', 
    'meta_compare' => '>' 
    'orderby' => 'meta_value_num', 
    'order' => 'ASC', 
    'posts_per_page'=> -1 
); 

這將讓你所有具有價格文章列表,沒有POR的:接下來我們對它們進行查詢:

$por = array(
    'post_type' => 'products', 
    'meta_key' => 'product_price', 
    'meta_value_num' => '0', 
    'meta_compare' => '=' 
    'posts_per_page'=> -1 
); 

現在我們合併結果:

$regular = new WP_Query($nonpor); 
$pors = new WP_Query($por); 

//create a new, blank query object 
$combined = new WP_Query(); 

// put the combined data into the new query 
$combined->posts = array_merge($regular->posts, $pors->posts); 

//set the post count if you need it 
$result->post_count = count($result->posts); 
//finally get the post list 
$post_list = $combined->posts; 

用您的低到高代替這個,你應該很好。

+0

是的想法很簡單,很好。但它不是我們想要的''meta_value_num'=>'0','沒有'por'項目,因爲por項目的價格只是P.O.R.而不是0.任何想法? – aidadev

+0

您在您的問題中寫道,當一個字符串與一個整數進行比較時,它被視爲零。你確定它不被視爲1?在這種情況下,您可以將其更改爲'meta_value_num'=>'1'。 對於第一個查詢和''meta_value'=>'POR','meta_compare'=>'meta_value'=>'POR','meta_compare'=>'!=' '=''第二個應該工作。讓我知道:) –

+0

謝謝。我已經更新了你的答案並被接受了。 @L L – aidadev