Làm thế nào để có được URL của trang hiện tại được hiển thị?


55

Tôi muốn thêm mã PHP tùy chỉnh để đảm bảo rằng bất cứ khi nào một trang trên trang web của tôi tải trong trình duyệt của tôi, URL của trang đó sẽ được hiển thị trên màn hình. Tôi có thể sử dụng echo get_permalink(), nhưng nó không hoạt động trên tất cả các trang. Một số trang (ví dụ trang chủ của tôi ) hiển thị một số bài đăng và nếu tôi sử dụng get_permalink()trên các trang này, URL của trang được hiển thị sẽ không được trả lại (tôi tin rằng nó trả về URL của bài đăng cuối cùng trong vòng lặp). Đối với các trang này, làm cách nào tôi có thể trả lại URL?

Tôi có thể gắn get_permalink()vào một cái móc cụ thể kích hoạt trước khi vòng lặp được thực thi không? Hoặc bằng cách nào đó tôi có thể thoát ra khỏi vòng lặp, hoặc đặt lại nó sau khi hoàn thành?

Cảm ơn.


Bạn có thể cung cấp một số ngữ cảnh như những gì bạn muốn làm với URL này không? Bạn đang cố gắng tạo URL có thể chia sẻ? Lắp ráp URL tùy chỉnh cho các liên kết / hành động?
Tom J Nowell

@TomJNowell Tôi muốn liệt kê một tập lệnh JS cụ thể, nhưng chỉ trên một số trang nhất định (trong trường hợp này, các trang đó là trang chủ của trang web của tôi bằng nhiều ngôn ngữ khác nhau: example.com , example.com/fr , example.com/es , Vân vân). Tệp JS sẽ máy chủ để thêm các siêu liên kết vào một số tiêu đề chỉ xuất hiện trên trang chủ.
cag8f

Tại sao không chỉ sử dụng is_home()hoặc is_page( 'fr' )vv và chỉ tranh thủ kịch bản nếu nó đúng?
Tom J Nowell

@TomJNowell Bây giờ mã của tôi là if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Cái này xuất hiện trên mọi trang chủ, bất kể ngôn ngữ. Có phải đó là những gì bạn đã đề nghị?
cag8f

Tại sao không sử dụng $_SERVER['REQUEST_URI']và công ty? Xem câu hỏi này: stackoverflow.com/q/6768793/247696
Flimm

Câu trả lời:


86

get_permalink() chỉ thực sự hữu ích cho các trang và bài đăng đơn lẻ và chỉ hoạt động trong vòng lặp.

Cách đơn giản nhất tôi từng thấy là:

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

$wp->requestbao gồm phần đường dẫn của URL, ví dụ: /path/to/pagehome_url()xuất URL trong Cài đặt> Chung, nhưng bạn có thể nối thêm đường dẫn đến URL, vì vậy chúng tôi sẽ nối thêm đường dẫn yêu cầu vào URL nhà trong mã này.

Lưu ý rằng điều này có thể sẽ không hoạt động với Permalinks được đặt thành Plain và sẽ loại bỏ các chuỗi truy vấn ( ?foo=barmột phần của URL).

Để lấy URL khi permalinks được đặt thành đơn giản, bạn có thể sử dụng $wp->query_varsthay vào đó, bằng cách chuyển nó tới add_query_arg():

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

Và bạn có thể kết hợp hai phương pháp này để có được URL hiện tại, bao gồm chuỗi truy vấn, bất kể cài đặt permalink:

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

7
Nếu permalinks được đặt thành đơn giản : echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin

1
@Jacob Tôi đã thử điều đó, nhưng dường như chỉ trả về URL của trang chủ của tôi. Như bạn có thể thấy ở trên cùng bên trái trên trang này ( dev.horizonhomes-samui.com/properIES/hs0540 ), nơi tôi đã chèn mã vào echo home_url( $wp->request ). Tôi đã đảm bảo bao gồm global $wplà tốt. Permalinks không phải là 'Plain', mà được đặt thành 'Post Name.' Tôi cũng không thấy bất kỳ lỗi PHP nào có liên quan trong nhật ký. Trang đặc biệt này là một phần của trang dev của tôi, nếu không thì sẽ bị chặn đối với khách truy cập. Tôi không chắc điều đó có quan trọng hay không. chỉnh sửa: Trên thực tế, giữ suy nghĩ đó - có thể là lỗi người dùng. Chờ ...
cag8f

@Jacob chỉnh sửa 2: OK mã của bạn thực sự hoạt động. Vấn đề của tôi là tôi đã bao gồm mã trong hàm.php 'trần trụi', tức là không có bất kỳ chức năng nào được gắn vào một cái móc. Vì vậy, mã của bạn đã trả về URL của trang chủ, bất kể trang được hiển thị trong trình duyệt của tôi. Khi tôi di chuyển mã bên trong một hàm - một hàm được gắn vào hook WP (wp_enqueue_scripts), nó thực sự trả về URL của trang được hiển thị. Bạn có biết lý do cho hành vi đó? Có lẽ tôi cần tạo một câu hỏi mới cho điều đó.
cag8f

3
@ cag8f Nếu mã nằm "trần trụi" trong hàm.php thì bạn đang chạy nó trước khi tất cả các thuộc tính của đối tượng $ wp đã được thiết lập. Khi bạn bọc nó trong một hàm được gắn vào một hook thích hợp thì bạn sẽ trì hoãn việc thực thi của nó cho đến khi một điểm thích hợp trong mã Wordpress chạy.
Andy Macaulay-Brook

Những phương pháp này đều tuyệt vời và những ý tưởng tuyệt vời để làm việc với WordPress. Bạn có thể thêm trailingslashit()vào chúng, tùy thuộc vào nhu cầu của bạn.
Jake

8

Bạn có thể sử dụng mã dưới đây để nhận toàn bộ URL hiện tại trong WordPress:

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

Điều này sẽ hiển thị đường dẫn đầy đủ, bao gồm các tham số truy vấn.


Xin chào - nếu bạn có một cái nhìn về developer.wordpress.org/reference/fifts/add_query_arg bạn sẽ thấy rằng mã của bạn không thực sự bảo tồn các tham số truy vấn hiện có.
Andy Macaulay-Brook

2
Để duy trì các tham số truy vấn bạn cần thay thế trống array()bằng $_GET. tức là:home_url(add_query_arg($_GET,$wp->request));
Brad Adams

Nó sẽ không hoạt động nếu WordPress được cài đặt trong thư mục con
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();

Bạn có thể giải thích làm thế nào và tại sao mã này giải quyết câu hỏi?
kero

Theo tôi giải pháp linh hoạt nhất. Nó hoạt động trên bất kỳ trang WP nào (ngay cả trên wp-admin, wp-login.php, trang lưu trữ, v.v.). Chỉ cần lưu ý rằng nó không bao gồm bất kỳ thông số URL nào
Philipp

1

Đoạn mã sau sẽ cung cấp URL hiện tại:

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

Bạn có thể sử dụng mã dưới đây để nhận URL đầy đủ cùng với các tham số truy vấn.

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

Điều này sẽ hiển thị đường dẫn đầy đủ, bao gồm các tham số truy vấn. Điều này sẽ duy trì các tham số truy vấn nếu đã có trong URL.


Đoạn mã này bỏ qua wp-admin/plugins.phptrong URL hiện tại của tôi, đó chỉ là đường dẫn gốc và chuỗi truy vấn.
Ryszard Jędras Hot

0

Đây là một cách cải tiến của ví dụ đã đề cập trước đó. Nó hoạt động khi các URL đẹp được bật tuy nhiên nó sẽ loại bỏ nếu có bất kỳ tham số truy vấn nào như / page-slug /? Param = 1 hoặc URL là xấu cả.

Ví dụ sau sẽ làm việc trên cả hai trường hợp.

    $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

Có lẽ wp_guess_url()là những gì bạn cần. Có sẵn kể từ phiên bản 2.6.0.


Điều này chỉ cần đoán URL cơ sở. Trên frontend, bạn kết thúc với một hiệu ứng tương tự home_url().
Jake

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.