Obtener la URL actual (permalink) sin /page/{pagenum}/
¿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/

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;

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>';

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.)

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.

@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.

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.

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!

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;
}

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');

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.

/**
* 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.'/';
}

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?

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

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;
}
}

¿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?).
