Jak wyświetlić adres URL bieżącej strony?

55

Chcę dodać niestandardowy kod PHP, aby upewnić się, że ilekroć strona w mojej witrynie ładuje się w mojej przeglądarce, adres URL tej strony jest wyświetlany na ekranie. Mogę używać echo get_permalink(), ale to nie działa na wszystkich stronach. Niektóre strony (np. Moja strona główna ) wyświetlają kilka postów, a jeśli korzystam get_permalink()z tych stron, adres URL wyświetlanej strony nie jest zwracany (uważam, że zwraca adres URL ostatniego postu w pętli). W przypadku tych stron, jak mogę zwrócić adres URL?

Czy mogę dołączyć get_permalink()do konkretnego haka, który strzela przed wykonaniem pętli? Czy mogę w jakiś sposób wyjść z pętli lub zresetować ją po zakończeniu?

Dzięki.

cag8f
źródło
Czy możesz podać kontekst, co chcesz zrobić z tym adresem URL? Czy próbujesz utworzyć współdzielone adresy URL? Składać niestandardowe adresy URL dla linków / działań?
Tom J Nowell
@TomJNowell Chciałbym umieścić w kolejce określony skrypt JS, ale tylko na niektórych stronach (w tym przypadku strony te są stroną główną mojej witryny w różnych językach: example.com , example.com/fr , example.com/es , itp). Plik JS będzie serwerem, aby dodać hiperłącza do kilku tytułów, które pojawiają się tylko na stronie głównej.
cag8f
dlaczego nie wystarczy użyć is_home()albo is_page( 'fr' )etc i tylko enqueue skrypt, czy to prawda?
Tom J Nowell
@TomJNowell Cóż, teraz mój kod brzmi: if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Wygląda na to, że uruchamia się na każdej stronie głównej, niezależnie od języka. Czy to właśnie sugerowałeś?
cag8f
Dlaczego nie skorzystać $_SERVER['REQUEST_URI']i towarzystwo? Zobacz to pytanie: stackoverflow.com/q/6768793/247696
Flimm

Odpowiedzi:

86

get_permalink() jest naprawdę przydatny tylko dla pojedynczych stron i postów i działa tylko w pętli.

Najprostszy sposób jaki widziałem to:

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

$wp->requestzawiera część ścieżki adresu URL, np. /path/to/pagei home_url()wyświetla adres URL w Ustawieniach> Ogólne, ale możesz do niego dołączyć ścieżkę, dlatego w tym kodzie dołączamy ścieżkę żądania do głównego adresu URL.

Zauważ, że to prawdopodobnie nie zadziała z Permalinkami ustawionymi na Zwykły i pozostawi ciągi zapytania ( ?foo=barczęść adresu URL).

Aby uzyskać adres URL, gdy permalinki są ustawione na zwykły, możesz użyć $wp->query_varszamiast tego, przekazując go do add_query_arg():

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

Możesz połączyć te dwie metody, aby uzyskać bieżący adres URL, w tym ciąg zapytania, niezależnie od ustawień łącza bezpośredniego:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
Jacob Peattie
źródło
7
Jeśli permalinks ustawiony na zwykły: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin
1
@Jacob Próbowałem tego, ale wydaje się, że zwraca tylko adres URL mojej strony głównej. Jak widać w lewym górnym rogu tej strony ( dev.horizonhomes-samui.com/properties/hs0540 ), do którego wstawiłem kod echo home_url( $wp->request ). Zapewniłem również włączenie global $wp. Permalinki nie są „Zwykłe”, ale ustawione na „Nazwa posta”. Nie widzę też żadnych istotnych błędów PHP w dzienniku. Ta konkretna strona jest częścią mojej witryny deweloperskiej, która w innym przypadku jest zablokowana dla odwiedzających. Nie jestem pewien, czy to ma znaczenie, czy nie. edycja: Właściwie trzymaj się tej myśli - może to być błąd użytkownika. Stand by ...
cag8f
@Jacob edit 2: OK, twój kod rzeczywiście działa. Mój problem polegał na tym, że dołączałem kod do funkcji.php „nagi”, tj. Nie do żadnej funkcji dołączonej do haka. Twój kod zwracał adres URL strony głównej, niezależnie od strony wyświetlanej w mojej przeglądarce. Po przeniesieniu kodu do funkcji - funkcji dołączonej do haka WP (wp_enqueue_scripts), rzeczywiście zwrócił adres URL wyświetlanej strony. Czy znasz przyczynę takiego zachowania? Może muszę stworzyć nowe pytanie.
cag8f
3
@ cag8f Jeśli kod znajduje się „naga” w functions.php, to uruchamiasz go przed skonfigurowaniem wszystkich właściwości obiektu $ wp. Kiedy zawijasz go w funkcję dołączoną do odpowiedniego zaczepu, opóźniasz jego wykonanie do momentu uruchomienia odpowiedniego punktu w kodzie Wordpress.
Andy Macaulay-Brook
Wszystkie te metody są niesamowite i świetne pomysły na pracę z WordPress. Możesz trailingslashit()je jednak dodać , w zależności od potrzeb.
Jake
8

Możesz użyć poniższego kodu, aby uzyskać cały bieżący adres URL w WordPress:

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

Spowoduje to wyświetlenie pełnej ścieżki, w tym parametrów zapytania.

Rescue1155
źródło
Cześć - jeśli spojrzysz na developer.wordpress.org/reference/functions/add_query_arg , zobaczysz, że twój kod nie zachowuje istniejących parametrów zapytania.
Andy Macaulay-Brook,
2
Aby zachować parametry zapytania trzeba by wymienić pusty array()z $_GET. tj .:home_url(add_query_arg($_GET,$wp->request));
Brad Adams
Nie będzie działać, jeśli WordPress jest zainstalowany w podkatalogu
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();
Shree Sthapit
źródło
Czy możesz wyjaśnić, w jaki sposób i dlaczego ten kod rozwiązuje pytanie?
kero
Moim zdaniem najbardziej elastyczne rozwiązanie. Działa na dowolnej stronie WP (nawet na wp-admin, wp-login.php, stronach archiwalnych itp.). Zauważ, że nie zawiera żadnych parametrów adresu URL
Philipp
1

Poniższy kod poda bieżący adres URL:

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

Możesz użyć poniższego kodu, aby uzyskać pełny adres URL wraz z parametrami zapytania.

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

Spowoduje to wyświetlenie pełnej ścieżki, w tym parametrów zapytania. Pozwoli to zachować parametry zapytania, jeśli są już w adresie URL.

Adiyya Tadikamalla
źródło
Fragment ten przeskakuje wp-admin/plugins.phpw moim bieżącym adresie URL, jest to tylko ścieżka katalogu głównego i ciągi zapytań.
Ryszard Jędraszyk
0

Jest to ulepszony sposób wspomnianego wcześniej przykładu. Działa, gdy włączone są ładne adresy URL, ale odrzuca je, jeśli istnieje jakikolwiek parametr zapytania, taki jak / page-slug /? Param = 1 lub adres URL jest w ogóle brzydki.

Poniższy przykład będzie działał w obu przypadkach.

    $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 ) )
tolginho
źródło
0

Może wp_guess_url()jest to, czego potrzebujesz. Dostępne od wersji 2.6.0.

Pływ
źródło
To tylko odgaduje podstawowy adres URL. Na froncie otrzymujesz efekt podobny do home_url().
Jake
0

Dlaczego nie po prostu użyć?

get_permalink(get_the_ID());
Dario Zadro
źródło