元查询中带有LIKE运算符的通配符

时间:2016-07-21 作者:Naz

我在页面上有一个带有位置字段的搜索属性表单,我使用以下元查询来处理搜索;

$location = preg_replace(\'/^-|-$|[^-a-zA-Z0-9]/\', \'\', $_GET[\'location\']); 

    $meta_query = array( \'relation\' => \'AND\' );
    if($location) {
        $meta_query[] = array(
            \'relation\' => \'OR\',
            array(
                \'key\' => \'property_country\',
                \'value\' => $location,
                \'compare\' => \'LIKE\'
            ),
            array(
                \'key\' => \'property_city\',
                \'value\' => $location,
                \'compare\' => \'LIKE\'
            ),
            array(
                \'key\' => \'property_location\',
                \'value\' => $location,
                \'compare\' => \'LIKE\'
            )
        );
    }
但是,如果搜索新的,效果很好,但如果搜索纽约,则不会返回任何结果。如何解决此问题?是否有方法在$location? 我尝试添加\'*\'.$location.\'*\' 但那没什么用。

2 个回复
SO网友:FaCE

你有吗var_dump教育部$location?

WP_Query\'smeta_query 使用类WP_Meta_Query, 它会自动将“%”附加到传递给它的任何字符串的前面:

// From wp-includes/class-wp-meta-query.php:610 
switch ( $meta_compare ) {
            // ...
            case \'LIKE\' :
            case \'NOT LIKE\' :
                $meta_value = \'%\' . $wpdb->esc_like( $meta_value ) . \'%\';
                $where = $wpdb->prepare( \'%s\', $meta_value );
                break;
            // ...
}
所以也许可以尝试使用(string) $location 当sql语句准备好时,需要一个字符串——这就是%s 行中的平均值$where = $wpdb->prepare( \'%s\', $meta_value );. 您可以将变量强制转换为如下字符串:

$location = (string) preg_replace(\'/^-|-$|[^-a-zA-Z0-9]/\', \'\', $_GET[\'location\']);

SO网友:FaCE

尝试使用通配符连接字符串:

$location = implode(\'%\', explode($location, \' \'));

相关推荐