Cum obții URL-ul paginii curente afișate?
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.

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

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

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

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

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.

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.

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)

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

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.

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.

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

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

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;

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

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.

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

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

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

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.

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

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

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

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

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

Probabil wp_guess_url()
este ceea ce ai nevoie. Disponibil începând cu versiunea 2.6.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.

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.

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

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.

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.

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