Cómo resaltar términos de búsqueda sin plugin
4 respuestas
- votos
-
- 2011-05-01
Agregaestas 2funciones atufunctions.php
function search_excerpt_highlight() { $excerpt = get_the_excerpt(); $keys = implode('|', explode(' ', get_search_query())); $excerpt = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $excerpt); echo '<p>' . $excerpt . '</p>'; } function search_title_highlight() { $title = get_the_title(); $keys = implode('|', explode(' ', get_search_query())); $title = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $title); echo $title; }
Editar:
Para utilizarthe_contentpara los resultados de subúsqueda,utilice lafunción siguiente:
function search_content_highlight() { $content = get_the_content(); $keys = implode('|', explode(' ', get_search_query())); $content = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $content); echo '<p>' . $content . '</p>'; }
En su archivo loop o search.php,llame a
<?php search_title_highlight(); ?>
en lugar de<?php the_title(); ?>
y utilice<?php search_excerpt_highlight(); ?>
en lugar de<?php the_excerpt(); ?>
En su CSS,agregue la clase de resaltado debúsqueda que resaltarátodas laspalabrasbuscadasen amarillo.
.search-highlight { background:#FFFF00 }
Add these 2 functions to your functions.php
function search_excerpt_highlight() { $excerpt = get_the_excerpt(); $keys = implode('|', explode(' ', get_search_query())); $excerpt = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $excerpt); echo '<p>' . $excerpt . '</p>'; } function search_title_highlight() { $title = get_the_title(); $keys = implode('|', explode(' ', get_search_query())); $title = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $title); echo $title; }
Edit:
To use the_content for your search results use the function below:
function search_content_highlight() { $content = get_the_content(); $keys = implode('|', explode(' ', get_search_query())); $content = preg_replace('/(' . $keys .')/iu', '<strong class="search-highlight">\0</strong>', $content); echo '<p>' . $content . '</p>'; }
In your loop or search.php file call
<?php search_title_highlight(); ?>
instead of<?php the_title(); ?>
and use<?php search_excerpt_highlight(); ?>
instead of<?php the_excerpt(); ?>
In your css add the search-highlight class which will highlight all searched words in yellow.
.search-highlight { background:#FFFF00 }
-
Aplique [`preg_quote ()`] (http://php.net/preg_quote) a `$ keys`paraevitar que suexpresión regularexploteen caso de caracteresespeciales comoparéntesis o corchetes.Apply [`preg_quote()`](http://php.net/preg_quote) to `$keys` to prevent your regex from blowing up in case of special characters like parentheses or brackets.
- 4
- 2011-05-01
- Geert
-
¿Qué hay de resaltareltérmino debúsqueda después de queel usuario hace clicen el sencillo yentraen lapublicación?Luego,**get_search_query () ** devuelve una cadena vacíaWhat about highlighting the search term after the user clicks on the single and goes inside the post? Then the **get_search_query()** returns an empty string
- 1
- 2011-05-22
- Maor Barazany
-
Esos deberían serfiltrospara `the_excerpt` y`the_content`en su lugar.Detodosmodos: Buena respuesta,peroel comentario de @Geertpodríafuncionar :)Those should be filters for `the_excerpt` and `the_content` instead. Anyway: Nice answer, but the comment from @Geert could be worked in :)
- 1
- 2012-10-13
- kaiser
-
tambiénestá reemplazandoeltextoen readmore href?¿Cómo arreglaresto?it is replacing the text in the readmore href also? how to fix this?
- 1
- 2014-01-13
- Naveen
-
- 2014-12-09
Lo anteriorfuncionabien. Heejecutado un código similar,pero unireltítulo yelextracto.Pero descubrió que se rompe cuando alguieningresa unespacio "" alprincipio o alfinal de untérmino de consulta debúsqueda.
Así que agreguéesta línea:
$keys = array_filter($keys);
// Add Bold to searched term function highlight_results($text){ if(is_search() && !is_admin()){ $sr = get_query_var('s'); $keys = explode(" ",$sr); $keys = array_filter($keys); $text = preg_replace('/('.implode('|', $keys) .')/iu', ''.$sr.'', $text); } return $text; } add_filter('the_excerpt', 'highlight_results'); add_filter('the_title', 'highlight_results');
Espero queesto ayude a otros.
The above works well I've run the similar code, but tie the title and excerpt together. But found it breaks when someone enters a space " " either at the beginning or end of a search query term.
So Ive add this line:
$keys = array_filter($keys);
// Add Bold to searched term function highlight_results($text){ if(is_search() && !is_admin()){ $sr = get_query_var('s'); $keys = explode(" ",$sr); $keys = array_filter($keys); $text = preg_replace('/('.implode('|', $keys) .')/iu', ''.$sr.'', $text); } return $text; } add_filter('the_excerpt', 'highlight_results'); add_filter('the_title', 'highlight_results');
Hope this proves to help others.
-
- 2015-07-27
Las soluciones anteriores rompen lapágina sieltérmino debúsqueda aparece dentro deetiquetas HTML.Deberías usar algo como:
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu'; $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
The above solutions break the page if the search term appears inside HTML tags. You should use something like:
$regEx = '\'(?!((<.*?)|(<a.*?)))(\b'. implode('|', $keys) . '\b)(?!(([^<>]*?)>)|([^>]*?</a>))\'iu'; $text = preg_replace($regEx, '<strong class="search-highlight">\0</strong>', $text);
-
- 2020-03-02
Combina 2 respuestaspara usarfiltros:
// Add class to searched terms function highlight_results($text) { if (is_search() && !is_admin()) { $sr = get_query_var('s'); $keys = explode(' ', $sr); $keys = array_filter($keys); $text = preg_replace('/('.implode('|', $keys) .')/iu', '<span class="search-highlight">\0</span>', $text); } return $text; } add_filter('the_excerpt', 'highlight_results'); add_filter('the_title', 'highlight_results');
Luego,en su CSS (porejemplo):
.search-highlight { background: #ffff94; padding: 0 2px; }
Combined 2 answers to use filters :
// Add class to searched terms function highlight_results($text) { if (is_search() && !is_admin()) { $sr = get_query_var('s'); $keys = explode(' ', $sr); $keys = array_filter($keys); $text = preg_replace('/('.implode('|', $keys) .')/iu', '<span class="search-highlight">\0</span>', $text); } return $text; } add_filter('the_excerpt', 'highlight_results'); add_filter('the_title', 'highlight_results');
Then in your CSS (for example) :
.search-highlight { background: #ffff94; padding: 0 2px; }
¿Cómopuedo resaltar lostérminos debúsqueda sin un complemento?