URL สัมพัทธ์ใน WordPress


115

ฉันพบว่ามันน่าหงุดหงิดใน WordPress เสมอที่มีการแทรกรูปภาพไฟล์ลิงก์และอื่น ๆ ลงใน WordPress ด้วย URL ที่สมบูรณ์แทน URL สัมพัทธ์ url สัมพัทธ์สะดวกกว่ามากสำหรับการเปลี่ยนชื่อโดเมนการเปลี่ยนระหว่าง http และ https เป็นต้นวันนี้ฉันค้นพบว่าถ้าคุณกำหนด WP_CONTENT_URL ด้วย url สัมพัทธ์เมื่อคุณแทรกไฟล์ลงในโพสต์พวกเขาจะใช้ url สัมพัทธ์สำหรับ src แทน url ที่สมบูรณ์ . สิ่งที่ฉันต้องการมาตลอด! แต่เอกสารอย่างเป็นทางการของ WordPress ระบุว่าคุณควรใช้URI แบบเต็มหากคุณกำลังกำหนด WP_CONTENT_URL

WordPress codex พูดว่า :

ตั้งค่า WP_CONTENT_URL เป็นURI แบบเต็มของไดเร็กทอรีนี้ (ไม่มีเครื่องหมายทับ) เช่น

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

ดูเหมือนว่าทุกอย่างจะทำงานได้ดีเมื่อฉันใช้ URL สัมพัทธ์เช่น

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

แต่มีปัญหากับการใช้ URI แบบสัมพัทธ์หรือไม่? ฉันแค่คิดว่าต้องมีเหตุผลที่ WordPress ระบุว่าควรกำหนดด้วย URI แบบเต็ม


3
ฉันเดาว่าคำตอบคือการตรวจสอบการใช้งานทั้งหมดในรหัส WP และในรหัสของปลั๊กอินที่คุณใช้เพื่อให้แน่ใจว่าไม่มีใครคิดว่าเป็น URL แบบเต็มเมื่อไม่ใช่ แต่ฉันไม่สามารถคิดเหตุผลใด ๆ มันจะไม่โอเคจากด้านบนของหัวของฉัน
Rup

2
ลองใช้ปลั๊กอินwordpress.org/plugins/relative-urlหรืออ่านสิ่งนี้อาจช่วยคุณได้deluxeblogtips.com/2012/06/relative-urls.html

5
@ กฤษณะ: ทำไมเราต้องมีปลั๊กอินถ้าเราสามารถป้อน URL สัมพัทธ์ใน wp-config ได้ ประเด็นของคำถามคือการดูว่าการใช้ URL สัมพัทธ์ใน wp-config อาจทำให้เกิดปัญหาได้หรือไม่
AidanCurran

37
ฉันร้องไห้เมื่อต้องสัมผัสเวิร์ดเพรส
Tony Cronin

6
@TonyCronin มีความสุขที่ไม่ใช่ Drupal
motorbaby

คำตอบ:


75

ฉันคิดว่านี่เป็นคำถามที่นักพัฒนาหลักเท่านั้นที่สามารถ / ควรตอบได้ ฉันได้วิจัยและพบว่าแกนตั๋ว # 17048 นี้: URL ที่ส่งมอบให้กับเบราว์เซอร์ที่ควรจะเป็นรากญาติ เราจะหาเหตุผลที่อธิบายโดย Andrew Nacin หัวหน้านักพัฒนาหลักได้ที่ไหน นอกจากนี้เขายังลิงก์ไปยังเธรด [wp-hackers]นี้ด้วย ในลิงก์ทั้งสองนี้เป็นคำพูดที่สำคัญว่าเหตุใด WP จึงไม่ใช้ URL สัมพัทธ์:

ตั๋วหลัก:

  • URL ที่เกี่ยวข้องกับรูทไม่เหมาะสมจริงๆ /path/อาจไม่ใช่ WordPress อาจอยู่นอกการติดตั้ง ดังนั้นจริงๆแล้วมันไม่ได้แตกต่างจาก URL ที่แน่นอนมากนัก

  • URL สัมพัทธ์ใด ๆ ยังทำให้การแปลงเป็นเรื่องยากขึ้นอย่างมากเมื่อย้ายการติดตั้ง การค้นหาแทนที่เป็นสิ่งที่จำเป็นในสถานการณ์ส่วนใหญ่และการมี URL ที่สมบูรณ์นั้นพกพาสะดวกกว่าด้วยเหตุผลเหล่านั้น

  • จำเป็นต้องมี URL ที่สมบูรณ์ในที่อื่น ๆ อีกมากมาย จำเป็นต้องเพิ่มสิ่งเหล่านี้ตามเงื่อนไขจะเพิ่มการประมวลผลรวมทั้งแนะนำข้อบกพร่องที่อาจเกิดขึ้น (และความเข้ากันไม่ได้กับปลั๊กอิน)

[wp-hackers] เธรด

  • เกี่ยวกับอะไรฉันไม่แน่ใจเนื่องจาก WordPress มักจะอยู่ในไดเรกทอรีย่อยซึ่งหมายความว่าเราจะต้องประมวลผลเนื้อหาเสมอเพื่อเพิ่มในส่วนที่เหลือของเส้นทาง สิ่งนี้แนะนำค่าใช้จ่าย

  • โปรดทราบว่า URL สัมพัทธ์มีสองประเภทโดยมีและไม่มีเครื่องหมายทับนำหน้า ทั้งสองมีข้อแม้ที่ทำให้ไม่สามารถนำไปใช้ได้อย่างถูกต้อง

  • WordPress ควร (และไม่) จัดเก็บ URL ที่สมบูรณ์ สิ่งนี้ไม่จำเป็นต้องมีการประมวลผลเนื้อหาล่วงหน้าไม่มีค่าใช้จ่ายไม่มีความคลุมเครือ หากคุณต้องการย้ายตำแหน่งจะเป็นการค้นหาทั่วโลกในฐานข้อมูล


และในบันทึกส่วนตัวฉันพบธีมและปลั๊กอินที่มีการเข้ารหัสไม่ดีมากกว่าหนึ่งครั้งซึ่งจะทำลายเมื่อWP_CONTENT_URLมีการกำหนด
พวกเขาไม่รู้ว่าสิ่งนี้สามารถตั้งค่าได้และสมมติว่าเป็นจริง: WP.URL / wp-content / WhatEverและไม่ใช่กรณีเสมอไป และบางสิ่งจะแตกไประหว่างทาง


ปลั๊กอินURL สัมพัทธ์ (เชื่อมโยงในedse 's คำตอบ ) ใช้ฟังก์ชั่นwp_make_link_relativeในชุดของตัวกรองในเบ็ดกระทำ template_redirectเป็นรหัสที่ค่อนข้างง่ายและดูเหมือนเป็นตัวเลือกที่ดี


14
ข้อมูลที่ดี ฉันใช้รูท - สัมพัทธ์พา ธ เสมอเพื่อให้ฉันสามารถปรับใช้กับ dev.mysite.com -> qa.mysite.com -> www.mysite.com หรือแม้แต่ www.anothersite.com ได้โดยไม่มีปัญหา โชคไม่ดีที่ WP ไม่ได้ออกแบบมาโดยคำนึงถึงสิ่งนั้น เนื่องจากการตั้งค่าWP_CONTENT_URLดูเหมือนจะไม่ได้มีไว้เพื่อ (แม้ว่าจะอนุญาต) การตั้งค่า url สัมพัทธ์ดูเหมือนว่าปลั๊กอินจะเป็นตัวเลือกที่ดีที่สุด มีกรณีทดสอบที่ปลั๊กอินแตกเมื่อตั้งค่าWP_CONTENT_URLแต่ทำงานได้ดีเมื่อใช้ปลั๊กอินหรือไม่
Justin

2
ทางญาติไม่เคยเริ่มต้นด้วย/ และยูริญาติ (สำหรับใช้ภายใน<a>) http://ไม่เคยเริ่มต้นด้วย
Tulains Córdova

14
Wordpress ไม่เคยมีไว้สำหรับเว็บไซต์ที่เหมาะสม แต่เป็นการแฮ็กอย่างรวดเร็วซึ่งเขียนโดยแฮกเกอร์ที่ (เห็นได้ชัดจากคำพูดที่นี่) ไม่ได้คิดหรือมองนอกกรอบ วิธีเดียวที่คุณสามารถย้ายเว็บไซต์คือถ้าเว็บไซต์นั้นใช้ URL ที่สัมพันธ์กันและ / หรือรูทสัมพัทธ์อย่างถูกต้อง URL ที่สมบูรณ์ป้องกันได้อย่างแน่นอน
Haqa

9
ฉันได้สร้างไซต์ที่สามารถตั้งค่าให้อยู่ในโดเมนย่อยรูทหรือโฟลเดอร์ย่อย มันไม่ยากมาก ฉันรู้สึกว่ามีเหตุผลโดยทั่วไปที่บอกว่า "เราสร้างสิ่งนี้มานานแล้วและการเปลี่ยนแปลงนี้จะพังทลายไปมากดังนั้นเราจึงไม่ได้แก้ไข"
Donny V.

4
ยังคงคิดว่าไม่มีเหตุผลใดที่นักพัฒนาซอฟต์แวร์ถูกต้อง URL ที่เข้ารหัสยากมีปัญหาเหมือนกับญาติมันเป็นเพียงการปฏิบัติที่ไม่ดีอีกอย่างหนึ่งที่นักพัฒนาดั้งเดิมมีในชุดเครื่องมือ 'นิสัยที่ไม่ดี' ของพวกเขา ... มีมากมายใน wordpress ซึ่งเป็นสาเหตุที่ถูกแยกหลายครั้งเพื่อลบ ปัญหาเหล่านี้
Dawesi

15
<?php wp_make_link_relative( $link ) ?>

แปลงเส้นทาง URL แบบเต็มเป็นเส้นทางสัมพัทธ์

ลบโปรโตคอล http หรือ https และโดเมน เก็บพา ธ '/' ไว้ที่จุดเริ่มต้นดังนั้นจึงไม่ใช่ลิงก์สัมพัทธ์ที่แท้จริง แต่มาจากฐานรากของเว็บ

ข้อมูลอ้างอิง: Wordpress Codex


แล้วคุณวางข้อมูลโค้ด php ไว้ที่ไหน
Edward

6

ฉันเห็นด้วยกับ Rup ฉันเดาว่าเหตุผลหลักคือเพื่อหลีกเลี่ยงความสับสนในเส้นทางสัมพัทธ์ ฉันคิดว่า wordpress สามารถทำงานได้ตั้งแต่เริ่มต้นด้วยเส้นทางสัมพัทธ์ แต่ปัญหาอาจเกิดขึ้นเมื่อใช้ปลั๊กอินหลายตัววิธีกำหนดค่าธีมเป็นต้น

ฉันเคยใช้ปลั๊กอินนี้สำหรับพา ธ สัมพัทธ์เมื่อทำงานกับเซิร์ฟเวอร์ทดสอบ:

Root Relative URLsแปลงURL
ทั้งหมดเป็น URL ที่สัมพันธ์กับรูทสำหรับการโฮสต์ไซต์เดียวกันบน IP หลายตัวการโยกย้ายการผลิตที่ง่ายขึ้นและการทดสอบอุปกรณ์เคลื่อนที่ที่ดีขึ้น


5
เหตุใดปลั๊กอินจึงมีความจำเป็นหากเพียงแค่กำหนดค่าคงที่หนึ่งค่าในไฟล์ wp-config เว้นแต่จะมีวิธีแก้ไขเพื่อหลีกเลี่ยงWP_CONTENT_URLข้อผิดพลาดเฉพาะในการสร้างความสัมพันธ์และไม่ยอมจำนนต่อข้อผิดพลาดใด ๆ ด้วยแนวทางของตัวเอง สิ่งที่ฉันอยากรู้คือมีหลุมพรางที่ทราบกันดีในการสร้างWP_CONTENT_URLญาติหรือไม่
AidanCurran

1
URL ที่ขึ้นต้นด้วยเครื่องหมายทับ/wp-content/some-file.jpgเป็นเส้นทางสัมบูรณ์ไม่ใช่เส้นทางสัมพัทธ์ ไม่มีความสับสนที่เป็นไปได้ เป็นการรวมโปรโตคอลและชื่อโดเมนไว้ในURL ที่สมบูรณ์ซึ่งทำให้ WordPress ไม่ช่วยเหลือโดยไม่มีเหตุผล ในการปรับใช้ไซต์ WP จาก dev ไปยัง staging เป็น live ฉันต้องรันสคริปต์ค้นหาและแทนที่บนชื่อโดเมนในดัมพ์ฐานข้อมูล ปัญหาที่ฉันคิดคือมันออกแบบมาเพื่อแก้ไขเนื้อหาในการผลิตซึ่งใช้ได้กับบล็อก (ซึ่งเป็นสิ่งที่สร้างขึ้นเพื่อ) แต่ไม่ใช่สำหรับเว็บไซต์เชิงพาณิชย์จำนวนมาก
อาเด

1
dude.com/bob/jane vs / bob / jane เป็นยังไงบ้างงง #serious #badpractice
Dawesi

1
@ แอ๊ดโปรดทำการบ้านเรื่องเส้นทางญาติ คุณไม่ถูกต้องเกี่ยวกับ/wp-content/some-file.jpgการเป็นเส้นทางที่สมบูรณ์แบบ สำหรับคนอื่น ๆ ที่อ่านความคิดเห็นของคุณในอนาคตโปรดทราบว่าเส้นทางแบบสัมพัทธ์ของเว็บคือเส้นทางที่แยกโปรโตคอลและโดเมนออกจากเส้นทาง ดังนั้น/wp-content/some-file.jpgและwp-content/some-file.jpgเป็นญาติกันโดยผู้นำ/ในตัวอย่างแรกมีวัตถุประสงค์ในการอ้างอิงไดเรกทอรีรากที่สามารถเข้าถึงได้ของเจ้าของบัญชีหรือเซิร์ฟเวอร์
Pegues

1
@Pegues ตกลงฉันพบแหล่งที่มามากมาย (บางแหล่งใน SO) โดยใช้คำว่า "พา ธ สัมบูรณ์" ซึ่งตรงข้ามกับ "URL ที่สมบูรณ์" เรียกอีกอย่างว่าเส้นทาง "Root Relative" ในขณะที่ความหมายและคำศัพท์มีความสำคัญ แต่ประเด็นก็ยังคงยืนอยู่ว่าพวกเขามีความแตกต่างกันโดยพื้นฐานเมื่อเทียบกับรากมีประโยชน์ที่สอดคล้องกันทั้งหมดของ url ที่แน่นอน เว้นแต่จะมีเหตุผลอื่นที่ฉันไม่ทราบ
อาเด

4

ฉันแก้ไขมันในไซต์ของฉันทำให้สิ่งนี้ใน 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);

}

ฉันใช้ส่วนหนึ่งของปลั๊กอินตัดเป็นชิ้น ๆ และทำสิ่งนี้ มันแทนที่ลิงก์ทั้งหมดในไซต์ของฉัน (เมนู css สคริปต์ ฯลฯ ) และทุกอย่างก็ใช้งานได้


0

ภายใต้การตั้งค่า => สื่อมีตัวเลือกสำหรับ "เส้นทาง URL แบบเต็มสำหรับไฟล์" หากคุณตั้งค่านี้เป็นพา ธ ไดเร็กทอรีสื่อเริ่มต้น '/ wp-content / uploads' แทนที่จะเป็นค่าว่างจะแทรกพา ธ สัมพัทธ์เช่น '/wp-content/uploads/2020/06/document.pdf'

ฉันไม่แน่ใจว่ามันทำให้ลิงก์ทั้งหมดสัมพันธ์กันหรือไม่เช่นไปยังโพสต์ แต่อย่างน้อยมันก็จัดการกับสื่อซึ่งอาจเป็นสิ่งที่คนส่วนใหญ่กังวล


ตัวเลือก "เส้นทาง URL แบบเต็มไปยังไฟล์" นี้จะไม่ปรากฏในการตั้งค่าสื่อตามค่าเริ่มต้น มีการตั้งค่าบางอย่างใน wp-config ที่เปิดใช้งานหรือไม่
AidanCurran

@AidanCurran ฉันค่อนข้างแน่ใจว่ามันมีมานานแล้ว แต่หลังจากการวิจัยดูเหมือนว่ามี wp-config บางอย่างที่เปิดใช้งานสิ่งนี้เพราะมันถูกลบโดยค่าเริ่มต้นจาก WP 3.5+ สามารถนำกลับมาได้โดยใช้ปลั๊กอินเก่าเช่นwordpress.org/plugins/upload-url-path-enabler ดังนั้นฉันเดาว่าหนึ่งในปลั๊กอินของฉันกำลังเพิ่มกลับเข้าไปแม้ว่าฉันแทบจะไม่ได้ติดตั้งเลยก็ตาม เพียงใช้ Elementor และธีม Futurio พร้อมปลั๊กอิน Futurio Extra ฉันพยายามปิดการใช้งานโดยไม่มีการเปลี่ยนแปลงใด ๆ ดังนั้นไม่แน่ใจ: /
กอด

@AidanCurran คุณสามารถเพิ่มสิ่งที่ต้องการ: update_option ('upload_url_path', '/ wp-content / uploads'); ในไฟล์ functions.php ของคุณสำหรับธีมหรือผ่านปลั๊กอินข้อมูลโค้ดบางอย่างและควรมีผลเช่นเดียวกัน
กอด


-4

สิ่งที่ฉันคิดว่าคุณทำคือในขณะที่คุณเปลี่ยนชื่อโดเมนไฟล์การถ่ายโอนข้อมูล sql ที่คุณมีคุณสามารถแทนที่อินสแตนซ์ทั้งหมดของชื่อโดเมนเก่าด้วยชื่อโดเมนใหม่ได้ นี่เป็นตัวเลือกเดียวที่มีให้เนื่องจากไม่มีปลั๊กอินที่จะช่วยคุณทำสิ่งนี้

วิธีนี้เร็วที่สุด ..


1
โปรดจำไว้ว่าคุณจะต้องแทนที่ชื่อโดเมนในสตริง PHP แบบอนุกรม เครื่องมือค้นหาและแทนที่ที่มีประโยชน์นี้ดูเหมือนจะเป็นวิธีมาตรฐานในการทำสิ่งต่างๆ (ที่เก็บ GitHub ที่นี่ ) สิ่งนี้ถูกใช้โดยโซลูชันการปรับใช้ Capistrano ที่ฉันใช้เช่นcapistrano-wpและดูเหมือนว่าจะทำงานได้ดีมาก นอกจากนี้ยังมีการอ้างอิงอย่างเป็นทางการในการย้ายหน้าเวิร์ดเพรส Codex
Matt Gibson

3
วิธีนี้ยุ่งเหยิงและเกิดข้อผิดพลาดได้ง่าย ถ้าเราสามารถหลีกเลี่ยงได้โดยใช้ URL สัมพัทธ์ใน wp-config จะไม่ดีกว่านี้มากเหรอ? ประเด็นของคำถามคือการดูว่าการใช้ URL สัมพัทธ์ใน wp-config อาจทำให้เกิดปัญหาได้หรือไม่
AidanCurran

-4

มีวิธีง่ายๆ

แทนที่จะ/pagename/ใช้index.php/pagename/หรือถ้าคุณไม่ใช้ลิงก์ถาวรให้ทำดังต่อไปนี้:

โพสต์

index.php?p=123

หน้า

index.php?page_id=42

ประเภท

index.php?cat=7

ข้อมูลเพิ่มเติมที่นี่: http://codex.wordpress.org/Linking_Posts_Pages_and_Categories


สิ่งนี้ไม่ตอบคำถาม
Mateng
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.