แสดง URL ของหน้าปัจจุบันอย่างไร


55

ฉันต้องการเพิ่มรหัส PHP ที่กำหนดเองเพื่อให้แน่ใจว่าเมื่อใดก็ตามที่หน้าเว็บในไซต์ของฉันโหลดในเบราว์เซอร์ URL ของหน้านั้นจะถูกสะท้อนไปยังหน้าจอ ฉันสามารถใช้งานecho get_permalink()ได้ แต่มันไม่สามารถใช้ได้กับทุกหน้า บางหน้า (เช่นหน้าแรกของฉัน ) แสดงหลายโพสต์และหากฉันใช้get_permalink()ในหน้าเหล่านี้ URL ของหน้าเว็บที่แสดงจะไม่ถูกส่งคืน (ฉันเชื่อว่ามันคืน URL ของโพสต์ล่าสุดในลูป) สำหรับหน้าเหล่านี้ฉันจะคืน URL ได้อย่างไร

ฉันสามารถแนบget_permalink()กับตะขอที่ติดไฟก่อนที่ลูปจะทำงานได้หรือไม่? หรือฉันจะแยกออกจากวงหรือตั้งค่าใหม่เมื่อมันเสร็จสมบูรณ์?

ขอบคุณ


คุณสามารถระบุบริบทเกี่ยวกับสิ่งที่คุณต้องการจะทำกับ URL นี้ได้หรือไม่? คุณพยายามสร้าง URL ที่แชร์ได้หรือไม่ รวบรวม URL ที่กำหนดเองสำหรับลิงก์ / การกระทำหรือไม่
Tom J Nowell

@TomJNowell ฉันต้องการลงทะเบียนสคริปต์ JS เฉพาะ แต่เฉพาะในบางหน้า (ในกรณีนี้หน้าเหล่านั้นเป็นหน้าแรกของเว็บไซต์ของฉันในภาษาต่างๆ: example.com , example.com/fr , example.com/es , ฯลฯ ) ไฟล์ JS จะทำหน้าที่เซิร์ฟเวอร์เพื่อเพิ่มไฮเปอร์ลิงก์ไปยังหนังสือหลายเล่มที่ปรากฏในหน้าแรกเท่านั้น
cag8f

ทำไมไม่ใช้เพียงแค่is_home()หรือis_page( 'fr' )อื่น ๆ และวางคิวสคริปต์เฉพาะเมื่อมันเป็นจริงเท่านั้น
Tom J Nowell

@TomJNowell ทีนี้รหัสของฉันคือif ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} นี่มันจะเริ่มทำงานในทุก ๆ หน้าไม่ว่าจะเป็นภาษาใด นั่นคือสิ่งที่คุณกำลังแนะนำ?
cag8f

ทำไมไม่ใช้$_SERVER['REQUEST_URI']และ บริษัท ? ดูคำถามนี้: stackoverflow.com/q/6768793/247696
Flimm

คำตอบ:


86

get_permalink() มีประโยชน์จริง ๆ สำหรับหน้าและโพสต์เดียวและใช้ได้เฉพาะในลูป

วิธีที่ง่ายที่สุดที่ฉันเคยเห็นคือ:

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

$wp->requestรวมถึงส่วนเส้นทางของ URL เช่น /path/to/pageและhome_url()เอาท์พุท URL ในการตั้งค่า> ทั่วไป แต่คุณสามารถต่อท้ายพา ธ นั้นได้ดังนั้นเราจะต่อท้ายพา ธ คำขอไปยัง URL หลักในรหัสนี้

โปรดทราบว่าสิ่งนี้อาจไม่ทำงานกับ Permalinks ที่ตั้งค่าไว้เป็นธรรมดาและจะไม่ใช้สตริงการสืบค้น ( ?foo=barส่วนหนึ่งของ URL)

ในการรับ URL เมื่อตั้งค่าลิงก์ถาวรเป็นธรรมดาคุณสามารถใช้$wp->query_varsแทนได้โดยส่งผ่านไปที่add_query_arg():

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

และคุณสามารถรวมสองวิธีนี้เพื่อรับ URL ปัจจุบันรวมถึงสตริงการสืบค้นโดยไม่คำนึงถึงการตั้งค่าลิงก์ถาวร:

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

7
ถ้าตั้งค่า Permalinks เป็นแบบธรรมดา: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.
Max Yudin

1
@Jacob ฉันลองแล้ว แต่ดูเหมือนว่าจะคืน URL ของหน้าแรกของฉันเท่านั้น อย่างที่คุณเห็นในมุมบนซ้ายในหน้านี้ ( dev.horizonhomes-samui.com/properties/hs0540 ) ซึ่งฉันใส่รหัสไปecho home_url( $wp->request )แล้ว ฉันมั่นใจที่จะรวมไว้global $wpเช่นกัน Permalinks ไม่ใช่ 'ธรรมดา' แต่ตั้งเป็น 'ชื่อโพสต์' ฉันไม่เห็นข้อผิดพลาด PHP ที่เกี่ยวข้องในบันทึกเช่นกัน หน้านี้โดยเฉพาะเป็นส่วนหนึ่งของไซต์ dev ของฉันซึ่งจะปิดกั้นไม่ให้ผู้เข้าชม ฉันไม่แน่ใจว่ามันสำคัญหรือไม่ แก้ไข: ที่จริงแล้วถือความคิดนั้น - อาจเป็นข้อผิดพลาดของผู้ใช้ สนับสนุน ...
cag8f

@Jacob แก้ไข 2: ตกลงรหัสของคุณใช้งานได้จริง ปัญหาของฉันคือฉันได้รวมรหัสใน functions.php 'เปลือยกาย' นั่นคือไม่ได้อยู่ในฟังก์ชั่นใด ๆ ที่แนบมากับตะขอ ดังนั้นรหัสของคุณคืน URL ของหน้าแรกไม่ว่าหน้านั้นจะแสดงในเบราว์เซอร์ของฉัน เมื่อฉันย้ายโค้ดภายในฟังก์ชั่น - ฟังก์ชั่นที่แนบมากับเบ็ด WP (wp_enqueue_scripts) มันก็กลับ URL ของหน้าเว็บที่แสดง คุณรู้สาเหตุของพฤติกรรมนั้นหรือไม่? บางทีฉันอาจต้องการสร้างคำถามใหม่สำหรับสิ่งนั้น
cag8f

3
@ cag8f หากโค้ดอยู่ในสถานะ "เปลือยกาย" ใน functions.php คุณจะเรียกใช้ก่อนที่คุณสมบัติทั้งหมดของออบเจ็กต์ $ wp จะได้รับการตั้งค่า เมื่อคุณตัดมันในฟังก์ชั่นที่แนบมากับเบ็ดที่เหมาะสมจากนั้นคุณจะล่าช้าในการดำเนินการจนกว่าจะถึงจุดที่เหมาะสมในการทำงานของรหัส Wordpress
Andy Macaulay-Brook

วิธีการเหล่านี้ล้วนยอดเยี่ยมและเป็นแนวคิดที่ยอดเยี่ยมสำหรับการทำงานกับ WordPress คุณอาจเพิ่มtrailingslashit()พวกเขาแม้ว่าขึ้นอยู่กับความต้องการของคุณ
เจค

8

คุณสามารถใช้รหัสด้านล่างเพื่อรับ URL ปัจจุบันทั้งหมดใน WordPress:

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

สิ่งนี้จะแสดงเส้นทางแบบเต็มรวมถึงพารามิเตอร์การสืบค้น


สวัสดี - ถ้าคุณดูที่developer.wordpress.org/reference/functions/add_query_argคุณจะเห็นว่ารหัสของคุณไม่ได้รักษาพารามิเตอร์การสืบค้นที่มีอยู่จริง ๆ
Andy Macaulay-Brook

2
เพื่อรักษาพารามิเตอร์การค้นหาที่คุณจะต้องเปลี่ยนที่ว่างเปล่ากับarray() $_GETie:home_url(add_query_arg($_GET,$wp->request));
Brad Adams

มันจะไม่ทำงานหากมีการติดตั้ง WordPress ในไดเรกทอรีย่อย
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();

คุณช่วยอธิบายได้อย่างไรว่าทำไมรหัสนี้จึงแก้ปัญหาได้?
kero

ในความคิดของฉันทางออกที่ยืดหยุ่นที่สุด มันทำงานบนหน้า WP ใด ๆ (แม้ใน wp-admin, wp-login.php, หน้าเก็บถาวร ฯลฯ ) เพิ่งสังเกตเห็นว่ามันไม่รวมพารามิเตอร์ URL ใด ๆ
Philipp

1

รหัสต่อไปนี้จะให้ URL ปัจจุบัน:

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

คุณสามารถใช้รหัสด้านล่างเพื่อรับ URL แบบเต็มพร้อมกับพารามิเตอร์การสืบค้น

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

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


ตัวอย่างนี้ข้ามwp-admin/plugins.phpใน URL ปัจจุบันของฉันเป็นเพียงเส้นทางรูตและสตริงการสืบค้น
Ryszard Jędraszyk

0

นี่เป็นตัวอย่างวิธีที่ได้รับการปรับปรุงดังกล่าวข้างต้น มันทำงานได้เมื่อเปิดใช้งาน URL สวย ๆ แต่ก็จะละเว้นหากมีพารามิเตอร์การค้นหาใด ๆ เช่น/ page-slug /? param = 1หรือ URL น่าเกลียดเลย

ตัวอย่างต่อไปนี้จะใช้กับทั้งสองกรณี

    $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

อาจwp_guess_url()เป็นสิ่งที่คุณต้องการ มีให้ตั้งแต่รุ่น 2.6.0


นี่เป็นเพียงการคาดเดา URL พื้นฐาน home_url()บนหน้าคุณจะจบลงด้วยผลคล้ายกับ
เจค

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