Si os parece, vamos por pasos.
PRIMERO: caja de búsqueda
<form role="search" method="get" class="search-form" action="<?php echo home_url( '/' ); ?>">
<label>
<span class="screen-reader-text"><?php echo _x( 'Search for:', 'label' ) ?></span>
<input type="search" class="search-field"
placeholder="<?php echo esc_attr_x( 'Search …', 'placeholder' ) ?>"
value="<?php echo get_search_query() ?>" name="s"
title="<?php echo esc_attr_x( 'Search for:', 'label' ) ?>" />
</label>
<input type="submit" class="search-submit"
value="<?php echo esc_attr_x( 'Search', 'submit button' ) ?>" />
</form>
Suponiendo que la consulta la voy a llamar «consulta-autores», ¿qué cambio aquí para enlazar con la query que buscará dentro de la tabla wp_terms?
Yo no lo haría en la caja de búsqueda de WordPress. Esa caja utiliza el query string "s"
de WP_Query y hace una búsqueda de posts. No creo que merezca la pena cambiar la funcionalidad de este query string y todo lo que implica. Yo haría mi propio formulario de búsqueda.
¿Algún tutorial para aprender a construir uno? Es que no tengo ni idea sobre esta cuestión.
Yo pregunto, olvidando el formulario ¿Sabrías leer los datos para que muestre sólo autor o autores que coincidan con un criterio de búsqueda? Supongo que si porque ya muestras los autores.
Inventa tu propia búsqueda, lee el dato de la URL y pásalo a la función de búsqueda. De forma similar a como hiciste con la lectura Zen (creo que lo llamabas así).
Después ya introduces un formulario conectando las dos partes.
Aunque estoy seguro de que se puede hacer de otra forma.
Un saludo
Pero lo de zen era para mostrar los post de una forma concreta. Para ello, usaba en single.php
<?php if(isset($_REQUEST['zen'])) { ?>
<?php get_template_part( 'con_zen' ); ?>
<?php } else { ?>
resto código single
Y para acceder, construía un enlace así:
$GLOBALS['$enlace_zen'] = '<a rel="nofollow" href="' . get_permalink(). '?print=print">Activar Lectura Zen</a>';
Lo de $GLOBALS
era porque el enlace se cargaba en el footer.php
La verdad es que no veo la forma de hacerlo según me indicas.
Luego, he encontrado esto:
https://gist.github.com/charleslouis/5924863
y ahí veo algo que podría ser la forma ya que busca dentro de determinadas tablas. El problema es que sobrepasa mis conocimientos.
Me he explicado fatal. Me refería a que usaras una variable en la URL como parámetro de búsqueda para probar el código. Ejemplo:
«almendron.com/tribuna/archivo-por-autores/?autor=adolfo»
Claro que para eso necesitas el código de la búsqueda.
Si tengo un rato lo miro y te digo.
Un saludo
Hacer formularios en WordPress puede enforcarse desde muchas vertientes (realmente muchas).
Por ejemplo, podría ser un shortcode (ejemplo rápido y básico, no probado):
add_shortcode( 'author-search-form', 'cyb_author_search_form' );
function cyb_author_search_form( $atts, $content = null ) {
ob_start();
?>
<form type="get">
<input type="text" name="search-author">
</form>
<?php
if( ! empyt( $_GET['search-author'] ) ) {
$authors = get_terms( 'autor', [ 'name__like' => sanitize_text_field( $_GET['search-author'] ) ] );
foreach( $authors as $author ) {
echo $author->name;
}
}
?>
<?php
return ob_get_clean();
}
Gracias cybmeta. Voy a esperar a ver lo que me pone LGrusin y el fin de semana, que tendré más tiempo, lo pruebo todo.
Pues mirando get_terms resulta que permite pasarle valores de búsqueda. Es decir:
$terms = get_terms( 'autor', array('search'=>$busqueda,));
Siendo $busqueda lo que obtienes de un formulario similar a:
<form name="formulario" method="post" action="">
Buscar: <input type="text" name="dato" value="">
<input type="submit" />
</form>
<?php $busqueda = $_POST['dato']; ?>
Ya con esto lo depuras y adaptas al Tema. Espero que te sirva.
Un saludo
No me había fijado en ese parámetro search
, me lo apunto!!!
De todas formas explico la diferencia que he visto entre lo que hacen name_like
y search
en la función get_terms()
:
– name_like
: hace la búsqueda solo en el campo name (título) del término. Genera una consulta tipo tabla_terminos.name LIKE %string%
– search
hace la búsqueda en el campo name y slug. Genera consulta tipo tabla_terminos.name LIKE %string% OR tabla_terminos.slug LIKE %string%
.
– description_like
: puedes utilizar este parámetro si además quieres buscar también en la desripción del término. Genera consulta tipo tabla_terminos.description LIKE %string%
Ya me disculpareis pero al final no he tenido tiempo para hacer las pruebas. A ver si puedo mañana o pasado y os cuento como ha ido.
Pues funciona 🙂
Salvo un problema, que ahora lo cuento, funciona. Me falta ponerlo bonito pero esta es la solución:
<form name="formulario" method="post" action="">
Buscar: <input type="text" name="dato" value="">
<input type="submit" />
</form>
<?php $busqueda = $_POST['dato']; ?>
<?php $terms = get_terms( 'autor', array('search'=>$busqueda,));
foreach ($terms as $term) {
echo '<li><a href="'. get_term_link($term->slug, 'autor') . '">'. $term->name.'</a></li>' . "\n";
}
?>
El problema es que al entrar en la página de autores, que es donde está puesta la caja de búsqueda, aparecen todos los autores uno detrás de otro. Es como si hubiera hecho una búsqueda.
¿Hay que hace un reset después de la consulta?
Por si sirve, sale:
Notice: Undefined index: dato in C:\xxxx\autores.php on line 33
En la línea 33 tenemos:
<?php $busqueda = $_POST['dato']; ?>
He añadido al código una condición para el caso en que no encuentre nada. Pondré todo el código cuando hayamos resuelto ese pequeño problema que se ha presentado.
Al final he resuelto lo de que salieran todos los autores poniendo otro condicional. En este caso, para comprobar si se había buscado algo:
El código queda así:
<h3>Buscar autores</h3>
<form name="formulario" method="post" action="">
<input type="text" style="float: left; width:300px" name="dato" value="">
<input type="submit" />
</form>
<?php $busqueda = $_POST['dato']; ?>
<?php if (!empty ($busqueda)) : // comprobamos si el usuario ha introducido un valor
$terms = get_terms( 'autor', array('search'=>$busqueda,));
if (!empty ($terms)) : // comprobamos si hay algún resultado
echo '<div class="busqueda_autores">';
echo '<h3>Resultados de la búsqueda</h3>';
foreach ($terms as $term) {
echo '<li><a href="'. get_term_link($term->slug, 'autor') . '">'. $term->name.'</a></li>' . "\n";
}
echo '</div>';
else :
echo '<div class="busqueda_autores">';
echo '<h3>No hay coincidencias</h3>';
echo '</div>';
endif;
endif;
?>
Solo queda por resolver lo de
Notice: Undefined index: dato in C:\xxxx\autores.php on line 33
siendo la línea 33
<?php $busqueda = $_POST['dato']; ?>
He intentado declararla antes del formulario con <?php $_POST['dato'] = ''; ?>
pero entonces ya no funciona el código.
¿Alguna idea?