Ottenere l'URL corrente (permalink) senza /page/{pagenum}/
Come posso recuperare l'URL corrente (sia homepage, archivio, archivio dei tipi di post, archivio di categoria, ecc.) ma sempre senza la parte /page/{pagenum}/
se presente? Quindi, se l'URL reale è:
example.com/category/uncategorized/
OPPURE
example.com/category/uncategorized/page/2/
allora il valore restituito sarà sempre
example.com/category/uncategorized/

Puoi ottenere l'URL corrente attraverso home_url( $wp->request )
.
Prova l'esempio qui sotto:
global $wp;
// ottieni l'url corrente con la query string.
$current_url = home_url( $wp->request );
// ottieni la posizione dove inizia il testo '/page..'.
$pos = strpos($current_url , '/page');
// rimuovi la stringa dalla posizione specifica
$finalurl = substr($current_url,0,$pos);
echo $finalurl;

In realtà il modo più semplice sarebbe usare get_pagenum_link()
che restituirà l'URL corrente senza alcun parametro /page/*
.
Bonus
Puoi anche usarlo semplicemente per creare dinamicamente i link "Precedente" e "Successivo" utilizzando la variabile di query 'paged'
:
// Ottieni il numero della pagina corrente.
$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>';
// E avendo un oggetto `WP_Query` puoi anche creare il link per l'ultima pagina:
$max = $the_query->max_num_pages;
$last_page = '<a href="' . get_pagenum_link($max) . '" class="page-last">>></a>';

La risposta di Govind Kumar ha funzionato, tuttavia restituiva l'URL solo se /page/{numeropagina}/ era presente nell'URL e non restituiva nulla in caso contrario. Avevo bisogno di una soluzione universale che restituisse sempre l'URL base senza paginazione, quindi ho modificato leggermente il codice di Govind e l'ho racchiuso in una funzione:
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();
Ora restituisce sempre l'URL corretto.
(Questo è utile se hai bisogno di implementare filtri per i post che aggiungono un parametro per filtrare i post, ad esempio, per un campo meta. In questo modo, anche se un utente imposta il parametro del filtro sulla pagina X, i nuovi risultati filtrati inizieranno sempre dall'URL base, non dalla pagina X, evitando errori 404 se ci sono meno post filtrati.)

Molto bene. Molto vicino. Ma '/page' non è sufficientemente rigoroso. Ad esempio, http://page-me.com restituirà un valore; un valore che è errato.

@ChiefAlchemist ottimo punto, non avevo nemmeno pensato che la sottostringa /page
potesse far parte del nome del dominio (se non si usa www, ovviamente). Questo è, secondo me, piuttosto un caso limite. Tuttavia, ti incoraggio a contribuire aggiungendo del codice che copra anche questo caso.

Vorotbov - Lo farò. Vedi sotto. Per quel che vale, ci sono molte parole con la sottostringa 'page' al loro interno. Non credo sia sicuro presumere che sia un caso limite. Meglio renderlo il più preciso possibile. Meno preoccupazioni a lungo termine.

Vero, ma anche se sono d'accordo con te in linea generale, la domanda riguardava un problema specifico, che è stato risolto nel modo più efficiente per quel caso particolare. Se il mio dominio non ha questa sottostringa, allora semplicemente non ho bisogno di usare espressioni regolari, che sono più lente di un semplice substr (e che funziona bene per il mio caso). Non è un plugin o un tema pubblico, quindi non ho bisogno di coprire tutti i possibili casi limite. Tuttavia, il tuo contributo è apprezzato e spero possa aiutare alcuni sviluppatori in futuro. Grazie!

Le mie specifiche erano molto simili a quelle di Ihor Vorotnov, tranne che avevo più di un parametro. Quindi, partendo dalla sua risposta, ho modificato il codice per utilizzare un'espressione regolare:
function get_nopaging_url() {
$current_url = $_SERVER[REQUEST_URI];
$pattern = '/page\\/[0-9]+\\//i';
$nopaging_url = preg_replace($pattern, '', $current_url);
return $nopaging_url;
}

Se vuoi rimuovere tutte le possibili combinazioni di paginazione allora usa questo snippet:
// rimuove la paginazione dall'url
$pattern = '/page(\/)*([0-9\/])*/i';
$url = preg_replace($pattern, '', $GLOBALS['wp']->request);
Si occuperà di
/page
/page/
/page/1
/page/1/
...
ed è case insensitive, funziona per qualsiasi numero di pagina di paginazione e rimuoverà anche qualsiasi combinazione di numeri finali/numeri/numeri... (test qui: https://regex101.com/r/9fQaLC/1)
Se vuoi ottenere l'URL completo con http(s) iniziale aggiungi semplicemente
$url = home_url($url);
In quella riga puoi anche aggiungere qualsiasi parametro GET personalizzato così
$url = home_url($url . '?typ=test');

Personalmente, cerco sempre di evitare le espressioni regolari se qualcosa può essere fatto senza di esse (e rimanere comunque abbastanza semplice). Inoltre, add_query_arg() dovrebbe essere utilizzato per aggiungere parametri GET invece della concatenazione di stringhe. Ma la risposta in sé è corretta e fa il suo lavoro, grazie.

/**
* Ottiene l'URL corrente ottimizzato per SEO
* Rimuove la paginazione dagli URL per evitare contenuti duplicati
* @return string URL pulito con trailing slash
*/
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.'/';
}

Grazie - a prima vista è lo stesso della risposta di Ihor. Puoi modificare la risposta per spiegare cosa hai cambiato e perché questa soluzione è migliore?

Sebbene questa domanda sia già stata risposta qui (non accettata), questo snippet dovrebbe funzionare: home_url(add_query_arg(NULL, NULL));
.

trait TraitURLStrip {
/**
* Rimuove la paginazione e la query string. Restituisce un URL ottimizzato per il filtraggio dei risultati
*
* @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'] ) ) {
// Se c'è la paginazione, rimuovila per favore!
$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;
}
}

Posso chiedere perché restituisci false se $str_url non è una stringa? Se accidentalmente (cosa che comunque non dovrebbe accadere) passi qualsiasi altra cosa, stai distruggendo i dati. Suppongo che sarebbe meglio restituire $str_url non modificato. Inoltre, hai un controllo per la stringa, ma non ti assicuri che sia effettivamente un URL che può essere analizzato (e se non lo è, il codice seguente si interromperà - wp_parse_url può restituire false, null, intero, stringa e array). Inoltre, non sono sicuro che abbia senso usarlo come trait, non tutti usano le classi ovunque (hey, è WordPress, giusto?).
