• ResueltoModerador almendron

    (@almendron)


    Uno de mis sitios es una Revista de Prensa y he creado una taxonomía llamada «autor» donde queda almacenado el nombre del autor de cada artículo. Además, hay una página donde se muestran todos los autores con el correspondiente enlace para mostrar sus respectivos artículos.

    Pues bien, me gustaría habilitar en esa página una búsqueda de autores de forma que, por ejemplo, si busco «Miguel» aparezcan todos los autores cuyo nombre contenga dicha palabra. Cada uno de los resultados debería ir con el enlace a sus artículos.
    Es decir, quiero hacer lo mismo que el propio WordPress ya hace cuando voy a «Entradas > Autor» y escribo en la caja de búsqueda.

    En resumen, necesito insertar una caja de búsqueda que busque en la taxonomía «autor» y devuelva todos los autores que contengan la palabra o palabras de búsqueda con su correspondiente enlace a sus artículos.

Viendo 15 respuestas - de la 16 a la 30 (de un total de 36)
  • Moderador almendron

    (@almendron)

    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.

    Moderador almendron

    (@almendron)

    ¿Algún tutorial para aprender a construir uno? Es que no tengo ni idea sobre esta cuestión.

    Moderador LGrusin

    (@lgrusin)

    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

    Moderador almendron

    (@almendron)

    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.

    Moderador LGrusin

    (@lgrusin)

    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();
    }
    Moderador almendron

    (@almendron)

    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.

    Moderador LGrusin

    (@lgrusin)

    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%

    Moderador almendron

    (@almendron)

    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.

    Moderador almendron

    (@almendron)

    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']; ?>

    Moderador almendron

    (@almendron)

    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.

    Moderador almendron

    (@almendron)

    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;
    ?>

    Moderador almendron

    (@almendron)

    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?

Viendo 15 respuestas - de la 16 a la 30 (de un total de 36)
  • El debate ‘Busqueda taxonomía’ está cerrado a nuevas respuestas.