ใช้ไฟล์เทมเพลตสำหรับ URL เฉพาะโดยไม่ต้องสร้างหน้า


14

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะใช้ไฟล์เทมเพลตสำหรับ URL เฉพาะโดยไม่ต้องสร้างหน้าสำหรับเทมเพลตนั้น

นี่คือปัญหาที่เรียบง่ายของฉัน:

ผมได้สร้างเพจใน WP มีเนื้อหาเชื่อมโยงบางอย่างที่ชี้ไปที่ URL ที่เฉพาะเจาะจงกับบางข้อมูลในแบบฟอร์มต่อท้าย: (mysite.com/retail/?a=test&b=1234)

ฉันต้องการให้ url (ขายปลีก) ใช้แม่แบบไฟล์ template-retail.php อัตโนมัติที่ฉันมีในไดเรกทอรีธีมลูกโดยไม่ต้องสร้างหน้าชื่อ "ปลีก" & เลือกหน้าเทมเพลตจากที่นั่น มีเนื้อหาภายนอกเฉพาะในไฟล์ template-retail.php ไม่มีอะไรใน Wordpress นั้น

เป็นไปได้ไหม


1
คุณจะต้องสร้างการเปลี่ยนเส้นทาง HTAccess ไปยังไฟล์จากนั้นประมวลผลคำขอที่นั่น
Howdy_McGee

ฉันไม่สามารถเข้าถึงไฟล์. htaccess ในกรณีนี้ มีวิธีอื่น ๆ ?
Keat

มีปลั๊กอินที่ให้สิทธิ์การเข้าถึงในการทำสิ่งเหล่านี้ไม่ว่าจะด้วยวิธีใดคุณจะต้องอัปโหลดไฟล์ที่กำหนดเองไปยังเซิร์ฟเวอร์เพื่อให้มีสิ่งที่น่าสนใจ
Howdy_McGee

4
ไม่แน่ใจเกี่ยวกับรายละเอียดทั้งหมดของโครงการของคุณ แต่สิ่งแรกที่มาคิดเป็นtemplate_redirectหรือปลายทาง
s_ha_dum

คำตอบ:


16

คุณสามารถดู url โหลดไฟล์และออก

ที่สามารถทำได้เมื่อ WordPress 'init'โหลดสภาพแวดล้อมเช่นบน

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

โปรดทราบว่าการทำเช่นนั้นหน้าจริงที่มีกระสุน "ปลีก" จะไม่สามารถใช้งานได้

มันค่อนข้างง่าย แต่ก็ฮาร์ดโค้ดด้วยดังนั้นหากคุณต้องการสิ่งนี้ในหน้าเดียวมันก็ดี หากคุณต้องการควบคุม URL เพิ่มเติมให้ดูวิธีแก้ไขที่เสนอในคำตอบนี้


ขอบคุณสำหรับคำตอบ. ฉันไม่สามารถรับรหัสข้างต้นได้ สิ่งนี้ไม่เป็นความจริง: "if ($ url_path === 'retail') {" $ url_path เป็นสตริงที่มีค่า: " example.com/retail "
Keat

ลองvar_dump($url_path);และดูว่ามันดูเหมือนและปรับรหัส ค่านั้นขึ้นอยู่กับURL จริงของคุณ เช่น URL บ้านที่กำหนดเองหรือ WP ติดตั้งในโฟลเดอร์ย่อยอาจแตกต่างกัน @Keat
gmazzap

1
ขอบคุณสำหรับการตอบกลับและขออภัยสำหรับคำตอบที่ล่าช้า ฉันใช้โซลูชันนี้และทำงานได้สมบูรณ์ $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat

5

การinitกระทำนั้นไม่เหมาะสมกับสิ่งที่คุณพยายามจะทำ คุณควรใช้template_includeตัวกรองแทน คุณจะรวมสิ่งนี้เข้ากับget_query_varเพื่อเรียกค้นพารามิเตอร์ URL เพื่อตรวจสอบว่าต้องโหลดเทมเพลตใด นี่คือลิงค์:

รหัส:

add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
}

2

page-templatesเวิร์ดเพรส-วิธีการทำเช่นนี้จะมี https://developer.wordpress.org/themes/template-files-section/page-template-files/

คุณต้องการรหัสสำหรับเทมเพลต WordPress เท่านั้น ในธีม WordPress ของคุณคุณสามารถสร้างเทมเพลตหน้าและเปลี่ยนชื่อเป็น

page-id.php

หน้านั้นจะรับโดยอัตโนมัติและใช้แม่แบบ

ตัวอย่างเช่นหากหน้าของคุณมี ID 5874 คุณจะตั้งชื่อเทมเพลตเป็น page-5784.php

คุณยังสามารถตั้งชื่อเทมเพลตตามทากหน้า ตัวอย่างเช่นถ้าบุ้งเพจhello-worldนั้นชื่อเทมเพลตจะเป็นpage-hello-world.php

ดูเพิ่มเติมที่: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png


0

@ shivanand-sharma นี้เป็นวิธีที่สมบูรณ์แบบและสะอาดขึ้น ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ) เพื่อสร้างหน้าเว็บใด ๆ ใน wordpress และหากคุณต้องการ เพื่อซ่อนหน้าของคุณฉันแค่ใช้ปลั๊กอินที่ง่ายและมีประสิทธิภาพ ' https://wordpress.org/plugins/exclude-pages/ '

ฉันต้องบอกว่าฉันต้องการ URL ในการทำPOSTหรือGETไปยังหน้าของฉันและบันทึกข้อมูลเซสชัน 'WC () -> เซสชัน' บางส่วนและสิ่งนี้จะช่วยแก้ปัญหานี้และปัญหาอื่น ๆ เพราะคุณสามารถมีกระดูกสันหลังที่กำหนดเองได้ โค้ด php รวมถึง 'require (' wp-load ') etc' ของ wordpress ทั้งหมด, woocommerce และอื่น ๆเพื่อทำงานผ่าน, mysite.com/index.php/MYPAGE .....

คุณเพียงแค่ต้อง:

ขั้นแรก:สร้างไฟล์ภายในตำแหน่งชุดรูปแบบของคุณเป็นเทมเพลตของหน้าใหม่บางอย่างเช่น 'wp-content / themes / mytheme / customtemplate.php' (ความคิดเห็นเป็นสิ่งสำคัญเพื่อให้สามารถมองเห็น 'ชื่อเทมเพลต' ได้โดย Wordpress):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

ที่สอง:สร้างหน้าเว็บที่ wordpress โดยปกติผ่าน 'wp-admin'> หน้า (สมมติว่าชื่ออย่างMYPAGEหรือคุณสามารถเปลี่ยนกระสุนที่คุณต้องการ) และนอกหลักสูตรเชื่อมโยงเทมเพลตก่อนหน้าเป็นเทมเพลตของหน้านี้ซึ่งเป็นชื่อ'AnythingName'ในส่วนเทมเพลต

ดังนั้นเรามาเปิดหน้าใหม่'mysite.com/index.php/MYPAGE'แล้วคุณจะเห็น

Hello World
object(WC_Session_Handler)#880 .....................

ความพิเศษ:มาสร้างฟังก์ชั่น javascript หรือ jquery ในรถเข็นชำระเงินไม่ว่าคุณจะนึกถึงอะไรในแท็ก HTML 'สคริปต์' และใส่รหัสดังนี้:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.