2014-03-05 34 views
0

如果你看到下面的代碼時,我們通過這些ARGS在WP_QUERY它會生成一個查詢,將包裹%左右的測試 像這樣的事情如何在meta_query wordpress中的搜索條件之前包裝WildCard?

" AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%test%')) " 

是否有可能,我想在「開始只有%測試'字符串?

$args = array(
    'post_type' => 'job_listing', 
    'post_status' => 'publish', 
    'orderby' => 'date', 
    'order' => 'DESC', 
    'meta_query' => array(
     array(
      'key' => 'geo_address', 
      'value' => 'test', 
      'compare' => 'LIKE' 
    ) 
    ) 

); 

回答

0

您不能那樣做,因爲wp_query會自動添加%..%。但是,您可以使用自定義查詢來做到這一點;

global $wpdb; 

$specific_posts = $wpdb->get_results("SELECT * FROM `wp_posts` WHERE 
post_type='job_listing' AND post_status ='publish' AND ID 
IN(
SELECT post_id FROM `wp_postmeta` WHERE meta_key='geo_address' 
AND meta_value LIKE '%test' 
) ORDER BY post_date DESC"); 

編輯:如果你不想這樣做與自定義查詢,則需要使用WP喜歡的posts_where行動;

add_filter('posts_where', 'custom_posts_where', 10, 2); 
function custom_posts_where($where, &$wp_query) 
{ 
    global $wpdb; 
    if ($custom_post_meta_value = $wp_query->get('custom_value')) { 
     $where .= ' AND ' . $wpdb->postmeta . '.meta_key = "geo_address" AND ' . $wpdb->postmeta . '.meta_value LIKE \'' . esc_sql(like_escape($custom_post_meta_value)) . '\''; 
    } 
    return $where; 
} 

並且在您的查詢中,像下面一樣使用它;

$args = array(
    'post_type' => 'job_listing', 
    'post_status' => 'publish', 
    'orderby' => 'date', 
    'order' => 'DESC', 
    'meta_query' => array(
     array(
      'key' => 'geo_address', 
      'custom_value' => '%test', 
      'compare' => 'LIKE' 
    ) 
    ) 

); 
+0

我不想使用自定義查詢的Cuz有很多條件,我使用在args ..我有通過這個唯一的 –

+0

找到辦法@Huseyin,你的WHERE子句中有一些語法錯誤。你需要在雙引號之間加上你的$ where。=行。 –

0

里爾是另一種解決方案,我認爲虐待嘗試兩個

function filter_meta_query($pieces) { 

    if (!empty($pieces['where'])) { 
     $pieces['where'] = preg_replace('/(.*?)LIKE \'\%(.*?)\%\'/', "\$1LIKE '\$2%'", $pieces['where']); 
    } 

    return $pieces; 
} 


add_filter('get_meta_sql', 'filter_meta_query'); 

$args = array(
    'meta_query' => array(
     array(
      'key' => 'any_key', 
      'compare' => 'LIKE', 
      'value' => '%test' 
     ) 
    ) 
); 

// the query 
$query = new WP_Query($args); 

// remove it after the query. 
remove_filter('get_meta_sql', 'filter_meta_query');