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:
-
Use
html_entity_decode()
tal como lo hace WordPress a través depaginate_links()
:'base' => str_replace( $big, '%#%', html_entity_decode( get_pagenum_link( $big ) ) )
-
Cuando llame a
get_pagenum_link()
, establezca el segundo conjunto de parámetros enfalse
:'base' => str_replace( $big, '%#%', get_pagenum_link( $big, false ) )
-
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 …