Form con 3 campos de búsqueda sobre un wp_query. Al paginar se produce error

Inicio Foros WordPress Programación Form con 3 campos de búsqueda sobre un wp_query. Al paginar se produce error

Este debate contiene 8 respuestas, tiene 2 mensajes y lo actualizó  LGrusin hace 4 años, 8 meses.

  • Autor
    Publicaciones
  • #74527

    Burot
    Miembro

    hola a todos,
    Estoy haciendo una página de una hemeroteca para buscar posts por 3 conceptos:
    – Una palabra cualquiera (como el search.php)
    -Fecha inicio
    -Fecha final
    Con los dos últimos filtrará todos los posts cuya fecha de publicación esté entre las 2 fechas introducidas en el form.
    Tengo un único fichero, llamado hemeroteca.php, que contiene el form y el loop con los resultados.

    Si no activo la paginación en la query, es decir, que me muestre todos los posts que encuentre, va perfecto el proceso, pero al añadir una paginación como os pongo en el código de más abajo sucede lo siguiente:
    La primera página sale bien, pero cuando le doy a la segunda página, el wordpress carga de nuevo la página pasándole el parámetro paged=2 PERO me pierde los parámetros que antes había introducido en el form, la palabra y las 2 fechas, con lo cual wp_query me pierde esos valores y me saca todos los posts de sitio perdiéndose la búsqueda.
    ¿Cómo puedo guardar los parámetros introducidos en el form para que cuando pagine el WordPress no se pierdan?

    Mucha gracias
    Os dejo el código:

    /************************* CAPTURA DE PARAMETROS DEL FORM ***********************
    function getData($campo) {
    return isset($_REQUEST[$campo]) ? $_REQUEST[$campo]:”;
    }

    $filterKeyword = getData(‘Keyword’);
    $filterDate1 = getData(‘Date1’);
    $filterDate2 = getData(‘Date2’);

    /**************** SI NO SE RELLENA NINGUN PARAMETRO SE MARCA PARA NO EJECUTAR LA QUERY NI EL LOOP ***********************
    $show = true;
    if (($filterKeyword == ”) && ($filterDate1 == ”) && ($filterDate2 == ”))
    $show = false;

    // ********************* FORMULARIO DE ENTRADA DE LOS DATOS

    form id=”form_datos” action=”the_permalink()” method=”post”
    input type=”text” name=”Keyword”
    input type=”text” name=”Date1″
    input type=”text” name=”Date2″

    input type=”submit” id=”enviar” value=”Send”
    /form

    // ***************************** QUERY Y LOOP
    if ($show) :

    // Query filters
    $paged = (get_query_var(‘paged’)) ? get_query_var(‘paged’) : 1;
    $args = array(
    ‘s’=> $filterKeyword,
    ‘post_type’=> ‘post’,
    ‘posts_per_page’ => 10,
    ‘paged’=> $paged,
    ‘orderby’ => ‘date’,
    ‘order’ => ‘DESC’,
    ‘date_query’ => array(
    array(
    ‘after’ => $filterDate1,
    ‘before’ => $filterDate2,
    ‘inclusive’ => true,
    ),
    ),
    );

    // Query & Loop
    $query = new WP_Query( $args );

    if ($query->have_posts() ):
    while( $query->have_posts() ): $query->the_post();

    the_time(‘G:i’);
    the_permalink();
    the_excerpt();

    endwhile;

    // Navi
    next_posts_link( ‘Older entries’, $query->max_num_pages );
    previous_posts_link( ‘New entries’ );

    endif;

    wp_reset_postdata();

    endif;

  • #74541

    LGrusin
    Miembro

    Observo lo siguiente: El loop tiene que hacerse siempre, si no es así la paginación es imposible hacerla puesto que WordPress no sabe en qué parte de la consulta está.

    En vez de ocultar el Loop tendrías que ocultar el formulario una vez se han introducido los datos y se está navegando por los resultados.

    Un saludo

  • #74549

    Burot
    Miembro

    Hola de nuevo LGrusin,
    He hecho lo que me comentas pero no soluciono nada, te explico como funciona ocultando el form y no el loop:
    Al entrar por primera, como aún no hemos rellenado el form, las 3 variables filterKeywor, filterDate1 y filterDate2 están vacías y así las coge el wp_query con lo que me salen TODOS los posts del sitio debajo del form.

    Cuando le doy algún filtro y le doy al submit del form, se recarga la página, las 3 variables php tienen valores por lo que el wp_query filtra perfecto sino tiene paginación. Si la tiene me hace el mismo fallo que antes, cuando le doy a la segunda página de los resultados el Worpress vuelve a cargar la página pasando el parámetro “paged=2”, pero claro como no hay ningún submit del form las 3 variables php me quedan vacías haciendo que se muestren de nuevo TODOS los posts del sitio.

    Me he fijado como funciona el search.php y es que el único campo que tiene se llama “s”, aunque le podemos añadir más todos tienen que ser palabras reservadas, “cat” para categorías, “pos_date” para fecha de publicación,… Si los inputs que definimos en el searchform.php emplean estos nombres, cuando carga el search.php NO tiene que hacer ninguna captura de los parámetros en variables PHP. Creo que mi problema está ahí pero claro, no tengo ni idea de como poder emplear los parámetros que paso con el form sin convertirlos a variables php para utilizarlas en la query.
    Y esto debe ser la causa que al paginar, al no emplear palabras reservadas como hace el search.php, se me borran mis parámetros y sólo deja “paged=2”

    Alguna idea referente a esto que te comento de las variables php $filterKeyword, $filterDate1 y $filterDate2 para no perderlas al refrescar?

    Mil gracias. Saludos

  • #74550

    Burot
    Miembro

    Acabo de encontrar una cosa curiosa, al searchform.php normal le he cambiado el method del form, le he puesto method=post, y al pagina me ha dado el mismo error, se rompe la paginación a añadirle paged=2. Con GET funciona perfecto.
    En mi página el formulario incluido utilizo el método post, ¿y si fuera esto?
    Lo he puesto a GET pero ahora NO me carga mi página, me muestra el index.
    Al form lo tengo definido así:
    form id=”form_datos” action=”the_permalink(); ” method=”get” NO FUNCIONA, ME SACA EL INDEX
    form id=”form_datos” action=”” method=”get” NO FUNCIONA, ME SACA EL INDEX

    ¿Se os ocurre alguna manera de llamar a sí mismo la página pero con el método get?. Con Post funciona perfectamente pero creo que podría estar ahí el error de la paginación

    También podría sacar el form fuera pero ya abrí otro post para ver como podrían abrir una página determinada desde el action del form. Las pruebas que he hecho siempre me sacaba el search.php o el index
    ¿Cómo podría llamar a una página en concreto con el método GET?

    Estas prueba no me funcionaron:
    Pongamos que mi página tiene el id=2447, he probado:
    action=”?page_id=2447″ – Se lo pasa por el forro, se va a la página search.php
    action=” echo home_url(‘/’);?page_id=2447″ — O me salta search.php o me da error según ponga en methotd= get o post

    Gracias de nuevo

  • #74556

    LGrusin
    Miembro

    Creo que esto se puede hacer de varias maneras, por ejemplo con el uso del archivo search.php tal como dijo el compañero y otra con tus propios códigos.

    De todas formas, si no lo quieres hacer con search.php te aconsejo lo siguiente:
    1 – Crea una plantilla de página (sin formulario) con el código de la consulta o búsqueda en ella. En el código de la consulta (query) le pones la cadena y fechas que quieras buscar.
    2 – Crea una página y asigna la plantilla de página anteriormente creada.
    3 – Comprueba que funciona la paginación.
    4 – Una vez conseguido lo anterior inserta el formulario en la página. Tendrás que buscar la forma de que los datos del formulario no afecten a la consulta mientras navegas por la paginación, por ejemplo añadiendo campos ocultos al formulario y actuando según en qué condiciones.

    Un saludo

  • #74576

    Burot
    Miembro

    Muy buenas LGrusin,
    Muchas gracias por tus consejos. Lo he hecho todo desde cero tal como me has dicho pero el resultado ha sido el mismo.
    He creado una página y le he asignado mi plantilla SIN formulario, he asignado valores fijos a los filtros del query y todo perfecto, la paginación también perfecto.
    Le he añadido en la misma plantilla el form y con la paginación se fastidia como hasta ahora. Estoy convencido que es por el metodo=post del formulario. He cogido el searchform.php de una plantilla, le he cambiado el método get por post y el search.php estándar también me ha fallado con la paginación..
    Se ve que cuando pagina el WordPress, copia todos los parámetros de la url y le asigna el nuevo parámetro”paged=2″. E método post oculta todos los parámetros y parece que añadirle el paged=2 pierde lo anterior porque está oculto.

    Lo primero que se me ocurrió es ponerle a mi form el método = GET, pero no funciona, me desvía al index.php
    La llamada a sí mismo del form la hago así:
    form id=”form_datos” action=”the_permalink()” method=”post”

    ¿Conoces otra forma que llamarse a sí mismo pero con el método GET?

    También he probado de sacar fuera el formulario y que éste llame a mi página de resultados de la siguiente manera:
    form action=” echo home_url(‘/’);?page_id=2447″ method=”get”
    y
    form action=”?page_id=2447″ method=”get”

    Pero tampoco funciona, o me salta el search.php estándar, index o da error. Nunca me lleva a mí página.
    ¿Hay otra manera de llamar a una página diferente desde un formulario que no sean las dos anteriores?

    Estoy que me subo por la paredes, porque estoy seguro que es por el POST. No entiendo como WordPress no deja poner el valor que queremos en el atributo método del form, al fin y al cabo lo único que haces es mostrar u ocultar los parámetros.

    De nuevo muchas gracias y bienvenido sea cualquier comentario, idea …

  • #74584

    LGrusin
    Miembro

    Esta claro que el formulario afecta, por eso dije de quitarlo una vez inicias la búsqueda. No creo que sea porque no funcione la paginación sino porque siempre inicia la misma consulta.

    El formulario de los themes de WordPress, como el que está en el archivo searchform.php, usa el método GET. Con WordPress puedes crear otros formularios (empleando GET) que usarán el archivo search.php, simplemente cambiado el archivo searchform.php por otro, en caso de que quieras conservar los dos formularios, y añadiendo ese nuevo archivo donde te interese.

    Dentro de search.php tendrás que añadir el código que diferencie a un formulario de otro (en caso de que tengas varios formularios), por ejemplo mediante un campo oculto en el nuevo formulario. Esto debería funcionar tal cual está. Podrías probar a captar los datos del formulario desde el archivo search.php y me cuentas…

    Lo que tú pretendes también es posible pero más complicado puesto que tienes que “emular” todo el proceso anterior con tus propios códigos y archivos.

    La idea de usar plugins es para que vieras cómo lo hacen…

    Un saludo

  • #74589

    Burot
    Miembro

    Hola LGrusin,
    Ya funciona! Conseguido!
    He seguido tus consejos, me he creado mi propio form y con un campo oculto le he dado un nombre, también le he dado un nombre diferente con otro campo oculto al searchform estándar. Y luego he personalizado el search.php que dependiendo del nombre de plantilla que le llegue, ejecuto el código normal del search.php o sino ejecuta mi código para mis búsqueda personalizadas.
    Nada de llamarse a sí mismo como pretendía y también me he instalado un par de plugins para ver como mandaban los parámetros al search.php y lo hecho de la misma manera..
    No hay ningún problema con la paginación, lo miro ahora y es mucho más sencillo de lo que pretendía hacer.

    Muchísimas gracias por tu ayuda, no lo hubiera conseguido sin tus consejos.
    Un saludo

  • #74597

    LGrusin
    Miembro

    De nada, me alegro..

    Lo más que me gusta de WordPress es que lo tienes todo hecho, otra cosa es que no lo sepamos… 😉

    Un saludo

El foro ‘Programación’ está cerrado y no se permiten nuevos debates ni respuestas.

Pin It on Pinterest