Come ottenere l'URL della pagina corrente visualizzata?

25 lug 2017, 14:37:59
Visualizzazioni: 619K
Voti: 139

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.

5
Commenti

Puoi fornire un po' di contesto su cosa vorresti fare con questo URL? Stai cercando di creare URL condivisibili? Assemblare URL personalizzati per link/azioni?

Tom J Nowell Tom J Nowell
25 lug 2017 15:19:05

@TomJNowell Vorrei accodare uno script JS specifico, ma solo su determinate pagine (in questo caso, quelle pagine sono la homepage del mio sito in varie lingue: https://www.example.com/, https://www.example.com/fr/, https://www.example.com/es/, ecc). Il file JS servirà per aggiungere hyperlink a diversi titoli che appaiono solo sulla homepage.

cag8f cag8f
25 lug 2017 19:03:54

perché non usare semplicemente is_home() o is_page( 'fr' ) ecc e accodare lo script solo se è true?

Tom J Nowell Tom J Nowell
25 lug 2017 19:15:39

@TomJNowell Bene, ora il mio codice è if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Questo sembra attivarsi su ogni homepage, indipendentemente dalla lingua. È questo che stavi suggerendo?

cag8f cag8f
26 lug 2017 08:32:52

Perché non usare $_SERVER['REQUEST_URI'] e compagnia? Guarda questa domanda: https://stackoverflow.com/q/6768793/247696

Flimm Flimm
29 mag 2019 16:07:35
Tutte le risposte alla domanda 15
11
235

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 ) );
25 lug 2017 15:00:07
Commenti

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

Max Yudin Max Yudin
25 lug 2017 15:18:26

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

cag8f cag8f
25 lug 2017 19:14:17

@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 cag8f
25 lug 2017 19:20:36

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

Andy Macaulay-Brook Andy Macaulay-Brook
5 apr 2018 14:28:33

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

Jake Jake
18 ott 2019 01:56:44

$wp->request è null per me

Steve Moretz Steve Moretz
12 ago 2021 11:49:18

Si prega di consultare il secondo commento di cag8f.

Jacob Peattie Jacob Peattie
12 ago 2021 12:24:20

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

appcropolis appcropolis
24 ago 2021 18:47:36

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

sMyles sMyles
9 nov 2021 16:59:14

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

Ravi Soni Ravi Soni
4 feb 2022 20:40:56

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.

vee vee
14 dic 2023 19:24:38
Mostra i restanti 6 commenti
5
31

Puoi utilizzare il codice seguente per ottenere l'URL completo corrente in WordPress:

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));

Questo mostrerà il percorso completo, inclusi i parametri della query.

5 apr 2018 13:11:57
Commenti

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.

Andy Macaulay-Brook Andy Macaulay-Brook
5 apr 2018 13:55:07

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

Brad Adams Brad Adams
14 giu 2018 15:48:43

Non funzionerà se WordPress è installato in una sottodirectory

ManzoorWani ManzoorWani
26 nov 2018 14:01:21

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

730wavy 730wavy
9 dic 2022 03:08:19

il codice del commento di Brad Adams purtroppo non aggiunge uno slash finale alla richiesta quindi il tuo permalink finirebbe come /foo invece di /foo/

DrLightman DrLightman
20 mar 2024 15:49:18
5
22

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;
22 ott 2019 02:18:38
Commenti

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

Mark Mark
16 apr 2020 16:37:26

Questo è il modo più semplice. +1

Syafiq Freman Syafiq Freman
23 mag 2020 21:30:39

non funziona con le categorie del blog sul mio sito

Iggy Iggy
21 giu 2020 17:04:46

Funziona solo per singoli articoli e pagine.

Andy Macaulay-Brook Andy Macaulay-Brook
12 mar 2021 16:17:18

Questo non include i parametri URL.

GeorgeP GeorgeP
19 apr 2022 15:14:08
1
20

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.

10 dic 2020 13:00:23
Commenti

Questa soluzione non funziona per le installazioni in sottodirectory. Quando home_url è s.b/hm e REQUEST_URI è /hm/current_url/ allora il valore diventa https://s.b/hm/hm/current_url. La directory di installazione viene ripetuta.

bobbingwide bobbingwide
2 feb 2024 19:05:10
3
12

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.

28 dic 2018 08:02:27
Commenti

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

Ryszard Jędraszyk Ryszard Jędraszyk
3 ago 2019 04:25:10

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

Shane McCurdy Shane McCurdy
19 mar 2021 04:32:13

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

Gwyneth Llewelyn Gwyneth Llewelyn
26 mag 2021 18:19:20
0

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.

30 mag 2021 12:15:41
2
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();
29 nov 2018 12:32:56
Commenti

Puoi spiegare come e perché questo codice risolve il problema?

kero kero
29 nov 2018 13:29:05

Secondo me è la soluzione più flessibile. Funziona su qualsiasi pagina WordPress (anche su wp-admin, wp-login.php, pagine di archivio, ecc). Da notare che non include alcun parametro URL

Philipp Philipp
1 apr 2019 19:09:31
3
// Ottenere l'oggetto globale $wp
global $wp;
// Analizza la richiesta corrente
$wp->parse_request();
// Ottiene l'URL corrente combinando l'URL base del sito con la richiesta corrente
$current_url = home_url($wp->request);
13 gen 2021 03:34:10
Commenti

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

Tony Djukic Tony Djukic
13 gen 2021 04:13:39

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

Gwyneth Llewelyn Gwyneth Llewelyn
26 mag 2021 18:17:10

Mi piace che l'esecuzione di wp::parse_request() funzioni per intercettare gli endpoint nell'URL. È davvero interessante.

Howdy_McGee Howdy_McGee
28 set 2021 23:40:27
0

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

15 lug 2020 19:40:05
0

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 ) )
11 giu 2018 19:08:21
1

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

1 ott 2019 11:54:43
Commenti

Questo ipotizza semplicemente l'URL di base. Nel frontend, si ottiene un effetto simile a home_url().

Jake Jake
18 ott 2019 01:54:08
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.

5 apr 2020 01:58:58
2

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.

28 lug 2020 10:29:32
Commenti

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

Gwyneth Llewelyn Gwyneth Llewelyn
26 mag 2021 18:16:13

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.

Hybrid Web Dev Hybrid Web Dev
28 mag 2021 00:28:42
2

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.

29 ott 2021 07:25:37
Commenti

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

Rup Rup
1 nov 2021 12:34:42

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.

Ivan Ivan Ivan Ivan
4 dic 2021 00:48:33
0

Potrebbe essere tardi ma per chiunque possa essere utile, get_page_link() dovrebbe fare al caso tuo. Se vuoi ottenere solo l'URI della pagina, get_page_uri() è la funzione helper perfetta.

29 ott 2024 07:50:29