Nhận URL trang hiện tại (bao gồm phân trang)


13

Có chức năng WP để tự động lấy URL chính xác của trang hiện tại không? Có nghĩa là nếu tôi chỉ mở một bài đăng, hàm sẽ trả về giống như get_permalink(), nhưng nếu tôi ở trên một trang được phân trang của trang (khi phân trang thông qua các bình luận), thì hàm sẽ trả về giống như get_pagenum_link(get_query_var('paged'))sẽ làm.

Tôi đã tìm kiếm codex nhưng không tìm thấy những gì tôi đang tìm kiếm. (Nhưng thậm chí get_pagenum_link()không có tài liệu ở đó.)

Tôi đã biết về chức năng này rồi, nhưng tôi sẽ rất vui nếu có chức năng WP "gốc" thực hiện công việc.

Cảm ơn trước! Trân trọng, René

Câu trả lời:


27

Ngoài câu trả lời của Rajeev Vyas, bạn không cần chuyển bất kỳ tham số không trống nào vào add_query_arg(). Những điều sau đây luôn làm việc tốt với tôi:

// relative current URI:
$current_rel_uri = add_query_arg( NULL, NULL );

// absolute current URI (on single site):
$current_uri = home_url( add_query_arg( NULL, NULL ) );

Các chức năng rơi trở lại $_SERVER[ 'REQUEST_URI' ]và áp dụng urlencode_deep()cho nó. Xem https://github.com/WordPress/WordPress/blob/3.8/wp-includes/fiances.php#L673

Chỉnh sửa: Như $_SERVER[ 'REQUEST_URI' ]thể hiện đầu vào của người dùng chưa được lọc, người ta phải luôn thoát giá trị trả về add_query_arg()khi bối cảnh được thay đổi. Ví dụ: sử dụng esc_url_raw()cho việc sử dụng DB esc_attr()hoặc esc_url()cho HTML.

Cập nhật

Ví dụ được hiển thị sẽ tạo một URI tuyệt đối (chứa lược đồ và máy chủ lưu trữ) không hoạt động trên multisite với các thư mục con như home_url()sẽ trả về URI hoàn chỉnh bao gồm cả một đoạn đường dẫn. Một giải pháp tốt hơn cho mã nhận biết nhiều trang sẽ là:

// absolute URI in multisite aware environment
$parts = parse_url( home_url() );
$current_uri = "{$parts['scheme']}://{$parts['host']}" . add_query_arg( NULL, NULL );

Lõi WordPress không hỗ trợ cổng, người dùng hoặc mật khẩu trong URL trang web nhiều trang nên điều này là đủ.


Thật khó chịu khi OP đã không chọn câu trả lời này làm Giải pháp. Cảm ơn bạn.
cfx

3
global $wp;
$current_url = add_query_arg( $wp->query_string, '', home_url( $wp->request ) );

Không phải là một chức năng, nhưng chắc chắn sử dụng mã wordpress ..

http://kovshenin.com/2012/c Hiện-url-in-wordpress /


2
Nó hoạt động một phần, nhưng một số thứ không hoạt động như tôi muốn: Các tham số như yearđược thêm vào chuỗi truy vấn, mặc dù chúng chưa từng ở đó và các tham số khác, ví dụ như replytocomtham số, bị mất. Bạn có biết một giải pháp cho việc này?
René Schubert

0

1) $_SERVER['REQUEST_URI']- Nó trả lại URL để truy cập trang đang thực thi tập lệnh. Nếu bạn cần gõ http://www.example.com/product.php?id=5để truy cập trang thì $_SERVER['REQUEST_URI']trả về /product.php?id=5.

2) $_SERVER['DOCUMENT_ROOT']- Trả về thư mục gốc của máy chủ được chỉ định trong tệp cấu hình của máy chủ. Biến này thường trả về đường dẫn như /usr/yoursite/wwwtrong Linux và D:/xamps/xampp/htdocstrong windows.

3) $_SERVER['HTTP_HOST']- Trả về tên của máy chủ như được tìm thấy trong tiêu đề http. Biến này thường trả về đường dẫn như example.comkhi bạn tìm thấy http://example.comtrên thanh địa chỉ của trình duyệt và trả về www.example.comkhi bạn nhìn thấy http://www.example.comtrên thanh địa chỉ. Điều này khá hữu ích khi bạn duy trì phiên trong khi thực hiện thanh toán trực tuyến bằng PHP do phiên được lưu trữ chohttp://example.com không giống như đối với http://www.example.com.

4) $_SERVER['HTTP_USER_AGENT']- Trả về chi tiết (trình duyệt) của tác nhân người dùng truy cập trang web. Chúng ta có thể sử dụngstrpos($_SERVER["HTTP_USER_AGENT"],”MSIE”) để phát hiện Microsoft Internet explorer hoặc bạn có thể sử dụng strpos($_SERVER["HTTP_USER_AGENT"],”Firefox”)để phát hiện trình duyệt firefox trong PHP.

5) $_SERVER['PHP_SELF']- Trả về tên tệp của tập lệnh hiện đang thực thi. Hãy giả sử rằng bạn đang truy cập URL http://www.example.com/product.php?id=5sau đó$_SERVER['PHP_SELF'] trả về /product.phptrong tập lệnh của bạn.

6) $_SERVER['QUERY_STRING']- Trả về chuỗi truy vấn nếu chuỗi truy vấn được sử dụng để truy cập tập lệnh hiện đang thực thi. Chuỗi truy vấn là những chuỗi có sẵn sau khi ăn? đăng nhập. Nếu bạn sử dụng $_SERVER['QUERY_STRING']trong tập lệnh thực thi URL sauhttp://www.example.com/index.php?id=5&page=product sau thì nó sẽ trả về id=5&page=producttập lệnh của bạn.

7) $_SERVER['REMOTE_ADDR'] - Trả về địa chỉ IP của máy từ xa đang truy cập trang hiện tại. Nhưng bạn không thể dựa vào $_SERVER['REMOTE_ADDR']để lấy địa chỉ IP thực của máy khách. Xem bài viết này để biết làm thế nào để có được các địa chỉ IP thực trong PHP.

8) $_SERVER['SCRIPT_FILENAME']- Trả về đường dẫn tuyệt đối của tệp hiện đang thực thi. Nó trả về đường dẫn như var/example.com/www/product.phptrong Linux và đường dẫn như D:/xampp/xampp/htdocs/test/example.phptrong windows.


1
Hãy nhớ rằng không ai trong số đó có sẵn trong CLI của bạn và do đó vô dụng đối với các công việc định kỳ.
kaiser

0

wp_guess_url là những gì bạn đang tìm kiếm.

Đoán URL cho trang web.

Sẽ xóa các liên kết wp-admin để chỉ truy xuất các URL không có trong thư mục wp-admin.


Điều này trả về một URL hoàn toàn khác với trang hiện tại khi tôi đã thử sử dụng nó.
Kirby

0

add_query_args( null, null ) sẽ tạo một phần tử mảng với khóa trống ( $qs[""] = null) mặc dù nó sẽ không ảnh hưởng đến kết quả.


Theo add_query_arg () | Chức năng | Tài nguyên dành cho nhà phát triển WordPress , các tham số thứ 2, 3 là tùy chọn và chúng có thể được bỏ qua.

add_query_args( null, null )có thể ngắn hơn nữa .

$current_url = add_query_args( [] );

Ngoài ra còn có phiên bản ngắn nhất mặc dù không được khuyến nghị vì tham số 1 là tham số bắt buộc.

$current_url = add_query_args();

Ngoài ra, lưu ý rằng cả home_url( add_query_vars( [] ) )home_url( add_query_arg( null, null ) ) có thể không trả về URL thực tế khi WordPress được cài đặt trong thư mục con.

ví dụ https://example.com/wp/wp/foocó thể được trả lại khi WordPress được cài đặt https://example.com/wp/.


Cập nhật: 2017/01/23

Phiên bản của tôi dựa trên giải pháp của David để có URL tuyệt đối.

$parts = parse_url(home_url());
$uri   = $parts['scheme'] . '://' . $parts['host'];

if (array_key_exists('port', $parts)) {
    $uri .= ':' . $parts['port'];
}

$uri .= add_query_arg([]);

0

Đối với tôi <?php esc_url(the_permalink()); ?>hoạt động (trên một trang lưu trữ với phân trang).


Không thể nào. the_permalink()lặp lại permalink thoát, nó không trả lại bất cứ điều gì. Các esc_url()không nhận được bất cứ điều gì, và nếu nó sẽ, nó sẽ là một URL thoát.
fuxia

Bạn nói đúng, nó chỉ hoạt động vì bộ nhớ đệm permalink tôi nghĩ.
Henning Fischer

-1

Bây giờ tôi không phân trang nhưng bạn có thể sử dụng chức năng này để nhận url trong vòng lặp

<?php $ID = get_the_ID(); 
echo get_permalink( $ID ); ?>

Hoặc nếu không, nếu bạn không thích sử dụng php, bạn cũng có thể chọn phương thức jquery tại đây (điều này sẽ giúp bạn làm cho nó hoạt động bên ngoài vòng lặp)

$(document).ready(function () {
var vhref = $(location).attr('href');
var vTitle = $(this).attr('title');
$('#spnTitle').html('' + vTitle + '');
$('#spnURL').html('' + vhref + '');
});​

hoặc nếu bạn thích sử dụng chức năng php, bạn cần lấy id bên ngoài vòng lặp


1
Xin lỗi, nhưng đây không phải là những gì tôi đã yêu cầu ... + the_permalink()không cần id khi nó được gọi trong vòng lặp.
René Schubert

2
Câu trả lời này có rất ít để làm với câu hỏi ban đầu. Nó không trả lời chính xác và cũng không thực sự cung cấp bất kỳ thông tin có giá trị nào liên quan đến chủ đề này.
jounileander

-2

Bạn có thể sử dụng chức năng wordpress để lấy URL trang hiện tại

the_permalink()

Điều này sẽ trả về cho bạn liên kết URL trang hiện tại.


4
Hầu hết; the_permalink()sẽ in URL của bài viết hiện tại. Nhưng nó sẽ không hoạt động cho các yêu cầu khác và sẽ không bao gồm các biến như phân trang. Vì vậy, không thực sự câu trả lời @ René Schubert đang tìm kiếm.
TheDeadMote
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.