Obtener la URL actual (permalink) sin /page/{pagenum}/

29 nov 2016, 10:49:16
Vistas: 48.5K
Votos: 14

¿Cómo puedo obtener la URL actual (ya sea página de inicio, archivo, archivo de tipo de entrada, archivo de categoría, etc.) pero siempre sin la parte /page/{pagenum}/ si está presente? Entonces, si la URL real es:

example.com/category/uncategorized/

O

example.com/category/uncategorized/page/2/

entonces el valor devuelto siempre será

example.com/category/uncategorized/

0
Todas las respuestas a la pregunta 8
1
14

Puedes obtener la URL actual mediante home_url( $wp->request ).

Prueba el siguiente ejemplo:

global $wp;

// obtener la URL actual con la cadena de consulta.
$current_url =  home_url( $wp->request ); 

// obtener la posición donde comienza el texto '/page..'.
$pos = strpos($current_url , '/page');

// eliminar la cadena desde la posición específica
$finalurl = substr($current_url,0,$pos);


echo $finalurl;
29 nov 2016 11:22:37
Comentarios

¡Esto funcionó! Aunque no devolvía nada si no había /page/X/ en la URL, así que lo modifiqué un poco para hacerlo universal. ¡Muchas gracias!

Ihor Vorotnov Ihor Vorotnov
29 nov 2016 11:44:07
2
13

Actualmente lo más fácil sería usar get_pagenum_link() que te devolverá la URL actual sin ningún parámetro /page/*.


Extra

También puedes usarlo simplemente para construir enlaces "Anterior" y "Siguiente" dinámicamente usando la variable de consulta 'paged':

// Obtener el número de página actual.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$first_page = '<a href="' . get_pagenum_link() . '" class="page-first"><<</a>';
$prev_page = '<a href="' . get_pagenum_link($paged - 1) . '" class="page-prev"><</a>';
$next_page = '<a href="' . get_pagenum_link($paged + 1) . ' class="page-next">></a>';

// Y teniendo un objeto `WP_Query` también puedes construir el enlace para la última página:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';
8 may 2019 13:08:11
Comentarios

Esto es útil, pero también agrega parámetros de consulta en la URL. Debes eliminarlos por separado.

trainoasis trainoasis
5 oct 2020 09:12:00

Es fácil de usar.

vee vee
23 jun 2024 16:06:58
4
10

La respuesta de Govind Kumar funcionó, sin embargo, solo devolvía la URL si /page/{númerodepágina}/ estaba presente en la URL y no devolvía nada si no era así. Necesitaba una solución universal que siempre devolviera la URL base sin paginación, así que modifiqué un poco el código de Govind y lo envolví en una función:

function get_nopaging_url() {

    global $wp;

    $current_url =  home_url( $wp->request );
    $position = strpos( $current_url , '/page' );
    $nopaging_url = ( $position ) ? substr( $current_url, 0, $position ) : $current_url;

    return trailingslashit( $nopaging_url );

}

echo get_nopaging_url();

Ahora, siempre devuelve la URL correcta.

(Esto es útil si necesitas implementar algún tipo de filtro de publicaciones que añada un parámetro para filtrar publicaciones por, digamos, un campo meta. Así, incluso si un usuario establece el parámetro de filtro en la página X, los nuevos resultados filtrados siempre comenzarán desde la URL base, no desde la página X, evitando errores 404 si hay menos publicaciones filtradas.)

29 nov 2016 11:57:39
Comentarios

Muy bien. Muy cerca. Pero '/page' no es lo suficientemente estricto. Por ejemplo, http://page-me.com devolverá un valor; un valor que es incorrecto.

Chief Alchemist Chief Alchemist
15 jun 2018 20:09:44

@ChiefAlchemist buen punto, ni siquiera pensé en que la subcadena /page pudiera ser parte del nombre de dominio (si no se usa www, por supuesto). Eso es, en mi opinión, más bien un caso límite. Sin embargo, te animo a que contribuyas añadiendo código que cubra este caso también.

Ihor Vorotnov Ihor Vorotnov
19 jun 2018 00:27:30

Vorotbov - Lo haré. Por favor, mira abajo. Por lo que vale, hay muchas palabras con la subcadena 'page' en ellas. No creo que sea seguro asumir que es un caso límite. Es mejor hacerlo lo más preciso posible. Menos preocupaciones a largo plazo.

Chief Alchemist Chief Alchemist
20 jun 2018 16:25:58

Cierto, pero aunque estoy de acuerdo contigo en general, la pregunta era sobre un problema específico, y se resolvió de la manera más eficiente para ese caso particular. Si mi dominio no tiene esta subcadena, entonces simplemente no necesito usar expresiones regulares que son más lentas que un simple substr (y que funciona bien para mi caso). No es un plugin o tema público, por lo que no necesito cubrir todos los posibles casos extremos. Sin embargo, tu aporte es apreciado y espero que pueda ayudar a otros desarrolladores en el futuro. ¡Gracias!

Ihor Vorotnov Ihor Vorotnov
22 jun 2018 11:41:43
0

Mis especificaciones eran muy similares a las de Ihor Vorotnov, excepto que yo tenía más de un parámetro. Así que, partiendo de su respuesta, modifiqué el código para usar una expresión regular:

function get_nopaging_url() {
    $current_url =  $_SERVER[REQUEST_URI];

    $pattern = '/page\\/[0-9]+\\//i';
    $nopaging_url = preg_replace($pattern, '', $current_url);

    return  $nopaging_url;
}
20 abr 2017 15:31:32
1

Si deseas eliminar todas las combinaciones posibles de paginación entonces utiliza este fragmento de código:

// eliminar paginación de la url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);

Se encargará de

/page
/page/
/page/1
/page/1/
...

y no distingue entre mayúsculas y minúsculas, funciona para cualquier número de página de paginación y también eliminará cualquier combinación de números finales/números/números... (pruebas aquí: https://regex101.com/r/9fQaLC/1)

Si deseas obtener la URL completa con http(s) al inicio simplemente añade

$url = home_url($url);

En esa línea también puedes añadir cualquier parámetro GET personalizado así

$url = home_url($url . '?typ=test');
8 ago 2019 12:27:49
Comentarios

Personalmente, siempre trato de evitar expresiones regulares si algo se puede hacer sin ellas (y aún así mantenerse lo suficientemente simple). Además, se debe usar add_query_arg() para agregar parámetros GET en lugar de concatenación de cadenas. Pero la respuesta en sí es correcta y hace el trabajo, gracias.

Ihor Vorotnov Ihor Vorotnov
8 ago 2019 23:59:51
2
/**
 * Obtiene la URL actual optimizada para SEO
 * Elimina la paginación (/page/) de la URL si existe
 * @return string URL limpia terminada en /
 */
function getCurrentUrlSeo() {
    global $wp;
    $current_url = home_url($wp->request);
    $pos = mb_strpos($current_url, '/page');
    $finalurl = $pos ? substr($current_url, 0, $pos) : $current_url;
    return $finalurl.'/';
}
16 mar 2022 13:57:12
Comentarios

Gracias - a primera vista es lo mismo que la respuesta de Ihor. ¿Puedes editar la respuesta para explicar qué has cambiado y por qué esto es mejor?

Rup Rup
16 mar 2022 17:22:17

Es literalmente el mismo código, excepto que se fuerza manualmente a añadir / en lugar de usar trailingslashit() (que, por cierto, se asegura de que solo se añada 1 barra)

Ihor Vorotnov Ihor Vorotnov
17 mar 2022 14:41:20
2
-1

Aunque esta pregunta ya fue respondida aquí (no aceptada), este fragmento de código debería funcionar: home_url(add_query_arg(NULL, NULL));.

29 nov 2016 11:13:22
Comentarios

Probé este truco, no funciona. La salida todavía tiene /page/2/ agregado.

Ihor Vorotnov Ihor Vorotnov
29 nov 2016 11:38:08

Oh lo siento, entendí que querías obtener la URL completa pero falló porque siempre devolvía la URL sin page/{numpagina}.

Fabian Marz Fabian Marz
29 nov 2016 11:57:30
1
-1
trait TraitURLStrip {

    /**
     * Elimina la paginación y la cadena de consulta. Devuelve una URL amigable para filtrar resultados
     *
     * @param bool   $str_url
     * @param string $str_page
     *
     * @return bool|string
     */
    protected function urlStrip( $str_url = false , $str_page = 'page' ){

        if ( is_string( $str_url) ) {

            $arr_parse_url = wp_parse_url( $str_url );

            $str_path_no_page = '';
            if ( isset( $arr_parse_url['path'] ) ) {

                // si estamos paginando entonces eliminamos eso. ¡por favor!
                $str_path_no_page = preg_replace( "/\/{$str_page}\/[0-9]*\/$/", "/", $arr_parse_url['path'] );

            }

            $str_scheme_host = "{$arr_parse_url['scheme']}://{$arr_parse_url['host']}";

            return $str_scheme_host . $str_path_no_page;
        }
        return false;
    }
}
20 jun 2018 16:22:10
Comentarios

¿Puedo preguntar por qué devuelves false si $str_url no es una cadena? Si accidentalmente (lo cual no debería ocurrir, por cierto) pasas cualquier otra cosa, estás destruyendo los datos. Supongo que sería mejor devolver $str_url sin modificar. Además, tienes una verificación para la cadena, pero no te aseguras de que sea realmente una URL que pueda ser analizada (y si no lo es, el código siguiente fallará - wp_parse_url puede devolver false, null, int, string y array). Adicionalmente, no estoy seguro de que tenga sentido usarlo como un trait, no todo el mundo usa clases en todas partes (oye, esto es WordPress, ¿verdad?).

Ihor Vorotnov Ihor Vorotnov
22 jun 2018 11:46:01