Saya sedang mengembangkan beberapa plugin di mana saya ingin mengaktifkan halaman khusus. Dalam kasus saya, beberapa halaman khusus akan berisi formulir seperti formulir kontak (tidak secara harfiah). Ketika pengguna akan mengisi formulir ini dan mengirimkannya, harus ada langkah berikutnya yang akan membutuhkan lebih banyak informasi. Katakanlah bahwa halaman pertama dengan formulir akan terletak di www.domain.tld/custom-page/
dan setelah pengiriman formulir berhasil, pengguna harus diarahkan ke www.domain.tld/custom-page/second
. Template dengan elemen HTML dan kode PHP juga harus dibuat khusus.
Saya pikir sebagian masalah mungkin terjadi dengan penulisan ulang URL khusus, tetapi bagian lain saat ini tidak saya kenal. Saya benar-benar tidak tahu di mana saya harus mulai mencari dan apa nama yang tepat untuk masalah itu. Bantuan apa pun akan sangat dihargai.
sumber
Jawaban:
Ketika Anda mengunjungi halaman frontend, WordPress akan menanyakan database dan jika halaman Anda tidak ada di database, permintaan itu tidak diperlukan dan hanya membuang-buang sumber daya.
Untungnya, WordPress menawarkan cara untuk menangani permintaan frontend dengan cara kustom. Itu dilakukan berkat
'do_parse_request'
filter.Kembali
false
pada kait itu, Anda akan dapat menghentikan WordPress dari memproses permintaan dan melakukannya dengan cara Anda sendiri.Yang mengatakan, saya ingin berbagi cara untuk membangun plugin OOP sederhana yang dapat menangani halaman virtual dengan cara yang mudah digunakan (dan digunakan kembali).
Apa yang kita butuhkan
Antarmuka
Sebelum membangun kelas, mari kita menulis antarmuka untuk 3 objek yang tercantum di atas.
Pertama antarmuka halaman (file
PageInterface.php
):Sebagian besar metode hanya getter dan setter, tidak perlu penjelasan. Metode terakhir harus digunakan untuk mendapatkan
WP_Post
objek dari halaman virtual.Antarmuka pengontrol (file
ControllerInterface.php
):dan antarmuka pemuat template (file
TemplateLoaderInterface.php
):Komentar phpDoc harus cukup jelas untuk antarmuka ini.
Rencana
Sekarang kita memiliki antarmuka, dan sebelum menulis kelas konkret, mari kita tinjau alur kerja kami:
Controller
kelas (implementasiControllerInterface
) dan menyuntikkan (mungkin dalam konstruktor) sebuah instance dariTemplateLoader
kelas (menerapkanTemplateLoaderInterface
)init
hook kami memanggilControllerInterface::init()
metode untuk mengatur controller dan mengaktifkan hook yang akan digunakan kode konsumen untuk menambahkan halaman virtual.ControllerInterface::dispatch()
, dan di sana kami akan memeriksa semua halaman virtual yang ditambahkan dan jika salah satu dari mereka memiliki URL yang sama dengan permintaan saat ini, tampilkan; setelah menetapkan semua variabel global inti ($wp_query
,$post
). Kami juga akan menggunakanTemplateLoader
kelas untuk memuat template yang tepat.Selama ini alur kerja kita akan memicu beberapa kait inti, seperti
wp
,template_redirect
,template_include
... untuk membuat plugin lebih fleksibel dan memastikan kompatibilitas dengan inti dan plugin lainnya, atau setidaknya dengan baik jumlah mereka.Selain dari alur kerja sebelumnya, kita juga perlu:
the_permalink
untuk membuatnya mengembalikan URL halaman virtual yang tepat ketika dibutuhkan.Kelas Beton
Sekarang kita bisa mengkodekan kelas konkret kita. Mari kita mulai dengan kelas halaman (file
Page.php
):Tidak lebih dari mengimplementasikan antarmuka.
Sekarang kelas controller (file
Controller.php
):Pada dasarnya kelas membuat
SplObjectStorage
objek tempat semua objek halaman yang ditambahkan disimpan.Aktif
'do_parse_request'
, kelas pengontrol loop penyimpanan ini untuk menemukan kecocokan untuk URL saat ini di salah satu halaman yang ditambahkan.Jika ditemukan, kelas melakukan persis apa yang kita rencanakan: memicu beberapa kait, mengatur variabel dan memuat templat melalui perluasan kelas
TemplateLoaderInterface
. Setelah itu baru sajaexit()
.Jadi mari kita tulis kelas terakhir:
Template yang disimpan di halaman virtual digabungkan dalam sebuah array dengan default
page.php
danindex.php
, sebelum memuat template'template_redirect'
dipecat, untuk menambah fleksibilitas dan meningkatkan kompatibilitas.Setelah itu, templat yang ditemukan melewati filter kustom
'virtual_page_template'
dan inti'template_include'
: lagi untuk fleksibilitas dan kompatibilitas.Akhirnya file template baru saja dimuat.
File plugin utama
Pada titik ini kita perlu menulis file dengan header plugin dan menggunakannya untuk menambahkan kait yang akan membuat alur kerja kita terjadi:
Dalam file asli kita mungkin akan menambahkan lebih banyak header, seperti plugin dan tautan penulis, deskripsi, lisensi, dll.
Pengaya Plugin
Ok, kita selesai dengan plugin kita. Semua kode dapat ditemukan di Intisari di sini .
Menambahkan Halaman
Plugin sudah siap dan berfungsi, tetapi kami belum menambahkan halaman apa pun.
Itu bisa dilakukan di dalam plugin itu sendiri, di dalam tema
functions.php
, di plugin lain, dll.Tambahkan halaman hanya masalah:
Dan seterusnya. Anda dapat menambahkan semua halaman yang Anda butuhkan, hanya ingat untuk menggunakan URL relatif untuk halaman tersebut.
Di dalam file template Anda dapat menggunakan semua tag template WordPress, dan Anda dapat menulis semua PHP dan HTML yang Anda butuhkan.
Objek posting global diisi dengan data yang berasal dari halaman virtual kami. Halaman virtual itu sendiri dapat diakses melalui
$wp_query->virtual_page
variabel.Untuk mendapatkan URL untuk halaman virtual semudah melewati ke
home_url()
jalur yang sama yang digunakan untuk membuat halaman:Perhatikan bahwa dalam loop utama pada template yang dimuat,
the_permalink()
akan mengembalikan permalink yang benar ke halaman virtual.Catatan tentang gaya / skrip untuk halaman virtual
Mungkin ketika halaman virtual ditambahkan, itu juga diinginkan untuk memiliki gaya khusus / skrip enqueued dan kemudian hanya digunakan
wp_head()
dalam templat kustom.Itu sangat mudah, karena halaman virtual mudah dikenali melihat
$wp_query->virtual_page
variabel dan halaman virtual dapat dibedakan satu dengan yang lain melihat URL mereka.Contoh saja:
Catatan untuk OP
Melewati data dari satu halaman ke halaman lain tidak terkait dengan halaman virtual ini, tetapi hanya tugas umum.
Namun, jika Anda memiliki formulir di halaman pertama, dan ingin meneruskan data dari sana ke halaman kedua, cukup gunakan URL halaman kedua di
action
properti form .Misalnya dalam file templat halaman pertama Anda dapat:
dan kemudian di file templat halaman kedua:
sumber
wordpress/virtual-page
dan url yang dipangkas halaman adalahvirtual-page
.Saya pernah menggunakan solusi yang dijelaskan di sini: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
Sebenarnya, ketika saya menggunakannya, saya memperluas solusi dengan cara saya bisa mendaftarkan lebih dari satu halaman dalam satu waktu (sisa kode adalah +/- mirip dengan solusi yang saya tautkan dari paragraf di atas).
Solusinya mengharuskan Anda untuk memiliki permalink bagus diizinkan ...
sumber
content
dalam array ketika Anda mendaftarkan halaman palsu sedang ditampilkan di badan halaman - itu dapat berisi HTML serta teks sederhana atau bahkan kode pendek.