Come ottenere l'URL della pagina corrente visualizzata?
Voglio aggiungere del codice PHP personalizzato per assicurarmi che ogni volta che una pagina del mio sito viene caricata nel browser, l'URL di quella pagina venga mostrato sullo schermo. Posso usare echo get_permalink()
, ma questo non funziona su tutte le pagine. Alcune pagine (ad esempio la mia homepage) mostrano diversi post, e se uso get_permalink()
su queste pagine, l'URL della pagina visualizzata non viene restituito (credo che restituisca l'URL dell'ultimo post nel loop). Per queste pagine, come posso ottenere l'URL?
Posso collegare get_permalink()
a un particolare hook che viene eseguito prima dell'esecuzione del loop? Oppure posso in qualche modo uscire dal loop, o resettarlo una volta completato?
Grazie.
get_permalink()
è veramente utile solo per le pagine singole e gli articoli, e funziona solo all'interno del loop.
Il modo più semplice che ho visto è questo:
global $wp;
echo home_url( $wp->request )
$wp->request
include la parte del percorso dell'URL, ad esempio /path/to/page
e home_url()
restituisce l'URL impostato in Impostazioni > Generali, ma è possibile aggiungere un percorso, quindi in questo codice stiamo aggiungendo il percorso della richiesta all'URL principale.
Nota che questo probabilmente non funzionerà con i Collegamenti Permanenti impostati su Plain (Semplice), e ometterà le stringhe di query (la parte dell'URL ?foo=bar
).
Per ottenere l'URL quando i collegamenti permanenti sono impostati su plain puoi utilizzare $wp->query_vars
, passandolo a add_query_arg()
:
global $wp;
echo add_query_arg( $wp->query_vars, home_url() );
E potresti combinare questi due metodi per ottenere l'URL corrente, inclusa la stringa di query, indipendentemente dalle impostazioni dei collegamenti permanenti:
global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );

Se i permalink sono impostati su plain: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
.

@Jacob Ho provato questo, ma sembra restituire solo l'URL della mia homepage. Come puoi vedere in alto a sinistra in questa pagina (https://dev.horizonhomes-samui.com/properties/hs0540/), dove ho inserito il codice per echo home_url( $wp->request )
. Mi sono assicurato di includere anche global $wp
. I permalink non sono 'Plain', ma impostati su 'Nome articolo'. Non vedo nemmeno errori PHP rilevanti nel log. Questa pagina in particolare fa parte del mio sito di sviluppo, che è altrimenti bloccato ai visitatori. Non sono sicuro se questo sia rilevante o meno. modifica: In effetti, aspetta un attimo - potrebbe essere un errore dell'utente. Un momento...

@Jacob modifica 2: OK il tuo codice funziona effettivamente. Il mio problema era che stavo includendo il codice in functions.php 'nudo', cioè non all'interno di una funzione collegata a un hook. Quindi il tuo codice restituiva l'URL della homepage, indipendentemente dalla pagina visualizzata nel mio browser. Una volta spostato il codice all'interno di una funzione - una funzione collegata a un hook di WordPress (wp_enqueue_scripts), ha effettivamente restituito l'URL della pagina visualizzata. Sai il motivo di questo comportamento? Forse dovrei creare una nuova domanda per questo.

@cag8f Se il codice si trova "nudo" in functions.php allora lo stai eseguendo prima che tutte le proprietà dell'oggetto $wp siano state configurate. Quando lo avvolgi in una funzione collegata ad un hook appropriato stai ritardando la sua esecuzione fino ad un punto adeguato nell'esecuzione del codice WordPress.

Questi metodi sono tutti fantastici e ottime idee per lavorare con WordPress. Potresti aggiungere trailingslashit()
a questi, a seconda delle tue necessità.

Questo funziona bene, ma non tiene conto dello slash finale dell'URL. Considera invece $post_permalink = home_url( $_SERVER['REQUEST_URI'] );
.

Da tenere presente che potrebbe anche essere un file CSS o JS (o in realtà qualsiasi richiesta al server)

@MaxYudin per favore non usare $_SERVER poiché non è abilitato su alcuni hosting.

Fai attenzione quando usi $wp->query_vars
con la pagina che ha un URL personalizzato creato da add_rewrite_rule()
, la query WP normale con query personalizzata sarà esposta. Esempio: /mycustompage/subscribe?pagename=mycustompage&mycustom_subpage=subscribe. Mentre per tutti questi, l'URL che appare nel browser è solo /mycustompage/subscribe.

Ciao - se dai un'occhiata a https://developer.wordpress.org/reference/functions/add_query_arg/ vedrai che il tuo codice non mantiene effettivamente i parametri query esistenti.

Per preservare i parametri query devi sostituire l'array vuoto array()
con $_GET
. Cioè:
home_url(add_query_arg($_GET,$wp->request));

@BradAdams la risposta non funzionava per me finché non ho visto il tuo commento sull'array vuoto. Grazie!

Perché non usare semplicemente?
get_permalink( get_the_ID() );
Questo è per le pagine singole.
Per le pagine di categoria, usa questo:
get_category_link( get_query_var( 'cat' ) );
Script semplice per ottenere l'URL corrente di qualsiasi pagina:
// ottieni l'URL corrente
$current_url = get_permalink( get_the_ID() );
if( is_category() ) $current_url = get_category_link( get_query_var( 'cat' ) );
echo $current_url;

+1 tutte le altre risposte sono molto più complicate, questa è semplicemente la soluzione più semplice

Nel mio caso, questo codice ha funzionato correttamente:
$current_url = home_url($_SERVER['REQUEST_URI']) // Ottiene l'URL corrente utilizzando la funzione home_url di WordPress
Spero che possa essere d'aiuto a qualcuno, ho provato tutte le risposte ma questa è stata quella utile.

Il seguente codice restituirà l'URL corrente:
global $wp;
echo home_url($wp->request)
Puoi utilizzare il codice seguente per ottenere l'URL completo insieme ai parametri di query.
global $wp;
$current_url = home_url(add_query_arg(array($_GET), $wp->request));
Questo mostrerà il percorso completo, inclusi i parametri di query. Manterrà i parametri di query se già presenti nell'URL.

Questo snippet salta wp-admin/plugins.php
nel mio URL corrente, è solo il percorso radice e le stringhe di query.

Quasi! Mancava lo slash finale, e questo causa un rapido reindirizzamento per aggiungerlo quando WP lo analizza, che comporta una piccola penalizzazione SEO, quindi l'ho aggiunto qui sotto. Finora questo crea l'URL esatto
global $wp;
$current_url = home_url(add_query_arg(array($_GET), $wp->request . '/'));

@ShaneMcCurdy Potresti anche utilizzare trailingslashit()
(vedi il commento di Jake sopra)

Le soluzioni qui presentate sono tutte valide ma non erano consistenti tra gli ambienti server locali e remoti. Ho quindi sviluppato una soluzione più semplice e pulita che funziona meglio indipendentemente dalle impostazioni dei permalink di WordPress.
function getCurrentUrl() {
$protocol = is_ssl() ? 'https://' : 'http://';
return ($protocol) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
$currentUrl = getCurrentUrl();
echo $currentUrl;
L'output includerà i parametri di query dell'URL e gli slug.

function current_location()
{
if (isset($_SERVER['HTTPS']) &&
($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$protocol = 'https://';
} else {
$protocol = 'http://';
}
return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
echo current_location();

Cerca sempre di includere un po' di spiegazione con la tua risposta in modo che l'autore della domanda possa comprendere meglio cosa sta succedendo. In questo modo tutti impariamo e la community cresce. :-)

Eh sì, otto anni dopo sono ancora perplesso su come funziona questo, e dove dovresti usarlo (direttamente? dentro un hook? un filtro? il loop?... non ne abbiamo idea).

Questo è ciò che ha funzionato per me (soluzione breve e pulita che include anche le stringhe di query nell'URL):
$current_url = add_query_arg( $_SERVER['QUERY_STRING'], '', home_url( $wp->request ) );
L'URL di output apparirà come segue
http://sometesturl.test/slug1/slug2?queryParam1=testing&queryParam2=123
La soluzione è stata presa da qui

Questo è un modo migliore rispetto all'esempio menzionato in precedenza. Funziona quando i pretty URL sono abilitati, tuttavia non funziona se è presente un parametro di query come /page-slug/?param=1 o se l'URL non è strutturato in modo elegante.
Il seguente esempio funzionerà in entrambi i casi.
$query_args = array();
$query = wp_parse_url( $YOUR_URL );
$permalink = get_option( 'permalink_structure' );
if ( empty( $permalink ) ) {
$query_args = $query['query'];
}
echo home_url( add_query_arg( $query_args , $wp->request ) )

Forse wp_guess_url()
è quello di cui hai bisogno. Disponibile dalla versione 2.6.0.

Dopo tanta ricerca per un compito semplice, una combinazione di tutte le risposte sopra funziona per noi:
function get_wp_current_url(){
global $wp;
// Se la struttura dei permalink è vuota, restituisce l'URL senza slash finale
if('' === get_option('permalink_structure')) return home_url(add_query_arg(array($_GET), $wp->request));
// Altrimenti aggiunge uno slash finale all'URL
else return home_url(trailingslashit(add_query_arg(array($_GET), $wp->request)));
}
Niente slash mancante alla fine e così via. Poiché la domanda riguarda l'output dell'URL corrente, questo non si preoccupa della sicurezza e altre questioni. Tuttavia, gli hash come #comment alla fine non possono essere rilevati in PHP.

Mi rendo conto che questa è una domanda vecchia, tuttavia ho notato che nessuno ha menzionato l'utilizzo di get_queried_object()
.
È una funzione globale di WordPress che recupera qualsiasi elemento relativo all'URL corrente in cui ti trovi. Quindi, per esempio, se ti trovi in una pagina o in un articolo, restituirà un oggetto post. Se ti trovi in un archivio, restituirà un oggetto tipo post.
WordPress ha anche una serie di funzioni helper, come get_post_type_archive_link
a cui puoi passare il campo del tipo di post dell'oggetto e ottenere il suo link in questo modo
get_post_type_archive_link(get_queried_object()->name);
Il punto è che non hai bisogno di fare affidamento su alcune delle soluzioni più approssimative menzionate sopra, ma puoi invece utilizzare l'oggetto interrogato per ottenere sempre l'URL corretto.
Questo funzionerà anche per le installazioni multisite senza lavoro aggiuntivo, poiché utilizzando le funzioni di WordPress, otterrai sempre l'URL corretto.

Hm. Potrebbe esserci la questione di non avere un modo universale per specificare tutti i tipi possibili di oggetti. In altre parole, funzioni come get_post_type_archive_link()
funzionano benissimo se sai in anticipo che hai un link di archivio. Quindi, dovrai comunque capire che tipo di oggetto hai prima di utilizzare una funzione helper specifica su di esso. Man mano che WordPress ottiene sempre più tipi di oggetti, avrai bisogno di più codice per gestire ogni singolo caso separatamente...

get_queried_object contiene SEMPRE informazioni che possono essere utilizzate per determinare quale tipo di oggetto WordPress sia. Questo include gli archivi dei post. È abbastanza facile da testare. Basta provare a visualizzare i risultati della chiamata al metodo in ogni tipo di template, e capirai meglio cosa intendo.

WP ha aggiornato qualcosa e ora la proprietà request del globale $wp è vuota di default. È necessario chiamare il metodo speciale parse_request prima di ottenere i dati di questa proprietà.
Quindi prima era così:
global $wp;
echo home_url( $wp->request );
// Ottiene l'URL della home page
Ora dovrebbe essere in questo modo:
global $wp;
$wp->parse_request();
echo home_url( $wp->request );
// Analizza prima la richiesta e poi ottiene l'URL della home page
P.S. Avrei voluto lasciare un commento sotto la risposta più popolare, ma non ho i permessi per farlo.

Ma parse_request dovrebbe essere già chiamato da $wp->main() alla fine di quel file.

Sì, forse, ma probabilmente qualche plugin lo ha interrotto e la mia classe ha smesso di funzionare correttamente, perché $wp->request restituiva semplicemente una stringa vuota. Quindi è più sicuro utilizzare $wp->parse_request() per assicurarsi che $wp->request sia corretto.
