paginate-links – Paginate Link genera # 038 adicional; siempre que mi URL tenga varias cadenas de consulta

Pregunta:

Los resultados de mi enlace paginado generado tendrán #038; adicional #038; en la URL, ¿puedo saber cómo deshacerme de él?


URL de la página del blog: http://localhost/wordpress/blog/

Ya había configurado la paginación con la función paginate_links , cuando presiono la página [2]:

Página del blog Página 2 url: http://localhost/wordpress/blog/page/2/

(todo está bien arriba)


Sin embargo, siempre que la URL de mi página de Blog tenga ciertos parámetros que son para mis propósitos de filtro / clasificación para WP_Query, el resultado de paginate_link tendrá parámetros adicionales # 038 , consulte la URL a continuación.

Página de blog con URL de parámetros: http://localhost/wordpress/blog/?filter=23&orderby=oldest

Página de blog con Params Página 2 Url: http://localhost/wordpress/blog/page/2/?filter=23&orderby=oldest#038;orderby=oldest


La URL que necesito lograr es http://localhost/wordpress/blog/page/2/?filter=23&orderby=oldest

a continuación están mis funciones paginate_links:

global $wp_query;
$big = 99999999999;    

paginate_links([
    'base'      => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'    => '?paged=%#%',
    'prev_text' => __('<'),
    'next_text' => __('>'),
    'current'   => max( 1, get_query_var('paged') ),
    'type'      => 'list',
    'total'     => $wp_query->max_num_pages,
    ]);

Respuesta:

No hay necesidad de escapar de la URL dos veces – get_pagenum_link() por defecto devuelve una URL de escape – cuando el segundo parámetro es true , se usa esc_url() ; de lo contrario, se esc_url_raw() :

  • Con esc_url() : http://localhost/wordpress/blog/?filter=23&orderby=oldest

  • Con esc_url_raw() : http://localhost/wordpress/blog/?filter=23&orderby=oldest

¿Y el problema se produce cuando la base contiene ? , o una cadena de consulta, y que la URL tiene un escape (por ejemplo, usando esc_url() ).

Porque esc_url() convierte & (ampersand) a su entidad HTML, que es & , y cuando la base contiene una cadena de consulta, paginate_links() analizará el valor / URL base , y cuando & se escapa, cualquier cosa después de cada & y el más cercano = se trata como un nombre / clave de cadena de consulta, y se agrega a la cadena de consulta de la base :

http://localhost/wordpress/blog/?filter=23&orderby=oldest#038;orderby=oldest

En el ejemplo anterior, la URL es así porque paginate_links() (o más precisamente, wp_parse_str() usado en paginate_links() ) interpretó #038;orderby como la clave de la oldest ; es decir, #038;orderby=oldest : debe ser &orderby=oldest donde la clave es orderby .

(Pero, por supuesto, el navegador ve cualquier cosa después del # como un fragmento de URL. Y si sigue el enlace, en la página siguiente, $_GET no tendrá una entrada para #038;orderby ; es decir, $_GET['#038;orderby'] no existe.)

Así que aquí hay varias formas de solucionar / evitar el problema:

  1. Use html_entity_decode() tal como lo hace WordPress a través de paginate_links() :

     'base' => str_replace( $big, '%#%', html_entity_decode( get_pagenum_link( $big ) ) )
  2. Cuando llame a get_pagenum_link() , establezca el segundo conjunto de parámetros en false :

     'base' => str_replace( $big, '%#%', get_pagenum_link( $big, false ) )
  3. Utilice str_replace() para reemplazar el & con & :

     'base' => str_replace( [ $big, '&' ], [ '%#%', '&' ], get_pagenum_link( $big ) )

No se preocupe por no escapar de la base porque paginate_links() realidad escapa a todos los enlaces / URL en el resultado devuelto.

Advertencia amistosa: algunos de los enlaces en esta respuesta lo dirigen a un archivo HTML / página web enorme …

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım