Buscar término de taxonomía personalizada por nombre

16 feb 2017, 22:38:19
Vistas: 33.1K
Votos: 5

Tengo una taxonomía personalizada llamada albums.

Necesito poder buscar el título del término de la taxonomía mediante texto, obviamente esto no es la búsqueda predeterminada de WP. Me pregunto ¿cuál sería la mejor manera de abordarlo?

Por ejemplo, si hay un álbum llamado 'Football Hits',

Empiezo a escribir 'foot' y lo busco, todo lo que necesito que aparezca es el título del álbum y su enlace permanente.

¡Gracias!

0
Todas las respuestas a la pregunta 2
0
13
// Obtenemos una lista de taxonomías en el cuadro de búsqueda
function get_tax_by_search($search_text){

$args = array(
    'taxonomy'      => array( 'my_tax' ), // nombre de la taxonomía
    'orderby'       => 'id', 
    'order'         => 'ASC',
    'hide_empty'    => true,
    'fields'        => 'all',
    'name__like'    => $search_text
); 

$terms = get_terms( $args );

 $count = count($terms);
 if($count > 0){
     echo "<ul>";
     foreach ($terms as $term) {
       echo "<li><a href='".get_term_link( $term )."'>".$term->name."</a></li>";

     }
     echo "</ul>";
 }

}

// ejemplo
get_tax_by_search('Foo');
16 feb 2017 23:23:50
7

Así que definitivamente puedes buscar posts por el título de la taxonomía - personalizada o no. La respuesta estará en la parte de "tax_query" de WP_Query. Aquí tienes un ejemplo del Codex, adaptado a tus necesidades:

<ul>
<?php

global $post;
$album_title = $_GET['album-title'];
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
    'tax_query' => array( // NOTA: ¡array de arrays!
        array(
            'taxonomy' => 'albums',
            'field'    => 'name',
            'terms'    => $album_title
        )
    )
);

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </li>
<?php endforeach; 
wp_reset_postdata();?>

</ul>

ACTUALIZACIÓN

No he probado esto, pero en teoría, creo que podría funcionar. Para coincidir con cualquier cosa que contenga "foot":

<ul>
<?php

global $post;
$album_title = $_GET['album-title']; // digamos que el usuario ingresó 'foot'
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
    'tax_query' => array( // NOTA: ¡array de arrays!
        array(
            'taxonomy' => 'albums',
            'field'    => 'name',
            'terms'    => $album_title,
            'operator'    => 'LIKE'
        )
    )
);

$myposts = get_posts( $args );
foreach ( $myposts as $post ) : setup_postdata( $post ); ?>
    <li>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </li>
<?php endforeach; 
wp_reset_postdata();?>

</ul>

¡Espero que esto ayude!

16 feb 2017 22:57:00
Comentarios

¡Gracias! Aunque necesito que sea más una búsqueda basada en el usuario. Así que el usuario escribiría la palabra "foot" y traería el álbum relevante "Football Hits"

DIM3NSION DIM3NSION
16 feb 2017 23:23:17

Claro - solo cambia el título estático por una variable... Cómo obtienes ese valor de búsqueda del usuario ya depende de ti... He actualizado mi respuesta con una variación, como ejemplo...

nibnut nibnut
16 feb 2017 23:25:23

Gracias MacPrawn, agradezco tu ayuda. Aunque seguramente lo anterior no cargaría los términos "Football Hits" si el valor de búsqueda es "foot". Tal vez estoy siendo tonto

DIM3NSION DIM3NSION
17 feb 2017 00:04:13

Lo siento, me perdí la parte donde querías coincidencias parciales... He actualizado mi respuesta.

nibnut nibnut
17 feb 2017 00:51:25

He probado lo anterior, pero lo que busco es que solo muestre el Título del Álbum relevante, no las publicaciones dentro de ese álbum. Es decir, no publicaciones categorizadas en Éxitos del Fútbol, sino literalmente solo el enlace permanente del álbum.

DIM3NSION DIM3NSION
17 feb 2017 00:57:26

Ah, ya veo. En ese caso, sospecho que la respuesta de @TrubinE hará un mejor trabajo.

nibnut nibnut
17 feb 2017 12:36:17

Gracias por tu ayuda, MacPrawn

DIM3NSION DIM3NSION
17 feb 2017 21:02:24
Mostrar los 2 comentarios restantes