Gunakan file template untuk url tertentu tanpa membuat halaman

14

Saya ingin tahu apakah mungkin menggunakan file templat untuk url tertentu tanpa harus membuat halaman untuk templat itu.

Ini masalah saya yang disederhanakan:

Saya telah membuat halaman di WP dengan beberapa konten tautan yang mengarah ke url tertentu dengan beberapa data formulir tambahan: (mysite.com/retail/?a=test&b=1234) .

Saya ingin url itu (ritel) untuk secara otomatis menggunakan file template saya template-retail.php yang saya miliki di direktori tema anak, tanpa harus membuat halaman bernama "retail" & pilih halaman template dari sana. Hanya ada konten eksternal dalam file template-retail.php, tidak ada yang dari Wordpress itu sendiri.

Apakah ini mungkin?

Keat
sumber
1
Anda harus membuat pengalihan HTAccess ke file, lalu memproses permintaan di sana.
Howdy_McGee
Saya tidak memiliki akses ke file .htaccess dalam kasus ini. Apakah ada cara lain?
Keat
ada beberapa plugin yang dapat memberi Anda akses untuk melakukan hal-hal semacam ini, dengan cara apa pun Anda harus mengunggah file khusus ke server sehingga ada sesuatu yang harus dipukul.
Howdy_McGee
4
Tidak yakin tentang semua rincian proyek Anda, tetapi hal pertama yang datang ke pikiran adalah template_redirectatau endpoint
s_ha_dum

Jawaban:

15

Anda bisa melihat url, memuat file dan keluar.

Itu bisa dilakukan ketika WordPress memuat lingkungannya, mis '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
     }
  }
});

Perhatikan bahwa melakukannya dengan halaman nyata dengan slug "retail" tidak pernah dapat digunakan.

Ini cukup mudah, tetapi juga hardcode, jadi jika Anda memerlukan ini untuk satu halaman tidak apa-apa. Jika Anda perlu mengontrol lebih banyak url, lihat solusi yang diusulkan dalam jawaban ini .

gmazzap
sumber
Terima kasih atas jawaban anda. Saya tidak bisa mendapatkan kode di atas berfungsi. Ini tidak pernah benar: "if ($ url_path === 'retail') {" $ url_path adalah string dengan nilai: " example.com/retail "
Keat
Coba var_dump($url_path);dan lihat bagaimana tampilannya dan sesuaikan kodenya. Nilai itu tergantung pada url asli Anda . Misalnya untuk url rumah khusus, atau WP yang diinstal dalam subfolder mungkin berbeda. @Keat
gmazzap
1
Terima kasih atas jawabannya, dan maaf atas jawaban yang terlambat. Saya menggunakan solusi ini dan bekerja dengan sempurna. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat
5

The inittindakan tidak sesuai untuk apa yang Anda coba capai. Anda harus menggunakan template_includefilter sebagai gantinya. Anda akan menggabungkan ini dengan get_query_varuntuk mengambil params URL untuk memeriksa template apa yang perlu dimuat. Inilah tautannya:

Kode:

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;
}
adamj
sumber
1

Cara WordPress untuk melakukan ini adalah dengan page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Anda hanya perlu kode untuk templat WordPress. Dalam tema WordPress Anda, Anda dapat membuat templat halaman dan mengganti nama menjadi

page-id.php

Halaman tertentu itu akan secara otomatis mengambilnya dan menggunakan templat.

Misalnya, jika halaman Anda memiliki id 5874, Anda akan menamai template itu sebagai page-5784.php

Anda juga bisa memberi nama templat berdasarkan pada halaman slug. Misalnya jika halaman siput hello-worldmaka nama templat akanpage-hello-world.php

Lihat juga: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

Shivan dan Sharma
sumber
0

@ shivanand-sharma ini adalah metode yang sempurna dan lebih bersih ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ) untuk membuat halaman seperti di wordpress lainnya, dan jika Anda ingin untuk menyembunyikan halaman Anda, saya hanya menggunakan plugin sederhana dan efektif ' https://wordpress.org/plugins/exclude-pages/ '

Saya harus mengatakan bahwa saya membutuhkan URL untuk membuat POST atau GET ke halaman saya sendiri dan menyimpan beberapa data sesi 'WC () -> session', dan ini menyelesaikan ini dan masalah lain, karena Anda dapat memiliki tulang punggung kustom kode php termasuk semua 'memerlukan (' wp-load ') dll' dari seluruh wordpress, woocommerce dll untuk bekerja melalui, mysite.com/index.php/MYPAGE .....

Anda hanya perlu:

Pertama: Buat file di dalam lokasi tema Anda sebagai templat dari halaman baru seperti 'wp-content / themes / mytheme / customtemplate.php' (Komentar itu penting agar 'Nama Templat' dapat diamati oleh Wordpress):

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

Kedua: Buat halaman di wordpress secara normal melalui 'wp-admin'> Halaman (Katakanlah nama seperti MYPAGE , atau Anda dapat mengubah siput apa pun yang Anda inginkan) dan tentu saja menautkan template sebelumnya sebagai templat dari halaman ini yang merupakan nama 'ApapunName' pada bagian templattestes.

Jadi, mari kita buka halaman baru 'mysite.com/index.php/MYPAGE' dan Anda akan melihat.

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

Ekstra: Mari kita buat fungsi javascript atau jquery di troli, checkout, apa pun yang dapat Anda bayangkan di dalam tag HTML 'script', dan sertakan kode seperti ini:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
Jose Velandia
sumber