Creo que el problema se relaciona esencialmente con la estructura de consulta SQL y no soy un experto ...
Necesito buscar publicaciones (tipo de publicación personalizada) por 2 parámetros:
pd_city
pd_country
Tenga en cuenta que la relación meta_query es 'OR', por lo que si cualquiera de los dos anteriores es LIKE, deberíamos tener algunos resultados.
¡La tercera clave (es_patrocinada) se usa para ordenar las publicaciones! Puede ser 1 o 0 y las publicaciones cuyo valor "es_patrocinado" es igual a 1 deben aparecer en la parte superior.
Así que aquí está lo de WordPress:
    $sfp_query_args = array(
        'sfp_complex_search' => 'yeap', 
        'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $term_id ) ),
        //'meta_key' => 'is_sponsored',
        'post_type' => 'sfpposts',
        'post_status' => 'publish',
        'showposts' => (int)$per_page,
        'paged' => $paged, 
        'meta_query' => array( 'relation' => 'OR', 
                array( 'key' => 'pd_city', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ), 
                array( 'key' => 'pd_country', 'value' => $sfp_search_meta, 'compare' => 'LIKE' ), 
                array( 'key' => 'is_sponsored' )
                )
    );
$sfp_search = new WP_Query( $sfp_query_args );
También necesito filtrar los resultados con "posts_orderby" para que los patrocinados lleguen a la cima:
add_filter( 'posts_orderby', 'sfp_modify_search' );
function sfp_modify_search( $orderby ) {
    if( !is_admin() && is_page( $this->options[ 'sfp_page_entries_search' ] ) ) {
        global $wpdb;
        $orderby = " CASE WHEN mt2.meta_value = 0 THEN 1 END, $wpdb->posts.post_date DESC ";
    }
    return $orderby;
}
El problema real se basa en que con esta consulta se devuelven TODAS LAS PUBLICACIONES de "sfp_post_category", no solo las que coinciden con "pd_city" o "pd_country" porque TODAS LAS PUBLICACIONES TIENEN metaclave "patrocinada" (y el valor establecido en 1 o 0). Una vez más: ¡se necesita "es_patrocinado" para ordenar!
Cuando var_dump
var_dump( $sfp_search->request );
... WordPress 'sql se ve así:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE 1=1 
AND ( wp_term_relationships.term_taxonomy_id IN (77) ) 
AND wp_posts.post_type = 'sfpposts' 
AND (wp_posts.post_status = 'publish') 
AND ( (wp_postmeta.meta_key = 'pd_city' 
AND CAST(wp_postmeta.meta_value AS CHAR) 
LIKE '%something%') 
OR (mt1.meta_key = 'pd_country' 
AND CAST(mt1.meta_value AS CHAR) 
LIKE '%something%') 
OR mt2.meta_key = 'is_sponsored' ) 
GROUP BY wp_posts.ID 
ORDER BY CASE WHEN mt2.meta_value = 0 THEN 1 END, wp_posts.post_date DESC 
LIMIT 0, 10
¿Cómo elimino todas las publicaciones que no coinciden con "pd_city" o "pd_country" de los resultados?
fuente
