Soporte » Guías – Resolución de problemas » Pasar parámetros por URL

  • Resuelto jorgiyo

    (@jorgiyo)


    Hola
    Estoy creando un plugin para listar una serie de canciones en un orden determinado.
    Quiero que al pinchar sobre alguna de las canciones se vuelva a cargar la página mostrando la letra de dicha canción y a continuación de nuevo el listado completo de títulos de canciones.
    Para las canciones, letras, discos y relación entre las canciones y los discos tengo tres tablas creadas en base de datos de WordPress.
    La primera vez que se carga la página hago una consulta a la base de datos a través de $wpdb->get_results declarada como Global y el listado sale corectamente.
    El problema me surge cuando al hacer click sobre un título quiero que se vuelva a cargar la página pasándole como parámetro el ID de la canción para que primero muestre la letra de dicha canción.

    ¿alguien sabría decirme cómo pasar el ID de la canción como parámetro?

    Mil gracias.

Viendo 15 respuestas - de la 1 a la 15 (de un total de 20)
  • Si y no!!!

    Me faltan datos…

    Entiendo que quieres algo asi: url?a=1&b=2
    Eso lo puedes hacer con el filtro post_link para los post types si es que lo tienes como post type o term_link si son taxonomies asi añadiras la var en los enlaces.

    Luego ya podras capturar $_GET['a'] y filtrar los resultados.

    Pero te aconsejo que uses custom taxonomies para las relaciones es mas facil de mantener que teniendo tablas propias y lo puedes configurar para editarlo desde el escritorio y otros ajustes mas avanzados como url amigables.

    Con mas datos podria extenderme mas. Ya que no se si canciones, letras y discos son taxonomies, post types o simple elementos de tus tablas.

    Puedo dar por sentado que son simples elementos ya que usas $wpdb con lo que tambien puedo suponer que el archivo.php tienes un codigo personalizado.

    Saludos

    Iniciador del debate jorgiyo

    (@jorgiyo)

    Hola Kallookoo

    Muchísimas gracias.

    Sí, lo que quiero es url?cancion=12
    Letras, canciones y discos son únicamente elementos de mis tablas y efectivamente el código de miplugin.php es código personalizado.
    Se trata de una web que hice hace muchos años ‘a pelo’ y es muy difícil de mantener e intento pasarla a WordPress.
    Se trata del apartado discografía de un grupo.
    Básicamente he importado las tres tablas que tenía y he copiado el SELECT para consultar las tablas y me he encontrado con el problema de pasar los parámetros a través de la URL.

    Yo tuve un problema parecido y use como te sugeri hacerlo con post types si tiene contenido (tiene algo mas que el nombre) y taxonomias si solo es el nombre y un pequeño texto. Sobre las tablas una vez decidido que sera podrias, para importar, crear un conjunto de queries y luego usar las funciones wp_insert_post, wp_update_post o wp_insert_term, wp_update_term, etc…
    Te puede parecer laborioso pero despues veras que para ti como para el cliente (si lo hay) es una maravilla.

    Si decides hacerlo como ahora tendras que crear una UI amigable en la pagina del plugin puedes usar wp_list_table aunque no esta recomendado porque pueden cambiar algun metodo, etc… de la clase y tu no lo sabras hasta que falle, aunque algunos la copian y le cambian el nombre asi si la actulizan se sigue usando la misma, sobre la parte de consultas y parametros tiraria por editar las urls y despues creas una query con los parametros.
    Entiendo entonces que no hay nada creado con post types ni taxonomies y tu plugin tendra alguna manera de interactuar con la pagina creada para esta tarea.
    Si pasas por la web uklitag veras que aunque no es de musica hay relaciones y estan creadas con post type, taxonomies y post meta. Es decir el libro don doe lo escribio el author jhon doe y si visitas el author sale sus libros y si visitas el libro sale el author(post type), y pasa mas o menos igual con los libros (post type) y las tematicas (taxonomies).

    Todo es cuestion del plazo de entrega, si ese contenido se actualizaria en un futuro, etc… Y buscar lo mejor para todos.

    Puedes mirar plugins como post2post, job manager, que hacen relaciones entre diferentes posts, taxonomies.
    A veces nos complicamos y el Core de WordPress o plugins tienen la solucion.

    Otra son los shortcodes que se emplean para insertar codigo en las paginas del WordPress y no es necesario que los coloques en el post_content.

    Como veras es cuestion de pensar cual seria lo mas apropiado y reutilizable para el futuro si fuese necesario.

    Yo no escribiria 500 lineas de codigo solo para algo en concreto que puede sufrir un cambio, bueno todo esto es mi opinion que intenta ayudarte en lo posible.

    Y para acabar te doy otra opcion usando tus tablas, podrias usar wp_ajax es un action de WordPress para hacer llamadas con ajax manteniendo la seguridad y cargas la letra añadiendo un data-song=»2″ a la url o el tag que sea.

    Espero que te salga, ya contaras!!!

    Iniciador del debate jorgiyo

    (@jorgiyo)

    Muchas gracias Kallookoo
    Me temo que no tengo nivel suficiente.
    Me pierdo.
    Estoy empezando en WordPress y trato de clonar lo que hice en PHP hace tiempo con mucha dificultad.
    Para mí lo más sencillo sería conseguir pasar parámetros por URL al menos de momento.
    Gracias.

    Buenas una cos antes de seguir ayudandote.

    Los enlaces los genera WordPress o tambien los generas tu? Para ver la mejor manera de incluir las query vars nuevas.

    Saludos

    Iniciador del debate jorgiyo

    (@jorgiyo)

    Buenas
    No sé si te entiendo bien.
    Lo que quiero es que todos los enlaces de las canciones vuelvan a cargar la misma página pasándole el parámetro ID correspondiente a la canción sobre la que se haya pinchado.
    Un saludo.

    Si eso esta claro, pero lo que preguntaba es que si son enlaces son creados con get_permalink puedes usar su filtro para añadirle ?cancion=1, pero si lo generas tu yo no puedo ayudarte sin ver el codigo. Piensa que todo te lo digo sin saber exactamente como es tu plugin (codigo).

    Iniciador del debate jorgiyo

    (@jorgiyo)

    function leer_wpdb(){

    global $wpdb;

    if( is_page(190)){

    if (isset($_GET[‘cancion’]))
    {
    $cancion=$_GET[‘cancion’];
    /*si se ha elegido una canción se hace un select para buscar los discos en los que se encuentra esa canción dentro de la discografía
    y por otro lado buscamos la letra canción*/
    $registros = $wpdb->get_results( ‘SELECT discografia.titulo,discografia.discografica,discografia.ano,discografia.foto, canciones.titulo as canc_tit,canciones.letra FROM discografia INNER JOIN disco_cancion ON discografia.id=disco_cancion.id_disco INNER JOIN canciones ON canciones.id=disco_cancion.id_cancion WHERE disco_cancion.id_cancion=’.$cancion.»);

    echo $registros[0]->canc_tit.»<br />»;
    echo $registros[0]->letra.»<br />»;
    foreach($registros as $row)
    {
    echo $row->titulo.»<br />».$row->discografica.»<br />»;
    }

    }

    $registros = $wpdb->get_results( «SELECT discografia.foto,discografia.titulo,discografia.discografica,discografia.ano,discografia.observaciones, canciones.titulo as canc_tit,canciones.id FROM discografia INNER JOIN disco_cancion ON discografia.id=disco_cancion.id_disco INNER JOIN canciones ON canciones.id=disco_cancion.id_cancion ORDER BY discografia.ano DESC, disco_cancion.orden» );

    $foto=0;
    foreach($registros as $row)
    {

    if (($foto==0) or ($disco_actual!=$row->titulo)){
    echo «<br />foto’ width=’120′ height=’107′><br />»;
    echo «Disco: «.$row->titulo.»<br />»;
    echo «Discografica: «.$row->discografica.» – Año: «.$row->ano.»<br /><br />»;
    $foto=1;
    }
    echo «Canción: id.»‘>».$row->canc_tit.»<br/>»;

    $disco_actual=$row->titulo;

    }

    }

    }
    add_action(‘genesis_entry_content’,’leer_wpdb’ );

    Iniciador del debate jorgiyo

    (@jorgiyo)

    function leer_wpdb(){
    
    global $wpdb;
    
    if( is_page(190)){
    
    if (isset($_GET[‘cancion’]))
    {
    $cancion=$_GET[‘cancion’];
    /*si se ha elegido una canción se hace un select para buscar los discos en los que se encuentra esa canción dentro de la discografía
    y por otro lado buscamos la letra canción*/
    $registros = $wpdb->get_results( ‘SELECT discografia.titulo,discografia.discografica,discografia.ano,discografia.foto, canciones.titulo as canc_tit,canciones.letra FROM discografia INNER JOIN disco_cancion ON discografia.id=disco_cancion.id_disco INNER JOIN canciones ON canciones.id=disco_cancion.id_cancion WHERE disco_cancion.id_cancion=’.$cancion.”);
    
    echo $registros[0]->canc_tit.”<br />”;
    echo $registros[0]->letra.”<br />”;
    foreach($registros as $row)
    {
    echo $row->titulo.”<br />”.$row->discografica.”<br />”;
    }
    
    }
    
    $registros = $wpdb->get_results( “SELECT discografia.foto,discografia.titulo,discografia.discografica,discografia.ano,discografia.observaciones, canciones.titulo as canc_tit,canciones.id FROM discografia INNER JOIN disco_cancion ON discografia.id=disco_cancion.id_disco INNER JOIN canciones ON canciones.id=disco_cancion.id_cancion ORDER BY discografia.ano DESC, disco_cancion.orden” );
    
    $foto=0;
    foreach($registros as $row)
    {
    
    if (($foto==0) or ($disco_actual!=$row->titulo)){
    echo “<br />foto’ width=’120′ height=’107′><br />”;
    echo “Disco: “.$row->titulo.”<br />”;
    echo “Discografica: “.$row->discografica.” – Año: “.$row->ano.”<br /><br />”;
    $foto=1;
    }
    echo “Canción: id.”‘>”.$row->canc_tit.”<br/>”;
    
    $disco_actual=$row->titulo;
    
    }
    
    }
    
    }
    add_action(‘genesis_entry_content’,’leer_wpdb’ );

    Bueno te paso como lo haria yo, espero que te ayude!!!

    
    <?php
    
    if ( ! function_exists( 'leer_wpdb' ) ) {
    	function leer_wpdb() {
    		$page_id = 190;
    
    		if ( is_page( $page_id ) ) {
    			global $wpdb;
    
    			// Aqui almacenado el listado para imprimirlo al final
    			$output = '';
    
    			// Consulta sql para el listado
    			$query = "SELECT discografia.*, canciones.tituto as titulo_cancion, canciones.id as id_cancion FROM discografia INNER JOIN disco_cancion ON discografia.id=disco_cancion.id_disco INNER JOIN canciones ON canciones.id = disco_cancion.id_cancion ORDER BY discografia.ano DESC, disco_cancion.orden WHERE 1=1";	
    
    			// Si hay contenido procedemos a procesar
    			if ( $result = $wpdb->get_results( $query ) ) {
    				// Comprobamos si se definido la id de la cancion en la peticion, para mostrar la letra
    				if ( ! empty( $_GET['cancion'] ) ) {
    					/**
    					 * Hacemos absint, esc_attr para aseguranos que no pasan
    					 * nada raro mediante el metodo $_GET
    					 *
    					 * @return ID de la cancion 
    					 *          0 en caso de error
    					 *          1 si se pasa algo tipo 'blablabla'
    					 */
    					if ( $id_cancion = absint( esc_attr( $_GET['cancion'] ) ) ) {
    						// Se asume que solo existe una id por cada cancion
    						$cancion_letra = $wpdb->get_var("SELECT letra FROM canciones WHERE id = {$id_cancion}");
    					}
    				}
    
    				// Definimos la url de la pagina
    				$permalink = get_permalink( $page_id );
    
    				// Procesamos
    				foreach ( $result as $row ) {
    					if ( isset( $id_cancion ) && $row->id_cancion ) {
    							if ( ! empty( $cancion_letra ) ) {
    							/**
    							 * Aqui se añade el html de la seccion donde se muestra la letra
    							 * La letra esta definida en $cancion_letra
    							 */
    
    							$output_letra = '';
    
    							// Añadimos el html al principio del listado
    							$output = $output_letra . $output;
    						}
    					}
    
    					// Definimos la url con la id de la cancion actual
    					// Ejemplo: http://dominio.com/pagina-190?cancion=x
    					$titulo_url = esc_url( add_query_arg( array( 'cancion' => $row->id_cancion ), $permalink ) );
    
    					// Añadimos el html del listado
    					$output .= '';
    
    				}
    			}
    
    			// Imprimimos el contenido
    			echo $output;
    		}
    	}
    }
    add_action('genesis_entry_content','leer_wpdb' );
    
    Moderador LGrusin

    (@lgrusin)

    Podrías crear un Custom Post Type, ni siquiera necesitas crear consultas a la base de datos, eso lo hace WordPress por ti.

    Otra cosa es la realización práctica si no tienes los conocimientos suficientes, para mi es más complicado todo ese código que has generado.

    Incluso es posible que ya existan plugins para eso que puedes adaptar a tus necesidades.

    Un saludo

    • Esta respuesta fue modificada hace 3 años, 4 meses por LGrusin.

    Yo le comente lo mismo @lgrusin pero prefiere seguir usando sus tablas…

    Moderador LGrusin

    (@lgrusin)

    Ya, ya, cada uno se adapta a sus conocimientos…

    Un saludo

    Iniciador del debate jorgiyo

    (@jorgiyo)

    Gracias LGrusin, entiendo que hay soluciones más sencillas pero como tengo tan poco nivel prefiero ir poco a poco, espero estar dentro de unos meses riéndome de este código tan macarrónico.

    Kallakoo, mil gracias por el código pero al cargar la URL con el parámetro me el error 404.

    No deberia! Es la misma url!?
    Es decir dominio/pagina/ y despues es dominio/pagina/?cancion=x

Viendo 15 respuestas - de la 1 a la 15 (de un total de 20)
  • El debate ‘Pasar parámetros por URL’ está cerrado a nuevas respuestas.