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

11

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

example.com/category/uncategorized/

O

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

entonces el valor de retorno siempre será

example.com/category/uncategorized/

Ihor Vorotnov
fuente

Respuestas:

12

Puede obtener la URL actual a través de home_url( $wp->request ).

Pruebe el siguiente ejemplo:

global $wp;

// get current url with query string.
$current_url =  home_url( $wp->request ); 

// get the position where '/page.. ' text start.
$pos = strpos($current_url , '/page');

// remove string from the specific postion
$finalurl = substr($current_url,0,$pos);


echo $finalurl;
Govind Kumar
fuente
Esto funcionó! Aunque no devolvía nada si no había / page / X / en la URL, modifiqué un poco para hacerlo universal. ¡Muchas gracias!
Ihor Vorotnov
7

La respuesta de Govind Kumar funcionó, sin embargo, solo devolvió la URL si / page / {pagenum} / estaba presente en la URL y no devolvió nada si no. 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 incluí 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 necesita implementar algún tipo de filtro de publicación que agregue un parámetro para filtrar publicaciones por, digamos, un metaarchivo. Por lo tanto, incluso si un usuario establece el parámetro de filtro en la página X, los nuevos resultados filtrados siempre comience desde la URL base, no desde la página X y arroje 404 si hay menos publicaciones filtradas ) .

Ihor Vorotnov
fuente
Muy bien. Muy cerca. Pero '/ page' no es lo suficientemente estricto. Por ejemplo, page-me.com devolverá un valor; Un valor incorrecto.
Jefe Alquimista
@ChiefAlchemist buen punto, ni siquiera pensé en que la /pagesubcadena sea parte del nombre de dominio (si www no se usa, por supuesto). Eso es, en mi opinión, más bien un caso extremo. Sin embargo, le recomiendo que contribuya agregando código que también cubra este caso.
Ihor Vorotnov
Vorotbov - Lo haré. Por favor ver más abajo. fwiw, hay muchas palabras con la 'página' substr. No creo que sea seguro suponer que es un caso marginal. Lo mejor es hacerlo lo más ajustado posible. Menos preocupación a largo plazo.
Jefe Alquimista
Es cierto, pero si bien estoy de acuerdo con usted en general, la pregunta era un problema específico y se resolvió de la manera más eficiente para el caso particular. Si mi dominio no tiene esta subcadena, entonces no necesito usar expresiones regulares que sean más lentas que la simple subcadena (y que funciona bien para mi caso). No es un complemento o tema público, por lo tanto, no necesito cubrir todos y cada uno de los casos extremos posibles. Sin embargo, su adición es apreciada y la esperanza puede ayudar a algunos futuros desarrolladores. ¡Gracias!
Ihor Vorotnov
5

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


Prima

También puede usarlo simplemente para crear dinámicamente enlaces "Anterior" y "Siguiente" utilizando la 'paged'variable de consulta:

// Get the current page number.
$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>';

// And having a `WP_Query` object you can also build the link for the last page:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';
leymannx
fuente
3

Mis detalles eran muy similares a los de Ihor Vorotnov, excepto que tenía más de un parámetro. Entonces, a partir 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;
}
Lorenzo
fuente
0

Si desea eliminar todas las combinaciones de paginación posibles , utilice este fragmento:

// remove pagination from 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úmero / número / número final ... (pruebas aquí: https://regex101.com/r/9fQaLC/1 )

Si desea obtener la URL completa con los principales http (s) simplemente agregue

$url = home_url($url);

En esa línea también puede agregar cualquier parámetro GET personalizado como tal

$url = home_url($url . '?typ=test');
Larzan
fuente
1
Personalmente, siempre trato de evitar expresiones regulares si se puede hacer algo sin ellas (y aún así ser lo suficientemente simple). Además, add_query_arg () debe usarse 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
-1

Mientras que esta pregunta ya fue contestada aquí (no aceptado), este fragmento debe hacer el truco: home_url(add_query_arg(NULL, NULL));.

Fabian Marz
fuente
He intentado este truco, no funciona. La salida todavía tiene / page / 2 / adjunta.
Ihor Vorotnov
Oh, lo siento, entendí que desea obtener la URL completa pero falló porque siempre estaba devolviendo la URL sin ella page/{pagenum}.
Fabian Marz
-1
trait TraitURLStrip {

    /**
     * Strips off paging and query string. Returns a filter-the-results friendly URL
     *
     * @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'] ) ) {

                // if we're paging then remove that. please!
                $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;
    }
}
Alquimista jefe
fuente
¿Puedo preguntar por qué devuelve falso si $ str_url no es una cadena? Si accidentalmente (que no debería suceder por cierto) pasa algo más, está destruyendo los datos. Supongo que devolver $ str_url no modificado en su lugar sería mejor. Además, tiene una comprobación para la cadena, pero no se asegura de que en realidad sea una URL que se puede analizar (y si no, el siguiente código se romperá: wp_parse_url puede devolver falso, nulo, int, cadena y matriz). Además, no estoy seguro de si usarlo como un rasgo tiene sentido, no todos usan clases en todas partes (oye, es WordPress, ¿verdad?).
Ihor Vorotnov