Búsqueda de administración de WordPress: Ampliación de los resultados

Publicado: 2021-01-20

A veces, encontrar contenido en un sitio web puede ser difícil. Como administrador de WordPress, cuanto más fácil sea encontrar el contenido que busca, mejor. Afortunadamente, WordPress proporciona una función de búsqueda en la mayoría de las pantallas de administración que usará (por ejemplo, la pantalla de Publicaciones). Si bien esta función de búsqueda es buena, sin embargo, está limitada de varias maneras.

Por ejemplo, si busca una publicación en la pantalla de administración de Publicaciones, la función de búsqueda, de manera predeterminada, buscará el texto de la consulta de búsqueda en el título de la publicación, el extracto de la publicación y el contenido de la publicación y luego devolverá esos resultados. Pero, ¿qué sucede si desea buscar con palabras clave relacionadas con un campo personalizado? Esta información no está incluida en los resultados de búsqueda de la tabla de la lista de publicaciones del administrador, lo que puede ser frustrante.

En un artículo anterior, aprendimos cómo agregar un campo personalizado en nuestros tipos de publicaciones. Echemos un vistazo a cómo podemos incluir un campo personalizado en los resultados de búsqueda también.

Ampliar la consulta de búsqueda en la pantalla de administración Buscar

En nuestro ejemplo trabajado sobre campos personalizados, creamos un campo personalizado llamado 'fuente' en una de nuestras publicaciones e insertamos un valor de URL.

Si ingresa a la tabla de la lista de publicaciones y usa uno de estos valores de 'fuente' en la barra de búsqueda, no obtendrá ningún resultado, ya que WordPress simplemente no mira los campos personalizados cuando busca de manera predeterminada.

Para cambiar esto, necesitaremos extender el gancho original que proporciona WordPress para la función de búsqueda. El enlace que tenemos que extender es el pre_get_posts que se incluye en el archivo wp-includes/class-wp-query.php alrededor de la línea 1779 dentro de la función get_posts .

La consulta de WordPress

Cada vez que visita una página, ya sea en la vista frontal o en el área de administración, se ejecuta una cadena de scripts de código para crear el objeto WP_Query correspondiente a su solicitud, junto con sus propiedades.

Vamos a crear una vista temporal de algunos de los resultados de las propiedades de la consulta para comprender qué cambios ocurren en el objeto WP_Query en cada caso.

Para ver la consulta antes de que se ejecute, agregaremos la impresión en el gancho de acción pre_get_posts . El filtro pre_get_posts se activa después de que se crea el objeto de la variable de consulta, pero antes de que se ejecute la consulta real.

En el archivo functions.php de su tema activo, inserte este fragmento de código:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Ahora, si visita la pantalla de administración de Publicaciones, los resultados de query y query_var se imprimirán en la parte superior.

Para ver el código más fácilmente, puede copiarlo y pegarlo en un embellecedor de PHP gratuito en línea.

La $GLOBALS['wp_query']->query (primero en salir) se verá así:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

En el caso de una búsqueda en la pantalla de administración de Publicaciones, por ejemplo, la salida de la matriz cambiará, incluida la cadena de búsqueda. Si buscamos 'wordpress.org' por ejemplo, se verá así:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Ensamblar el código

Con la información anterior en mente, insertaremos el código correcto para lograr la función de búsqueda que requerimos. Para hacer esto, regresa a functions.php de tu tema activo y elimina el código que insertaste hace unos momentos en el paso anterior. Luego inserte el código a continuación:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

El siguiente paso es cambiar las $post_type y $custom_fields a valores que se apliquen a sus requisitos. Veamos lo que hicimos en el código.

  • $post_type = 'post'; – Aquí definimos el tipo de publicación que queremos buscar.
  • $custom_fields = array("source",); – Aquí definimos los campos personalizados que queremos buscar.

Debido a que estamos trabajando con el pre_get_posts , es importante asegurarse de que en nuestro código apliquemos nuestra extensión de búsqueda personalizada mientras estamos en la página correcta. Para decirle a WordPress que muestre nuestro código bajo condiciones específicas, usamos algunas etiquetas condicionales.

  • El if ( ! is_admin() ) return; condición asegura que si no estamos en el área de administración, ninguno de nuestros códigos se ejecutará.
  • El if ( $query->query['post_type'] != $post_type ) verifica si trabajamos en el tipo de publicación que hemos definido en la variable $post_type . En nuestro caso, post .
  • El $search_term = $query->query_vars['s']; es donde mantenemos la cadena de búsqueda en una variable y luego la configuramos para que quede vacía nuevamente $query->query_vars['s'] = ''; de lo contrario no encontrará nada.

Ahora, con estas actualizaciones en su lugar, si actualiza la última búsqueda obtendrá los resultados correctos. En nuestro caso, vemos la publicación 'Publicación 1' en los resultados que incluye una entrada de campo personalizado 'fuente': 'https://dev. wordpress.org/reference/functions/add_post_meta/ '.

mejorar la búsqueda de administrador de wordpress

Ampliar la consulta de búsqueda en la búsqueda de la vista frontal

Ahora que hemos "arreglado" nuestra búsqueda de administrador, podemos pasar a mejorar nuestra función de búsqueda frontal para que los usuarios de nuestro sitio web también puedan buscar campos personalizados.

De la misma manera que anteriormente la búsqueda del administrador no arrojaba resultados para los campos personalizados, la búsqueda frontal tampoco arroja ningún resultado para los campos personalizados.

Idealmente, queremos que los usuarios puedan buscar estos campos. En este ejemplo, tenemos un campo 'fuente' personalizado en una de nuestras publicaciones que actualmente contiene la URL 'https://dev.wordpress.org/reference/functions/add_post_meta/'. Si un usuario busca 'wordpress.org', esta publicación debería aparecer en los resultados. Averigüemos cómo hacerlo.

El código requerido

Dirígete a tu archivo functions.php nuevamente y copia el código que pegaste anteriormente. Ahora, pegue esto directamente debajo de ese código (para que tenga dos copias de este código en functions.php ) Ahora, cambie el nombre de la función en este segundo lote de código a algo como extend_front_search . Debe tener un aspecto como este:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

A continuación, debemos eliminar el if ( $query->query['post_type'] != $post_type ) return; condición.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Solo necesitamos mantener la condición if( is_admin() ) return; para asegurarnos de que el código se aplicará solo en la parte delantera y estamos listos para comenzar.

Una estrategia alternativa

Otra forma de ampliar la búsqueda de WordPress para incluir campos personalizados es modificando la consulta SQL.

La clase WP_Query te ayuda con eso dividiéndola en partes como se describe en la línea 2897 del archivo wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Como hemos mencionado antes en los artículos de campos personalizados, todos los datos de los campos personalizados se almacenan en la base de datos en la tabla 'postmeta' que no está incluida en la búsqueda de WordPress de forma predeterminada. Así que nuestro primer paso es unir estas dos tablas usando el siguiente código:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Usamos el gancho posts_join , por supuesto, ya que filtra la cláusula JOIN de la consulta.

A continuación, usaremos el gancho posts_where para modificar la parte WHERE de la consulta para satisfacer nuestras necesidades.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $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 ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Por último, pero no menos importante, debemos evitar los duplicados. Para lograr esto, usamos el gancho posts_distinct que filtra la cláusula DISTINCT de la consulta.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Ahora veamos qué sucede en la interfaz si buscamos la cadena "wordpress.org".

búsqueda de wordpress en la parte delantera

Como era de esperar, los resultados son correctos esta vez. La búsqueda de WordPress encontró "publicación 1" como resultado, ya que contiene el campo 'fuente' con el valor 'https://dev. wordpress.org /referencia/funciones/add_post_meta/

Tipos de publicaciones personalizadas en los resultados de búsqueda de WordPress

Otra cosa que quizás quieras hacer es hacer que los tipos de publicaciones personalizadas se puedan buscar (si no estás seguro de cómo crear un tipo de publicación personalizado, asegúrate de consultar nuestros artículos sobre esto aquí).

Imaginemos que hemos creado un tipo de publicación personalizado llamado 'libros' y queremos que este tipo de publicación aparezca en los resultados de búsqueda. Esta vez no tenemos que volver a crear la consulta SQL, solo redefinir los tipos de publicación en el pre_get_posts como se muestra a continuación. El código debe colocarse una vez más en el archivo functions.php .

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

Lo que hicimos aquí fue agregar los tipos de publicación deseados para incluirlos en los resultados de búsqueda como argumentos para el post_type .

Si desea excluir un tipo, simplemente elimínelo de la matriz.

Conclusión

Mejorar la búsqueda en su sitio web de WordPress puede ser realmente útil y un gran ahorro de tiempo. Para su usuario final, también es importante que pueda buscar tanto tipos de publicaciones personalizadas como campos personalizados. Con suerte, las instrucciones anteriores le han dado una idea de cómo lograr esto en su propio sitio web.