Come visualizzare l'URL della pagina corrente?


56

Voglio aggiungere un codice PHP personalizzato per garantire che ogni volta che una pagina del mio sito viene caricata nel mio browser, l'URL di quella pagina viene ripetuto sullo schermo. Posso usare echo get_permalink(), ma non funziona su tutte le pagine. Alcune pagine (ad es. La mia homepage ) mostrano diversi post e, se lo uso get_permalink()su queste pagine, l'URL della pagina visualizzata non viene restituito (credo che restituisca l'URL dell'ultimo post nel ciclo). Per queste pagine, come posso restituire l'URL?

Posso collegarmi get_permalink()a un gancio particolare che si attiva prima dell'esecuzione del loop? O posso in qualche modo uscire dal ciclo o ripristinarlo una volta completato?

Grazie.


Puoi fornire un contesto su cosa vorresti fare con questo URL? Stai cercando di creare URL condivisibili? Montare URL personalizzati per collegamenti / azioni?
Tom J Nowell

@TomJNowell Vorrei accodare un particolare script JS, ma solo su determinate pagine (in questo caso, quelle pagine sono l'homepage del mio sito in varie lingue: esempio.com , esempio.com/fr , esempio.com/es , eccetera). Il file JS servirà al server per aggiungere collegamenti ipertestuali a diversi titoli che compaiono solo sulla homepage.
cag8f,

perché non usare semplicemente is_home()o is_page( 'fr' )etc e accodare lo script solo se è vero?
Tom J Nowell

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

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

Risposte:


88

get_permalink() è davvero utile solo per singole pagine e post e funziona solo all'interno del ciclo.

Il modo più semplice che ho visto è questo:

global $wp;
echo home_url( $wp->request )

$wp->requestinclude la parte del percorso dell'URL, ad es. /path/to/pagee home_url()genera l'URL in Impostazioni> Generali, ma puoi aggiungere un percorso ad esso, quindi stiamo aggiungendo il percorso della richiesta all'URL principale in questo codice.

Si noti che questo probabilmente non funzionerà con Permalink impostato su Plain e lascerà fuori le stringhe di query (la ?foo=barparte dell'URL).

Per ottenere l'URL quando i permalink sono impostati su plain puoi $wp->query_varsinvece usare , passandolo a add_query_arg():

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );

E puoi combinare questi due metodi per ottenere l'URL corrente, inclusa la stringa di query, indipendentemente dalle impostazioni di permalink:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );

7
Se permalinks impostati su pianura: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin,

1
@Jacob L'ho provato, ma sembra che stia restituendo solo l'URL della mia homepage. Come puoi vedere in alto a sinistra in questa pagina ( dev.horizonhomes-samui.com/properties/hs0540 ), dove ho inserito il codice echo home_url( $wp->request ). Mi sono assicurato di includere global $wpanche. I permalink non sono "semplici", ma impostati su "Nome post". Non vedo alcun errore PHP rilevante nel registro. Questa particolare pagina fa parte del mio sito di sviluppo, che altrimenti viene bloccato ai visitatori. Non sono sicuro che sia importante o meno. modifica: in realtà, tieni questo pensiero - potrebbe essere un errore dell'utente. Stand by ...
cag8f,

@Jacob edit 2: OK, il tuo codice funziona davvero. Il mio problema era che includevo il codice in funzioni.php 'nudo', cioè non in nessuna funzione collegata a un hook. Quindi il tuo codice stava restituendo l'URL della home page, indipendentemente dalla pagina visualizzata nel mio browser. Una volta spostato il codice all'interno di una funzione, una funzione collegata a un hook WP (wp_enqueue_scripts), ha effettivamente restituito l'URL della pagina visualizzata. Conosci la ragione di quel comportamento? Forse ho bisogno di creare una nuova domanda per quello.
cag8f,

3
@ cag8f Se il codice è "nudo" in Functions.php, allora lo stai eseguendo prima che tutte le proprietà dell'oggetto $ wp siano state impostate. Quando lo avvolgi in una funzione collegata a un hook appropriato, ne stai ritardando l'esecuzione fino a quando non viene eseguito un punto adatto nell'esecuzione del codice Wordpress.
Andy Macaulay-Brook,

Questi metodi sono tutti fantastici e ottime idee per lavorare con WordPress. Potresti aggiungere trailingslashit()a loro però, a seconda delle tue esigenze.
Jake,

8

È possibile utilizzare il codice seguente per ottenere l'intero URL 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.


Salve, se dai un'occhiata a developer.wordpress.org/reference/functions/add_query_arg vedrai che il tuo codice non conserva effettivamente i parametri di query esistenti.
Andy Macaulay-Brook,

2
Per conservare i parametri della query dovrai sostituire il vuoto array()con $_GET. vale a dire:home_url(add_query_arg($_GET,$wp->request));
Brad Adams,

Non funzionerà se WordPress è installato nella sottodirectory
ManzoorWani,

1
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();

Puoi spiegare come e perché questo codice risolve la domanda?
kero,

Secondo me la soluzione più flessibile. Funziona su qualsiasi pagina WP (anche su wp-admin, wp-login.php, pagine di archivio, ecc.). Si noti che non include alcun parametro URL
Philipp

1

Il seguente codice fornirà l'URL corrente:

global $wp;
echo home_url($wp->request)

È possibile utilizzare il codice seguente per ottenere l'URL completo insieme ai parametri della query.

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

Questo mostrerà il percorso completo, inclusi i parametri della query. Ciò manterrà i parametri della query se già presenti nell'URL.


Questo snippet salta wp-admin/plugins.phpnel mio URL corrente, è solo il percorso principale e le stringhe di query.
Ryszard Jędraszyk,

0

Questo è un modo migliorato di esempio menzionato in precedenza. Funziona quando sono abilitati URL graziosi, ma scarta se esiste un parametro di query come / page-slug /? Param = 1 o l'URL è brutto.

L'esempio seguente funzionerà su 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 ) )

0

Forse wp_guess_url()è quello che ti serve. Disponibile dalla versione 2.6.0.


Questo indovina solo l'URL di base. Sul frontend, si finisce con un effetto simile a home_url().
Jake,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.