Cómo hacer que wp-pagenavi funcione en una consulta personalizada basada en un envío de formulario

2 jul 2012, 16:27:53
Vistas: 13.6K
Votos: 5

También he publicado esto en los foros de soporte de WordPress, para el plugin wp-pagenavi de scribu:

http://wordpress.org/support/topic/plugin-wp-pagenavi-custom-query-form-submit-part-2?replies=1

Mi situación:

Estoy usando un formulario para crear una consulta personalizada que muestra posts de un tipo de contenido personalizado que coincidan con cierto campo personalizado (Ej: Para "tipo-de-contenido-personalizado" mostrar solo posts que tengan el valor "campo-personalizado" seleccionado en el formulario). Lo sé, se llama filtrado :P

Mi archivo de tipo de post personalizado se ve así:

www.example.com/archivo-tipo-contenido-personalizado

(nota que uso la configuración de enlaces permanentes "nombre del post")

Al enviar el formulario, la nueva URL es esta:

www.example.com/archivo-tipo-contenido-personalizado?clave=valor

La consulta personalizada está configurada para mostrar solo posts con el valor del campo personalizado clave:

$value = $_GET['valor'];
$paged = get_query_var('page');
$args = array(
        'post_type' => 'tipo-contenido-personalizado',
        'meta_key' => 'clave',
        'meta_value' => $value,
        'paged' => $paged,
        'posts_per_page' => 10
);
$my_query = new WP_Query($args);

Después del loop tengo:

wp_pagenavi(array('query' => $my_query));
wp_reset_postdata();

La consulta funciona, obtengo los resultados correctos. Pero tengo problemas para que funcione la paginación. Cuando voy a la siguiente página, obtengo esta URL:

www.example.com/archivo-tipo-contenido-personalizado/page/2?clave=valor

pero la paginación todavía muestra como si estuviera en la primera página y los resultados son los mismos.

Si ingreso manualmente:
www.example.com/archivo-tipo-contenido-personalizado?clave=valor&page=2
Obtengo los resultados correctos (de la página 2), pero todos los enlaces de navegación son iguales a la URL que ingresé manualmente.

Por favor ayuda (pistas, recursos, cualquier cosa).

Gracias,
Radu

4
Comentarios

Yo también tengo un problema similar, ¿ya encontraste la solución? ¿Podrías compartirla aquí?

dev-jim dev-jim
24 oct 2012 17:21:28

¿Alguna solución para esto?

p.a. p.a.
5 nov 2012 19:45:35

@p.a, @tc.k, resolví el problema usando el parámetro paged (en lugar de page) en get_query_var e implementando la paginación ajax como señaló @swtshweta. Creo que hubiera funcionado incluso sin ajax.

rereradu rereradu
6 nov 2012 21:03:34

Sí, la solución definitivamente es usar paged en lugar de page como parámetro (estoy usando WP 3.3.2 y WP-pagenavi 2.82). Funciona sin paginación Ajax, aunque usar esa técnica se ve increíble :)

rereradu rereradu
6 nov 2012 21:10:28
Todas las respuestas a la pregunta 6
0

Puedes intentar implementar una paginación basada en ajax para el plugin wp-pagenavi (consulta http://wordpressapi.com/2011/05/16/add-ajax-pagination-in-wordpress-blog/ como referencia). Creo que esto resolverá tu problema.

6 nov 2012 11:03:33
0

Como esto aparece en las búsquedas, me gustaría señalar que WP Page Navi (en su versión 2.74) ahora admite consultas personalizadas.

El FAQ de WP_Pagenavi enlaza al siguiente artículo para explicar cómo usar el plugin Pagenavi con una consulta secundaria pasando el parámetro de consulta a la función wp_pagenavi().

Del tutorial:

$my_query = new WP_Query();

while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
    // más cosas aquí
endwhile;

wp_pagenavi( array( 'query' => $my_query ) );

wp_reset_postdata();    // evitar errores más adelante en la página
27 oct 2013 16:39:44
0

Probablemente el problema ya ha sido resuelto aquí: https://stackoverflow.com/a/13216165/1801379

También puedes obtener alguna idea de aquí: https://wordpress.stackexchange.com/a/4131/23290

6 nov 2012 10:25:58
0

Aquí están las soluciones que encontré (tenga en cuenta que estoy usando WP 3.3.2 y WP-Pagenavi 2.82):

Solución 1: Usar paged en lugar de page como parámetro en get_query_var.

Solución 2: Usar navegación basada en ajax, como se menciona en el artículo que swtshweta señaló. (usando Ajax, la paginación funciona correctamente incluso con el parámetro page).

6 nov 2012 22:08:54
2

Curiosamente, la respuesta propuesta no muestra nada en mi navegador. Tengo la última versión de WP y el último navegador Chrome. Gracias de todos modos.

Aunque wp_pagenavi aparece correctamente, y los enlaces muestran /page2/, /page3/, etc., y he añadido el atributo $paged o $page a mi wp_query, siempre aparece la primera página.

7 nov 2012 10:06:44
Comentarios

¿estás llamando correctamente a la función wp_pagenavi: wp_pagenavi(array('query' => $your_custom_query));?

rereradu rereradu
7 nov 2012 16:07:09

Probé ambas pero ninguna funcionó. Me di cuenta de que la variable $paged siempre se envía vacía.

p.a. p.a.
12 nov 2012 09:39:14
1

Radu, La siguiente solución funcionó para mí: Modifiqué un código de paginación estándar, y lo hice enviar "&page=xxx" y capturé $page como variable de envío de formulario. Ahora funciona perfectamente.

Observa la última línea, aquí es donde ocurrieron las modificaciones.

global $paged;
$paged = ($_GET["page"]) ? ($_GET["page"]) : 1; //aquí es donde capturo la página solicitada

function pagenavi( $found_posts, $p = 2 ) { // se mostrarán páginas antes y después de la página actual
  if ( is_singular() ) return; // no mostrar en página única
  global $paged;
  $max_page =  intval($found_posts / 10) + 1;
  echo('max_page=' . $max_page);
  if ( $max_page == 1 ) return; // no mostrar cuando solo hay una página
  if ( empty( $paged ) ) $paged = 1;
  echo '<span class="pages">Página: ' . $paged . ' de ' . $max_page . ' <BR></span> '; // páginas
  if ( $paged > $p + 1 ) p_link( 1, 'Primera' );
  if ( $paged > $p + 2 ) echo '... ';
  for( $i = $paged - $p; $i <= $paged + $p; $i++ ) { // Páginas intermedias
    if ( $i > 0 && $i <= $max_page ) $i == $paged ? print "<span class='page-numbers current'>{$i}</span> " : p_link( $i );
  }
  if ( $paged < $max_page - $p - 1 ) echo '... ';
  if ( $paged < $max_page - $p ) p_link( $max_page, 'Última' );
}
 function p_link( $i, $title = '' ) {
  if ( $title == '' ) $title = "Página {$i}";
  echo "<a class='page-numbers' href='", esc_html( $_SERVER['REQUEST_URI'] . '&page=' .$i ), "' title='{$title}'>{$i}</a> ";

}

12 nov 2012 09:45:13
Comentarios

<<Para los administradores de stachexchange>> por favor consideren mi respuesta como solución a mi pregunta con recompensa. Las soluciones ofrecidas por los miembros fueron valiosas pero no funcionaron para mí, ya que la solución propuesta $paged = get_query_var('page'); siempre estaba VACÍA para mi sistema. Gracias.

p.a. p.a.
12 nov 2012 11:15:19