Soporte » WordPress Avanzado » Endpoint con paginación

  • Resuelto natiaz

    (@natiaz)


    Buenas, mi problema es que a los posts les he añadido un endpoint ‘blog’, que me redirige a un template personalizado con una WP_Query personalizada.

    Lo que he hecho:
    – En init, he añadido el endpoint:
    add_rewrite_endpoint( 'blog', EP_PERMALINK );

    – En template_redirect le añado mi redirección:

    // For the blog endpoint
        if( is_singular() && (get_query_var( 'blog' ) ))
        {
            $post = get_queried_object();
            $out = array(
                'id' => $post->ID,
                'title'     => $post->post_title,
                'content'   => $post->post_content
            );
            include(locate_template('customtemp-template.php'));
            exit();
        }
    add_filter( 'request', 'my_rewrite_filter_request' );
    function my_rewrite_filter_request( $vars )
    {
        if( isset( $vars['blog'] ) ) 
          $vars['blog'] = true;
        
        return $vars;
    }

    – En el template, tengo una query customizada:

    global $paged;
    global $wp_query;
    $temp = $wp_query;
    
    $wp_query= null;
    
    $args = array(
        'posts_per_page' => 1,
        'post_type'   => 'customtype',
        'meta_key'    => 'mimeta',
        'meta_value'  => $post->ID,
        'paged'       => $paged
      );
    
      $wp_query    = new WP_Query($args);

    He conseguido mostrar los links a los siguientes y anteriores posts (next_posts_link( ‘Anteriores’ ) y previous_posts_link( ‘Siguientes’ )) y me dan las URL’s paginadas:
    http://mysite/post-slug/blog/page/2/

    Para que me lleve correctamente a la página, le he añadido una rewrite rule:

    add_rewrite_rule( '([^/]+)/blog/page/([0-9]{1,})/?$', '$matches[1]&blog=1&paged=$matches[1]', 'top' );

    Hasta aquí, todo correcto, me lleva a la página y me muestra el contenido del template, pero lo que no consigo por ninguna parte es la página, es decir, si entro en http://mysite/post-slug/blog/page/2/ me muestra el contenido de la primera página, no de la segunda.

    • Este debate fue modificado hace 7 años, 5 meses por natiaz.
Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • Moderador LGrusin

    (@lgrusin)

    Lo que no entiendo es para que usas template_redirect, rompes la carga normal de los archivos del tema. Para cargar un template personalizado no necesitas hacerlo así. Prueba primero sin template personalizado. Sólo tienes que modificar los argumentos del query.

    Sobre la paginación aquí tienes información, y no es necesario global $paged.
    https://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters

    Un saludo

    Iniciador del debate natiaz

    (@natiaz)

    Hola @lgrusin, gracias por tu respuesta.
    Lo del template_redirect es porque las necesidades específicas del proyecto así lo requiere, ya que el endpoint que se le añade a los posts debe mostrar un contenido muy específico.

    Finalmente lo he podido solucionar sin necesidad de hacer rewrite.

    La solución más sencilla ha sido jugar con el valor del endpoint y crearme una variable propia de paginación, así:

    add_filter( 'request', 'my_rewrite_filter_request' );
    function my_rewrite_filter_request( $vars )
    {
        if( isset( $vars['blog'] ) ) 
        {
          if(empty($vars['blog']))
          {
            $vars['blog'] = true;
          }
          else
          {
            $test = explode('page/', $vars['blog']);
    
            if(isset($test) && !empty($test[1]))
            {
              $vars['pagina'] = $test[1];
            }
          }
        }
        
        return $vars;
    }

    Y en mi template, pregunto por esa variable de paginación:

    $paged = get_query_var( 'pagina' ) ? get_query_var( 'pagina' ) : 1;

    A mi me ha servido, así que espero que alguien se ha encontrado con un problema similar le pueda ayudar en algo.

    Moderador LGrusin

    (@lgrusin)

    Gracias por compartir. Aunque yo lo hubiese hecho de otra manera. Es lo bueno que tiene WordPress, puedes obtener el mismo resultado de forma diferente.

    Un saludo

Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • El debate ‘Endpoint con paginación’ está cerrado a nuevas respuestas.