Necesito hacer un WP_Query
con un LIKE
en el post_title
.
Empecé con este regular WP_Query
:
$wp_query = new WP_Query(
array (
'post_type' => 'wp_exposants',
'posts_per_page' => '1',
'post_status' => 'publish',
'orderby' => 'title',
'order' => 'ASC',
'paged' => $paged
)
);
Pero lo que realmente quiero hacer se ve así en SQL:
$query = "
SELECT *
FROM $wpdb->posts
WHERE $wpdb->posts.post_title LIKE '$param2%'
AND $wpdb->posts.post_type = 'wp_exposants'
ORDER BY $wpdb->posts.post_title
";
$wpdb->get_results($query);
La salida imprime los resultados que estoy esperando, pero utilizo el habitual <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
para mostrar los resultados.
Y eso no está funcionando $wpdb->get_results()
.
¿Cómo puedo lograr lo que describí aquí?
$wpdb->prepare()
.prepare()
.$wpdb->prepare('LIKE "%s%%"', 'banana')
volvería"LIKE ''banana'%'"
, por lo que tenemos que construir la consulta nosotros mismos y también hacer el escape.prepare()
. Sí, eso es complicado y tuve que intentarlo varias veces antes de solucionarlo. De algo que acabo de hacer:$wpdb->prepare( ' AND {$wpdb->posts}.post_title LIKE %s ', esc_sql( '%'.like_escape( trim( $term ) ).'%' ) )
. Y estoy bastante seguro de queesc_sql()
es innecesario y solo paranoico.'
(apóstrofe) dentro. Supongo que es por escapar? Todavía no encontré la soluciónSimplificado:
fuente
Quería actualizar este código en el que trabajaron para WordPress 4.0 y superior, ya que esc_sql () está en desuso en 4.0 superior.
El resto de las cosas es igual.
También quiero señalar que puede usar la variable s dentro de los argumentos WP_Query para pasar los términos de búsqueda, que también buscará el título de la publicación, creo.
Me gusta esto:
fuente
search_prod_title
es exactamente ? ¿Debo cambiar esto a otra cosa?esc_sql
depricated? No es.$wpdb->escape
aunque ... developer.wordpress.org/reference/functions/esc_sqlCon alguna solución vulnerable publicada aquí, vengo con una versión un poco simplificada y desinfectada.
Primero, creamos una función para el
posts_where
filtro que le permite mostrar solo publicaciones que coinciden con condiciones específicas:Ahora agregamos
cc_search_post_title
a nuestros argumentos de consulta:Y finalmente envuelva el filtro alrededor de la consulta:
Usando get_posts ()
Ciertas funciones que recuperan publicaciones no ejecutan filtros, por lo que las funciones de filtro posts_where que adjunte no modificarán la consulta. Si planea usar
get_posts()
para consultar sus publicaciones, debe establecerlosuppress_filters
en falso en su matriz de argumentos:Ahora puedes usar
get_posts()
:¿Qué pasa con el
s
parámetro?El
s
parámetro está disponible:Al agregar su término de búsqueda en el
s
trabajo de parámetros y buscará el título de la publicación, también buscará el contenido de la publicación.¿Qué pasa con el
title
parámetro que se agregó con WP 4.4?Pasar un término de búsqueda al
title
parámetro:Mayúsculas y minúsculas y
LIKE
, no%LIKE%
. Esta búsqueda mediahello
no devolverá la publicación con títuloHello World
oHello
.fuente
Sobre la base de otras respuestas que tengo ante mí, para proporcionar flexibilidad en la situación en la que desea buscar una publicación que contenga una palabra en un metacampo O en el título de la publicación, doy esa opción a través del argumento "title_filter_relation". En esta implementación, solo permito las entradas "OR" o "AND" con un valor predeterminado de "AND".
Aquí hay un ejemplo del código en acción para una publicación muy simple tipo "faq" donde la pregunta es el título de la publicación en sí:
fuente
WP_Query
poder acceder a ellos dentro delposts_where
filtro.