Cum obții URL-ul paginii curente afișate?

25 iul. 2017, 14:37:59
Vizualizări: 619K
Voturi: 139

Vreau să adaug cod PHP personalizat pentru a mă asigura că de fiecare dată când o pagină de pe site-ul meu se încarcă în browser, URL-ul acelei pagini este afișat pe ecran. Pot folosi echo get_permalink(), dar aceasta nu funcționează pe toate paginile. Unele pagini (de exemplu, pagina mea de start) afișează mai multe articole, iar dacă folosesc get_permalink() pe aceste pagini, URL-ul paginii afișate nu este returnat (cred că returnează URL-ul ultimului articol din buclă). Pentru aceste pagini, cum pot returna URL-ul?

Pot atașa get_permalink() unui anumit hook care se execută înainte ca bucla să fie executată? Sau pot cumva să ies din buclă sau să o resetez odată ce este completă?

Mulțumesc.

5
Comentarii

Ne poți oferi mai mult context despre ce dorești să faci cu acest URL? Încerci să creezi URL-uri partajabile? Să asamblezi URL-uri personalizate pentru linkuri/acțiuni?

Tom J Nowell Tom J Nowell
25 iul. 2017 15:19:05

@TomJNowell Aș dori să încarc un anumit script JS, dar doar pe anumite pagini (în acest caz, acele pagini sunt pagina principală a site-ului meu în diferite limbi: https://www.example.com/, https://www.example.com/fr/, https://www.example.com/es/, etc). Fișierul JS va servi la adăugarea hyperlinkurilor către mai multe titluri care apar doar pe pagina principală.

cag8f cag8f
25 iul. 2017 19:03:54

de ce nu folosești pur și simplu is_home() sau is_page( 'fr' ) etc și încarci scriptul doar dacă este adevărat?

Tom J Nowell Tom J Nowell
25 iul. 2017 19:15:39

@TomJNowell Ei bine, acum codul meu este if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Acesta pare să se execute pe fiecare pagină principală, indiferent de limbă. Asta sugereai?

cag8f cag8f
26 iul. 2017 08:32:52

De ce să nu folosești $_SERVER['REQUEST_URI'] și restul? Vezi această întrebare: https://stackoverflow.com/q/6768793/247696

Flimm Flimm
29 mai 2019 16:07:35
Toate răspunsurile la întrebare 15
11
235

get_permalink() este folositor doar pentru pagini și articole individuale și funcționează doar în interiorul buclei.

Cea mai simplă metodă pe care am văzut-o este aceasta:

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

$wp->request include partea de cale a URL-ului, de exemplu /path/to/page iar home_url() afișează URL-ul din Setări > General, dar poți adăuga o cale la acesta, astfel încât în acest cod adăugăm calea cererii la URL-ul principal.

Rețineți că acest lucru probabil nu va funcționa cu Permalinks setat pe Plain și va omite șirurile de interogare (partea ?foo=bar din URL).

Pentru a obține URL-ul când permalinks sunt setate pe plain poți folosi $wp->query_vars în schimb, transmițându-l către add_query_arg():

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

Și ai putea combina aceste două metode pentru a obține URL-ul curent, inclusiv șirul de interogare, indiferent de setările permalink:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
25 iul. 2017 15:00:07
Comentarii

Dacă permalink-urile sunt setate ca plain: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.

Max Yudin Max Yudin
25 iul. 2017 15:18:26

@Jacob Am încercat asta, dar pare să returneze doar URL-ul paginii mele principale. După cum puteți vedea în partea stângă sus a acestei pagini (https://dev.horizonhomes-samui.com/properties/hs0540/), unde am inserat codul pentru echo home_url( $wp->request ). M-am asigurat că am inclus și global $wp. Permalink-urile nu sunt setate ca 'Plain', ci ca 'Post Name'. Nu văd nici erori PHP relevante în log. Această pagină face parte din site-ul meu de dezvoltare, care este altfel blocat pentru vizitatori. Nu sunt sigur dacă acest lucru contează sau nu. editare: De fapt, stați puțin - ar putea fi eroare de utilizator. Așteptați...

cag8f cag8f
25 iul. 2017 19:14:17

@Jacob editare 2: OK, codul dumneavoastră funcționează într-adevăr. Problema mea era că includeam codul în functions.php 'gol', adică nu într-o funcție atașată unui hook. Astfel, codul dumneavoastră returna URL-ul paginii principale, indiferent de pagina afișată în browser. Odată ce am mutat codul într-o funcție - o funcție atașată unui hook WordPress (wp_enqueue_scripts), acesta a returnat într-adevăr URL-ul paginii afișate. Știți care este motivul acestui comportament? Poate ar trebui să creez o nouă întrebare pentru asta.

cag8f cag8f
25 iul. 2017 19:20:36

@cag8f Dacă codul stă "gol" în functions.php atunci îl rulezi înainte ca toate proprietățile obiectului $wp să fie setate. Când îl învelești într-o funcție atașată unui hook corespunzător, atunci amâni execuția până la un punct potrivit în rularea codului WordPress.

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

Aceste metode sunt toate excelente și idei grozave pentru lucrul cu WordPress. Ai putea adăuga trailingslashit() la acestea, în funcție de necesitățile tale.

Jake Jake
18 oct. 2019 01:56:44

$wp->request este null pentru mine

Steve Moretz Steve Moretz
12 aug. 2021 11:49:18

Te rog să vezi al doilea comentariu al lui cag8f.

Jacob Peattie Jacob Peattie
12 aug. 2021 12:24:20

Aceasta funcționează bine, dar nu ține cont de slash-ul de la finalul URL-ului. Ia în considerare $post_permalink = home_url( $_SERVER['REQUEST_URI'] ); în schimb.

appcropolis appcropolis
24 aug. 2021 18:47:36

De asemenea, este bine de reținut că aceasta ar putea fi și un fișier CSS sau JS (sau de fapt orice cerere către server)

sMyles sMyles
9 nov. 2021 16:59:14

@MaxYudin te rog nu folosi $_SERVER deoarece nu este activat pe unele hostinguri.

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

Ai grijă când folosești $wp->query_vars cu pagina care are URL personalizat creat prin add_rewrite_rule(), interogarea WP normală cu interogare personalizată va fi expusă. Exemplu: /mycustompage/subscribe?pagename=mycustompage&mycustom_subpage=subscribe. În timp ce pentru toate acestea, URL-ul care apare în browser este doar /mycustompage/subscribe.

vee vee
14 dec. 2023 19:24:38
Arată celelalte 6 comentarii
5
31

Poți folosi codul de mai jos pentru a obține întreaga adresă URL curentă în WordPress:

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

Aceasta va afișa calea completă, inclusiv parametrii din query.

5 apr. 2018 13:11:57
Comentarii

Salut - dacă te uiți la https://developer.wordpress.org/reference/functions/add_query_arg/ vei vedea că acel cod nu păstrează de fapt parametrii existenți din query.

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

Pentru a păstra parametrii din query trebuie să înlocuiești array() gol cu $_GET. Adică: home_url(add_query_arg($_GET,$wp->request));

Brad Adams Brad Adams
14 iun. 2018 15:48:43

Nu va funcționa dacă WordPress este instalat într-un subdirector

ManzoorWani ManzoorWani
26 nov. 2018 14:01:21

@BradAdams răspunsul nu a funcționat pentru mine până când am văzut comentariul tău despre array-ul gol. Mulțumesc!

730wavy 730wavy
9 dec. 2022 03:08:19

din păcate, codul din comentariul lui Brad Adams nu adaugă o bară oblică la sfârșitul cererii, astfel încât permalink-ul tău se va termina cu /foo în loc de /foo/

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

De ce să nu folosim pur și simplu?

get_permalink( get_the_ID() );

Aceasta este pentru paginile individuale.

Pentru paginile de categorie, folosiți următoarea metodă:

get_category_link( get_query_var( 'cat' ) );

Script simplu pentru a obține URL-ul curent al oricărei pagini:

// obține URL-ul curent
$current_url = get_permalink( get_the_ID() );
if( is_category() ) $current_url = get_category_link( get_query_var( 'cat' ) );
echo $current_url;
      
22 oct. 2019 02:18:38
Comentarii

+1 toate celelalte răspunsuri sunt mult prea complicate, aceasta este cea mai simplă soluție

Mark Mark
16 apr. 2020 16:37:26

Aceasta este cea mai ușoară metodă. +1

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

nu funcționează cu categoriile blogului pe site-ul meu

Iggy Iggy
21 iun. 2020 17:04:46

Funcționează doar pentru articole și pagini individuale.

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

Aceasta nu include parametrii URL.

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

În cazul meu, acest cod a funcționat perfect:

$current_url = home_url($_SERVER['REQUEST_URI'])

Sper că va ajuta pe cineva, am încercat toate răspunsurile dar aceasta a fost utilă.

10 dec. 2020 13:00:23
Comentarii

Această soluție nu funcționează pentru instalările în subdirectorii. Când home_url este s.b/hm și REQUEST_URI este /hm/current_url/ atunci valoarea devine https://s.b/hm/hm/current_url. Directorul de instalare este repetat.

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

Următorul cod va returna URL-ul curent:

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

Poți folosi codul de mai jos pentru a obține URL-ul complet împreună cu parametrii query.

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

Aceasta va afișa calea completă, inclusiv parametrii query. Acest lucru va păstra parametrii query dacă există deja în URL.

28 dec. 2018 08:02:27
Comentarii

Acest fragment sare peste wp-admin/plugins.php în URL-ul meu curent, este doar calea rădăcină și șirurile de interogare.

Ryszard Jędraszyk Ryszard Jędraszyk
3 aug. 2019 04:25:10

Aproape! Slash-ul final lipsea și astfel cauzează o redirecționare rapidă pentru a-l adăuga când WP îl analizează, ceea ce primește o mică penalizare SEO, așa că l-am adăugat mai jos. Până acum aceasta creează URL-ul exact

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

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

@ShaneMcCurdy Presupun că ai putea folosi și trailingslashit() (vezi comentariul lui Jake mai sus)

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

Soluțiile prezentate aici sunt bune, dar nu erau consistente între mediile locale și cele de pe serverele la distanță. Așadar, am venit cu o soluție mai simplă și elegantă care funcționează mai bine indiferent de setările permalink-urilor din WordPress.

function getCurrentUrl() {
    $protocol = is_ssl() ? 'https://' : 'http://';
    return ($protocol) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
$currentUrl = getCurrentUrl();
echo $currentUrl;

Rezultatul va include parametrii din URL și slug-urile.

30 mai 2021 12:15:41
2
// Funcția returnează URL-ul complet al paginii curente
function current_location()
{
    // Verifică dacă site-ul rulează pe HTTPS
    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://';
    }
    // Returnează protocolul + numele host-ului + calea URI
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

// Afișează URL-ul complet
echo current_location();
29 nov. 2018 12:32:56
Comentarii

Poți explica cum și de ce acest cod rezolvă întrebarea?

kero kero
29 nov. 2018 13:29:05

În opinia mea este cea mai flexibilă soluție. Funcționează pe orice pagină WordPress (chiar și pe wp-admin, wp-login.php, pagini de arhivă etc). Doar să observi că nu include niciun parametru URL

Philipp Philipp
1 apr. 2019 19:09:31
3
// Folosește variabila globală $wp
global $wp;
// Procesează cererea URL curentă
$wp->parse_request();
// Obține URL-ul curent complet, incluzând path-ul curent
$current_url = home_url($wp->request);
13 ian. 2021 03:34:10
Comentarii

Încearcă întotdeauna să incluzi și o mică explicație împreună cu răspunsul tău, astfel încât autorul întrebării să înțeleagă mai bine ce se întâmplă. În acest fel, cu toții învățăm și comunitatea crește. :-)

Tony Djukic Tony Djukic
13 ian. 2021 04:13:39

Da, după opt ani încă sunt nedumerit cum funcționează acest lucru și unde ar trebui să-l folosești (direct? în interiorul unui hook? unui filtru? buclei?... habar n-avem).

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

Îmi place că apelarea wp::parse_request() funcționează pentru a capta endpoint-urile din URL. Este pur și simplu elegant.

Howdy_McGee Howdy_McGee
28 sept. 2021 23:40:27
0

Iată ce a funcționat pentru mine (o soluție scurtă și curată care include și parametrii query string în URL):

$current_url = add_query_arg( $_SERVER['QUERY_STRING'], '', home_url( $wp->request ) );

URL-ul rezultat va arăta astfel:

http://sometesturl.test/slug1/slug2?queryParam1=testing&queryParam2=123

Soluția a fost preluată de aici

15 iul. 2020 19:40:05
0

Aceasta este o modalitate îmbunătățită a exemplului menționat anterior. Funcționează când URL-urile prietenoase sunt activate, însă nu funcționează dacă există vreun parametru de interogare precum /page-slug/?param=1 sau dacă URL-ul nu este formatat elegant.

Următorul exemplu va funcționa în ambele cazuri.

    $query_args = array();

    // Parsează URL-ul
    $query = wp_parse_url( $YOUR_URL );

    // Obține structura permalink-urilor
    $permalink = get_option( 'permalink_structure' );

    // Verifică dacă structura permalink-urilor este goală
    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    // Afișează URL-ul complet cu parametrii de interogare
    echo home_url( add_query_arg( $query_args , $wp->request ) )
11 iun. 2018 19:08:21
1

Probabil wp_guess_url() este ceea ce ai nevoie. Disponibil începând cu versiunea 2.6.0.

1 oct. 2019 11:54:43
Comentarii

Aceasta doar ghicește URL-ul de bază. În frontend, ajungi să ai un efect similar cu home_url().

Jake Jake
18 oct. 2019 01:54:08
0

După multe cercetări pentru o sarcină simplă, o combinație a tuturor răspunsurilor de mai sus funcționează pentru noi:

function get_wp_current_url(){
    // Declarăm variabila globală wp
    global $wp;
    // Verificăm dacă structura permalink-urilor este goală
    if('' === get_option('permalink_structure')) return home_url(add_query_arg(array($_GET), $wp->request));
        // Returnăm URL-ul cu slash la final
        else return home_url(trailingslashit(add_query_arg(array($_GET), $wp->request)));
}

Nu lipsește slash-ul de la sfârșit și așa mai departe. Deoarece întrebarea este despre afișarea URL-ului curent, aceasta nu se ocupă de securitate și alte aspecte. Cu toate acestea, hash-ul precum #comment de la final nu poate fi găsit în PHP.

5 apr. 2020 01:58:58
2

Realizez că aceasta este o întrebare mai veche, însă am observat că nimeni nu a menționat utilizarea funcției get_queried_object().

Este o funcție globală WordPress care preia orice element legat de URL-ul curent pe care vă aflați. Astfel, dacă sunteți pe o pagină sau articol, va returna un obiect de tip post. Dacă sunteți pe o arhivă, va returna un obiect de tip post type.

WordPress are, de asemenea, o serie de funcții ajutătoare, cum ar fi get_post_type_archive_link căreia îi puteți da câmpul post type al obiectului și va returna link-ul acestuia astfel

get_post_type_archive_link(get_queried_object()->name);

Ideea este că nu trebuie să vă bazați pe unele dintre răspunsurile mai complicate de mai sus și în schimb puteți utiliza obiectul solicitat pentru a obține întotdeauna URL-ul corect.

Această metodă va funcționa și pentru instalări multisite fără muncă suplimentară, deoarece folosind funcțiile WordPress, veți obține întotdeauna URL-ul corect.

28 iul. 2020 10:29:32
Comentarii

Hm. Probabil că ar putea exista problema de a nu avea o modalitate universală de specificare a tuturor tipurilor de obiecte posibile. Cu alte cuvinte, funcții precum get_post_type_archive_link() funcționează excelent dacă știi, în avans, că ai un link de arhivă. Astfel, va trebui să determini ce tip de obiect ai înainte de a utiliza o funcție ajutătoare specifică pentru acesta. Pe măsură ce WP primește din ce în ce mai multe tipuri de obiecte, ai nevoie de mai mult cod pentru a gestiona fiecare caz individual separat...

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

get_queried_object conține ÎNTOTDEAUNA informații care pot fi folosite pentru a determina ce tip de obiect WordPress este. Acest lucru include și arhivele de postări. Este destul de ușor de testat. Pur și simplu încearcă să vizualizezi rezultatele apelului metodei în fiecare tip de șablon și vei înțelege mai bine ce vreau să spun.

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

WP a actualizat ceva și acum proprietatea request a variabilei globale $wp este goală în mod implicit. Trebuie să apelezi metoda specială parse_request înainte de a obține datele acestei proprietăți.

Deci înainte era așa:

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

Acum ar trebui să fie în felul următor:

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

P.S. Aș fi vrut să las un comentariu sub cel mai popular răspuns, dar nu am permisiuni pentru a lăsa comentarii.

29 oct. 2021 07:25:37
Comentarii

Dar parse_request ar trebui să fie deja apelat de $wp->main() la sfârșitul acelui fișier.

Rup Rup
1 nov. 2021 12:34:42

Da, poate, dar probabil un plugin l-a stricat și clasa mea a încetat să funcționeze corect, deoarece $wp->request returna doar un șir gol. Așa că este mai sigur să folosim $wp->parse_request() pentru a ne asigura că $wp->request este corect.

Ivan Ivan Ivan Ivan
4 dec. 2021 00:48:33
0

Poate fi târziu, dar pentru oricine ar putea fi de ajutor, get_page_link() ar trebui să funcționeze. Dacă doriți doar URI-ul paginii, get_page_uri() este funcția helper perfectă.

29 oct. 2024 07:50:29