He estado jugando con fragmentos de código que agregan metadatos a las búsquedas administrativas.
El mejor fragmento que encontré fue escrito por Stefano sobre esta pregunta .
Sin embargo, parece tener 1 error molesto al buscar términos no meta.
Aquí hay algunas capturas de mi instalación de desarrollo local. Imprimí las 2 consultas MySQL en la pantalla.
Vista de la única publicación de CPT que estoy usando para probar
Este es el código que funciona como se esperaba y me permite buscar metadatos del administrador
Desafortunadamente, el código crea duplicados en coincidencias no meta, en este caso en el título de la publicación
Una captura que muestra el estado de la publicación, el tipo de publicación y los antepasados de los engañados
Aquí está el código que estoy ejecutando, es básicamente el mismo que el de Stefano, pero con mis crudos intentos de hacer que la consulta funcione.
/*
* Search custom fields from admin keyword searches
*/
function rel_search_join( $join ) {
global $pagenow, $wpdb;
if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type'] == 'listings' && $_GET['s'] != '') {
$join .= 'LEFT JOIN ' . $wpdb->postmeta . ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
echo '<br><strong>JOIN</strong>: ';
print_r ( $join );
echo '<br>';
return $join;
}
add_filter('posts_join', 'rel_search_join' );
function rel_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_admin() && $pagenow == 'edit.php' && $_GET['post_type']=='listings' && $_GET['s'] != '' ) {
$where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
$where = str_replace( "OR wp_posts.post_status = 'pending'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'private'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'draft'", "", $where );
$where = str_replace( "OR wp_posts.post_status = 'future'", "", $where );
}
echo '<br><strong>WHERE</strong>: ';
print_r ( $where );
echo '<br>';
return $where;
}
add_filter( 'posts_where', 'rel_search_where' );
plugin-development
custom-field
wp-admin
search
jnthnclrk
fuente
fuente
Respuestas:
Una
GROUP BY
declaración puede agrupar sus publicaciones después deJOIN
. Para Wordpress puedes usar elposts_groupby
filtro.fuente
Gracias por su trabajo en esto, amigos. Este código me llevó casi todo el camino, pero al usar WP 3.8 estaba obteniendo un error de tabla / alias no único de SQL, así que hice algunos cambios. Para que funcione en mi configuración, tuve que establecer un alias $ wpdb-> postmeta que se usó en la declaración JOIN. También verifico solo verifica una vez para ver si los ganchos deben usarse para que no se disparen siempre. ¡Espero que esto ayude a alguien!
fuente