Búsqueda SOLO por meta clave / meta valores

4

Ya casi estoy allí en este caso.

En functions.php tengo esto:

function base_home_product_post_type( $query ) {

    if($query->is_search() && $_POST['box'] == 'sku') {
        $query->query_vars['post_type'] = 'product';
        $query->query_vars['meta_key'] = 'sku';
        $query->query_vars['meta_value'] = $query->query_vars['s'];
        return;
    }

}
add_action('pre_get_posts', 'base_home_product_post_type', 1);

Y hace lo que se dice. Busca la cadena de búsqueda en la meta_key 'sku'. El problema aquí es que, de forma predeterminada, el objeto de consulta devuelto por WordPress también contiene esto y las consultas post_title y post_content de forma predeterminada:

SELECT SQL_CALC_FOUND_ROWS  whirl_2_posts.ID FROM whirl_2_posts  INNER JOIN whirl_2_postmeta ON (whirl_2_posts.ID = whirl_2_postmeta.post_id) WHERE 1=1  AND (((whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%')  OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%')))

Realmente no quiero eso cuando busco solo el valor "sku", así que intenté eliminarlo usando posts_where y un REGEX bastante feo como este (advertencia, hacky and buggy):

function get_rid_of_titles($search) {
    if(is_search() && $_POST['box'] == 'sku') {
    $search = preg_filter('|AND\s\({3}\w*\.post_title\sLIKE\s\'\%[^%]*\%\'\) OR \(\w*\.post_content\sLIKE\s\'\%[^%]*\%\'\){3}\s|', '', $search);
    }
    return $search;
}
add_filter('posts_where','get_rid_of_titles');

Pero sin suerte. ¿Alguien puede indicarme cómo hacer para buscar en onlu el valor personalizado en este caso?

SOLUTION

Gracias a @kaiser a continuación, obtuve este trabajo:

function get_rid_of_titles($search) {

    if(is_search() && $_POST['box'] == 'sku') {

          $sku = $_POST['s'];          // get search string
          $needle = "LIKE '%$sku%'";   // search only for LIKE '%_SEARCH_STRING_%'. This is a multisite environment, so involving table names directly is a bad idea
          $replace = "LIKE '%'";       // replace it with SQL Wildcard so any title and any content are welcome
          $count = 2;                  // only the first 2 occurrencies which happen to be post_title and post_content
          return str_replace($needle,$replace,$search, $count);

    }
}
add_filter('posts_where','get_rid_of_titles');
    
pregunta moraleida 30.08.2012 - 03:12

1 respuesta

2

Podrías hacer dos cosas:

A) reemplaza la búsqueda con una consulta SQL que solo busca en la tabla postmeta (más rápido porque no hay JOIN involucrado; puedes obtener la publicación a través de su ID más adelante, cuando se muestran los resultados).

B) Divide la cadena justo después de WHERE 1=1 y suelta la parte posterior. Puedes usar un simple return str_replace( $query_part_below, '', $search ); .

 AND (
    (whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%')  
    OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%')
)

Asegúrese de que $wpdb->prepare() correctamente antes de volver a insertarlo.

    
respondido por el kaiser 30.08.2012 - 03:55

Lea otras preguntas en las etiquetas