URL tương đối trong WordPress


115

Tôi luôn thấy bực bội trong WordPress khi hình ảnh, tệp, liên kết, v.v. được chèn vào WordPress bằng URL tuyệt đối thay vì URL tương đối. Url tương đối thuận tiện hơn nhiều cho việc chuyển đổi tên miền, thay đổi giữa http và https, v.v. Hôm nay tôi phát hiện ra rằng nếu bạn xác định WP_CONTENT_URL bằng một url tương đối thì khi bạn chèn tệp vào bài đăng, họ sử dụng url tương đối cho src thay vì url tuyệt đối . Chỉ là những gì tôi luôn muốn! Nhưng tài liệu chính thức của WordPress nói rằng bạn nên sử dụng một URI đầy đủ nếu bạn đang định nghĩa WP_CONTENT_URL.

WordPress codex nói :

Đặt WP_CONTENT_URL thành URI đầy đủ của thư mục này (không có dấu gạch chéo), ví dụ:

define( 'WP_CONTENT_URL', 'http://example/blog/wp-content');

Mọi thứ dường như hoạt động tốt khi tôi sử dụng một URL tương đối, ví dụ:

define( 'WP_CONTENT_URL', '/my-content-folder');

Nhưng có một số vấn đề với việc sử dụng một URI tương đối? Tôi chỉ nghĩ rằng phải có lý do để WordPress nói rằng nó nên được định nghĩa với một URI đầy đủ.


3
Tôi đoán câu trả lời là kiểm tra tất cả các cách sử dụng nó trong mã WP và trong mã plugin bạn đang sử dụng để đảm bảo rằng không ai trong số họ cho rằng đó là URL đầy đủ khi nó không phải là URL, nhưng tôi không thể nghĩ ra lý do nào nó sẽ không ổn ngoài đỉnh đầu của tôi.
Rup

2
hãy thử plugin này wordpress.org/plugins/relative-url hoặc đọc phần này có thể giúp bạn deluxeblogtips.com/2012/06/relative-urls.html
krishna

5
@Krishna: Tại sao chúng ta cần một plugin nếu chúng ta chỉ có thể nhập URL tương đối vào wp-config? Mục đích của câu hỏi là tìm hiểu xem việc sử dụng URL tương đối trong wp-config có thể gây ra sự cố hay không.
AidanCurran

36
Tôi khóc khi phải chạm vào wordpress.
Tony Cronin

6
@TonyCronin Hãy vui vì nó không phải là Drupal.
motorbaby

Câu trả lời:


74

Tôi nghĩ đây là loại câu hỏi chỉ một nhà phát triển cốt lõi mới có thể / nên trả lời. Tôi đã nghiên cứu và phát hiện ra yếu tố cốt lõi # 17048: URL được gửi đến trình duyệt phải là địa chỉ gốc . Nơi chúng ta có thể tìm thấy lý do được giải thích bởi Andrew Nacin, nhà phát triển cốt lõi hàng đầu. Anh ta cũng liên kết đến chuỗi [wp-hacker] này . Trên cả hai liên kết đó, đây là những trích dẫn chính về lý do tại sao WP không sử dụng URL tương đối:

Vé chính:

  • URL tương đối gốc không thực sự thích hợp. /path/có thể không phải là WordPress, nó có thể nằm ngoài cài đặt. Vì vậy, thực sự nó không khác nhiều so với một URL tuyệt đối.

  • Bất kỳ URL tương đối nào cũng khiến việc thực hiện chuyển đổi trở nên khó khăn hơn đáng kể khi cài đặt được di chuyển. Tìm kiếm thay thế sẽ cần thiết trong hầu hết các tình huống và có một URL tuyệt đối thì trớ trêu thay lại dễ di chuyển hơn vì những lý do đó.

  • URL tuyệt đối là cần thiết ở nhiều nơi khác. Việc cần thêm những thứ này theo điều kiện sẽ thêm vào quá trình xử lý, cũng như tạo ra các lỗi tiềm ẩn (và sự không tương thích với các plugin).

chuỗi [wp-hacker]

  • Tôi không chắc về vấn đề gì, vì WordPress thường nằm trong một thư mục con, có nghĩa là chúng ta sẽ luôn cần xử lý nội dung để sau đó thêm vào phần còn lại của đường dẫn. Điều này giới thiệu chi phí.

  • Hãy nhớ rằng có hai loại URL tương đối, có và không có dấu gạch chéo ở đầu. Cả hai đều có những lưu ý khiến điều này không thể thực hiện đúng cách.

  • WordPress nên (và không) lưu trữ các URL tuyệt đối. Điều này không yêu cầu xử lý trước nội dung, không chi phí, không mơ hồ. Nếu bạn cần di dời, nó là một tìm kiếm thay thế toàn cầu trong cơ sở dữ liệu.


Và, trên một lưu ý cá nhân, hơn một lần tôi đã tìm thấy chủ đề và plugin được mã hóa không tốt, chỉ đơn giản là hỏng khi WP_CONTENT_URLđược xác định.
Họ không biết điều này có thể được thiết lập và cho rằng điều này là đúng: WP.URL / wp-content / WhatEver , và không phải lúc nào cũng vậy. Và một cái gì đó sẽ phá vỡ trên đường đi.


Plugin URL tương đối (được liên kết trong Câu trả lời của edse ), áp dụng chức năng wp_make_link_relativetrong một loạt bộ lọc trong móc hành độngtemplate_redirect . Đó là một mã khá đơn giản và có vẻ là một lựa chọn tốt.


14
Thông tin tốt. Tôi luôn sử dụng đường dẫn gốc tương đối để có thể triển khai tới dev.mysite.com -> qa.mysite.com -> www.mysite.com hoặc thậm chí www.anothersite.com mà không gặp vấn đề gì. Thật không may là WP đã không được thiết kế với suy nghĩ đó. Vì thiết lập WP_CONTENT_URLdường như không nhằm (mặc dù nó cho phép) thiết lập các url tương đối, nên plugin có vẻ như là lựa chọn tốt nhất. Có trường hợp thử nghiệm nào mà plugin bị hỏng khi thiết lập WP_CONTENT_URLnhưng hoạt động tốt khi sử dụng plugin không?
Justin

2
Các đường dẫn tương đối không bao giờ bắt đầu bằng / và các URI tương đối (để sử dụng bên trong <a>) không bao giờ bắt đầu bằng http://.
Tulains Córdova

13
Wordpress không bao giờ dành cho các trang web phù hợp, nó luôn là một cách hack nhanh chóng, được viết bởi những tin tặc (rõ ràng là từ phần trích dẫn ở đây) không hề suy nghĩ hoặc nhìn ra ngoài. Cách duy nhất bạn có thể di chuyển một trang web là nếu nó sử dụng ĐÚNG các URL tương đối và / hoặc URL tương đối gốc. URL tuyệt đối ngăn chặn tuyệt đối nó.
Haqa

8
Tôi đã tạo các trang web có thể được thiết lập để tồn tại trong tên miền phụ, thư mục gốc hoặc thư mục con. Nó không khó lắm. Tôi cảm thấy về cơ bản có những lý do nói rằng "Chúng tôi đã xây dựng cái này từ rất lâu rồi và sự thay đổi này sẽ bị phá vỡ nhiều nên chúng tôi sẽ không sửa nó."
Donny V.

3
vẫn nghĩ rằng không có lý do nào của nhà phát triển là hợp lệ. Url được mã hóa cứng có các vấn đề tương tự như url tương đối, đó chỉ là một thói quen thực sự tồi tệ khác mà các nhà phát triển ban đầu mắc phải trong bộ công cụ 'thói quen xấu' của họ ... có rất nhiều trong số chúng trong wordpress đó là lý do tại sao nó đã bị cắt nhiều lần để loại bỏ những vấn đề này.
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

Chuyển đổi đường dẫn URL đầy đủ thành đường dẫn tương đối.

Xóa các giao thức http hoặc https và miền. Giữ đường dẫn '/' ở đầu, vì vậy nó không phải là một liên kết tương đối thực sự, mà là từ cơ sở gốc của web.

Tham khảo: Wordpress Codex


và bạn thả đoạn mã php đó ở đâu?
Edward

6

Tôi đồng ý với Rup. Tôi đoán lý do chính là để tránh nhầm lẫn trên đường đi tương đối. Tôi nghĩ rằng wordpress có thể hoạt động từ đầu với các đường dẫn tương đối nhưng vấn đề có thể đến khi sử dụng nhiều plugin, cách cấu hình chủ đề, v.v.

Tôi đã từng sử dụng plugin này cho các đường dẫn tương đối, khi làm việc trên các máy chủ thử nghiệm:

URL tương đối gốc
Chuyển đổi tất cả URL thành URL tương đối gốc để lưu trữ cùng một trang web trên nhiều IP, di chuyển sản xuất dễ dàng hơn và kiểm tra thiết bị di động tốt hơn.


5
Tại sao một plugin lại cần thiết nếu tất cả những gì cần làm là định cấu hình một hằng số trong tệp wp-config? Trừ khi nó cung cấp một giải pháp để tránh một cạm bẫy cụ thể của việc làm WP_CONTENT_URLtương đối và không khuất phục trước bất kỳ cạm bẫy nào với cách tiếp cận của riêng nó. Điều tôi muốn biết là nếu thực sự có một cạm bẫy được biết đến với việc tạo ra WP_CONTENT_URLngười thân.
AidanCurran

1
Một URL bắt đầu bằng dấu gạch chéo lên /wp-content/some-file.jpglà một đường dẫn tuyệt đối không phải là một đường dẫn tương đối. Không thể có nhầm lẫn. Đó là việc bao gồm giao thức và tên miền trong URL tuyệt đối khiến WordPress trở nên vô ích mà không cần biện minh. Để triển khai một trang web WP từ nhà phát triển đến dàn dựng để tồn tại, tôi phải chạy một tập lệnh tìm và thay thế trên các tên miền trong kết xuất cơ sở dữ liệu. Vấn đề tôi nghĩ là nó được thiết kế để chỉnh sửa nội dung trong quá trình sản xuất , hoạt động cho các blog (đó là những gì nó được tạo ra) nhưng không phải cho nhiều trang web thương mại.
Ade

1
dude.com/bob/jane vs / bob / jane khó hiểu như thế nào? #serious #badpractice
Dawesi

1
@Ade, vui lòng làm bài tập về nhà của bạn trên những con đường tương đối. Bạn không chính xác về việc /wp-content/some-file.jpgtrở thành một con đường tuyệt đối. Đối với những người khác đọc nhận xét của bạn trong tương lai, xin lưu ý rằng đường dẫn tương đối trên web là đường dẫn có giao thức và miền bị loại trừ khỏi đường dẫn. Do đó, /wp-content/some-file.jpgwp-content/some-file.jpgcả hai đều tương đối, với việc dẫn đầu /trong ví dụ đầu tiên giữ mục đích tham chiếu đến thư mục gốc có thể truy cập của chủ tài khoản hoặc máy chủ.
Pegues

1
@Pegues OK, tôi đã tìm thấy nhiều nguồn (một số trên SO) sử dụng thuật ngữ "đường dẫn tuyệt đối" trái ngược với "url tuyệt đối". Nó cũng được gọi là đường dẫn "Root Relative". Mặc dù ngữ nghĩa và thuật ngữ tất nhiên là quan trọng, nhưng điểm vẫn còn tồn tại là chúng khác nhau về cơ bản với nhau. Trừ khi có một số lý do khác mà tôi không biết.
Ade

4

Tôi đã giải quyết nó trên trang web của mình, làm điều này trong functions.php

add_action("template_redirect", "start_buffer");
add_action("shutdown", "end_buffer", 999);

function filter_buffer($buffer) {
    $buffer = replace_insecure_links($buffer);
    return $buffer;
}
function start_buffer(){
    ob_start("filter_buffer");
}

function end_buffer(){
    if (ob_get_length()) ob_end_flush();
}

function replace_insecure_links($str) {

   $str = str_replace ( array("http://www.yoursite.com/", "https://www.yoursite.com/") , array("/", "/"), $str);

   return apply_filters("rsssl_fixer_output", $str);

}

Tôi đã tham gia một phần của một plugin, cắt nó thành nhiều phần và tạo ra cái này. Nó thay thế TẤT CẢ các liên kết trong trang web của tôi (menu, css, script, v.v.) và mọi thứ đều hoạt động.


0

Trong Cài đặt => Phương tiện, có một tùy chọn cho 'Đường dẫn URL đầy đủ cho tệp'. Nếu bạn đặt điều này thành đường dẫn thư mục phương tiện mặc định '/ wp-content / uploads' thay vì để trống, nó sẽ chèn các đường dẫn tương đối, ví dụ: '/wp-content/uploads/2020/06/document.pdf'.

Tôi không chắc liệu nó có tạo ra tất cả các liên kết tương đối, ví dụ như đến các bài đăng hay không, nhưng ít nhất nó xử lý phương tiện truyền thông, đây có lẽ là điều mà hầu hết mọi người đều lo lắng.


Tùy chọn 'Đường dẫn URL đầy đủ đến tệp' này không xuất hiện trong Cài đặt phương tiện theo mặc định. Có một số cài đặt trong wp-config kích hoạt nó không?
AidanCurran

@AidanCurran Tôi khá chắc chắn rằng nó đã có từ lâu, nhưng sau một số nghiên cứu, có vẻ như có một số wp-config cho phép điều này sau cùng, vì nó đã bị xóa theo mặc định khỏi WP 3.5+. Nó có thể được đưa trở lại bằng cách sử dụng một plugin cũ như: wordpress.org/plugins/upload-url-path-enabler Vì vậy, tôi đoán một trong những plugin của tôi đang bổ sung trở lại này, mặc dù tôi hầu như chưa cài đặt bất kỳ plugin nào. Chỉ cần sử dụng Elementor và theme Futurio với plugin Futurio Extra. Mặc dù vậy, tôi đã thử tắt chúng mà không có thay đổi gì nên không chắc: /
ôm vào

@AidanCurran Bạn có thể thêm một cái gì đó như: update_option ('upload_url_path', '/ wp-content / uploads'); trong tệp functions.php của bạn cho chủ đề hoặc thông qua một số plugin đoạn mã, và nó sẽ có tác dụng tương tự.
ôm

-3

nên sử dụng get_home_url (), khi đó liên kết của bạn là tuyệt đối, nhưng nó không ảnh hưởng nếu bạn thay đổi url của trang web


-4

Những gì tôi nghĩ bạn làm là trong khi bạn thay đổi tên miền, tệp kết xuất sql mà bạn có, bạn có thể thay thế tất cả các phiên bản của tên miền cũ bằng tên miền mới. Đây là tùy chọn duy nhất có sẵn vì không có plugin nào giúp bạn làm điều này.

Đây là cách nhanh nhất ..


1
Hãy nhớ rằng bạn cũng sẽ muốn thay thế tên miền trong các chuỗi PHP được tuần tự hóa. Công cụ tìm kiếm và thay thế tiện dụng này dường như là cách thức hoạt động tiêu chuẩn (kho lưu trữ GitHub tại đây ). Điều này được sử dụng bởi các giải pháp triển khai Capistrano mà tôi sử dụng như capistrano-wp và dường như hoạt động rất tốt. Nó cũng được tham chiếu trên trang Di chuyển WordPress Codex chính thức .
Matt Gibson

3
Cách tiếp cận này lộn xộn và dễ xảy ra lỗi. Nếu chúng ta có thể tránh nó bằng cách sử dụng các URL tương đối trong wp-config thì điều đó có tốt hơn nhiều không? Mục đích của câu hỏi là tìm hiểu xem việc sử dụng URL tương đối trong wp-config có thể gây ra sự cố hay không.
AidanCurran

-4

Có một cách dễ dàng

Thay vì /pagename/sử dụng index.php/pagename/hoặc nếu bạn không sử dụng liên kết cố định, hãy làm như sau:

Bài đăng

index.php?p=123

Trang

index.php?page_id=42

thể loại

index.php?cat=7

Thông tin thêm tại đây: http://codex.wordpress.org/Linking_Posts_Pages_and_Categories


Điều này không trả lời câu hỏi.
Mateng
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.