Cara memasukkan file PHP dalam plugin dengan cara yang benar

59

Masalah saya adalah ketika pada file plugin utama saya memasukkan file PHP seperti ini:

include(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
include_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');
// or
require_once(WP_PLUGIN_URL . '/wordpress-group-buying/ipn/paypal-ipn.php');

dan pada file itu saya memiliki panggilan ke fungsi WordPress seperti:

add_action('hook', 'callback');

dan saya mendapatkan:

Kesalahan Fatal: Panggil ke add_action fungsi yang tidak terdefinisi ()

Sekarang sebelum Anda mengatakan "gunakan if(**function_exists**('add_action')){" jika saya menggunakannya maka itu tidak berfungsi.

Pertanyaan-pertanyaan:

  • Apa cara yang benar untuk melakukan itu?
  • Apa perbedaan antara include, include_once, requiredan kapan saya menggunakan penyihir?
Bainternet
sumber
Anda melakukan sesuatu yang salah jika Anda mendapatkan pesan itu. Pastikan Anda menyertakan file apa pun sebelum mulai menjalankan fungsi dari file-file ini
onetrickpony
bukan itu, panggilannya ada di dalam file yang saya sertakan!
Bainternet
lol, sekarang saya melihat WP_PLUGIN_URLdalam kode Anda di atas :)
onetrickpony
3
Sederhananya Anda hanya dapat memasukkan () file melalui filepath dan bukan URI.
Editor
1
Artikel Codex ini (mungkin ditulis setelah Anda mengajukan pertanyaan) cukup membantu: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Jawaban:

88

Datang terlambat ke pesta ini, tapi inilah cara "WordPress": gunakan plugin_dir_path( __FILE__ ), misalnya:

<?php
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');
?>

Perhatikan bahwa fungsi tidak mengembalikan garis miring untuk filepath.

Chip Bennett
sumber
3
Perhatikan bahwa dengan menggunakannya __FILE__akan menghasilkan relatif terhadap file saat ini Anda memanggilnya, jadi jika includepernyataan Anda dilakukan dari subdirektori di dalam struktur file plugin Anda, Anda akan mendapatkan subdirektori kembali juga.
squarecandy
Alternatifnya - jika Anda MEMBUTUHKAN jalur relatif, adalahrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

Saya melihat melalui beberapa plugin yang sebelumnya saya buat untuk melihat berbagai cara saya memasukkan file tambahan di dalam plugin dan saya perhatikan ada dua metode yang dapat Anda gunakan, mungkin ada lebih banyak.

Tentukan direktori plugin Anda

Di dalam plugin Anda memiliki definisi berikut untuk menentukan lokasi plugin saat ini.

Kode contoh:

define( 'PLUGIN_DIR', dirname(__FILE__).'/' );  

Cukup memasukkan atau membutuhkan

Anda cukup menggunakan; sertakan, include_once, butuhkan atau require_once di dalam folder plugin Anda dengan merujuk lokasi seperti pada contoh kode di bawah ini. Contoh di bawah ini akan didasarkan pada file di direktori plugin root Anda termasuk file lain dari dalam folder di dalam folder plugin Anda.

Kode contoh:

include "classes/plugin-core.php";
Dwayne Charrington
sumber
relatif termasuk dapat membawa semua jenis masalah tak terduga yang tidak menyenangkan.
Mark Kaplun
5

Saya akhirnya meninggalkan konstruksi WordPress untuk menyertakan dan menggunakan yang berikut:

require_once(dirname(__FILE__) . '/filename.php);

Saya tidak berpikir itu akan benar-benar menyelesaikan masalah Anda, yang tampaknya menjadi masalah ruang lingkup, tetapi ini adalah kode yang saya gunakan.

Adapun perbedaan antara include dan butuhkan:
include akan memberikan peringatan jika file tidak ditemukan
mengharuskan akan menimbulkan kesalahan fatal jika file tidak ditemukan

include_once dan require_once tidak akan menyertakan / memerlukan file / kode lagi jika sudah disertakan / diperlukan (perhatikan bahwa sejauh yang saya tahu, ini hanya untuk file tertentu dalam direktori tertentu).

mtekk
sumber
5

Pertama, terima kasih untuk semua yang menjawab,

Masalah saya adalah memanggil file yang disertakan dengan url penuh sehingga mereka tidak pergi melalui WordPress. dan itu terjadi karena ketika saya menyatakan pada pertanyaan saya memanggil mereka dari file plugin utama. jadi perbaikannya akhirnya menggunakan:

include_once('/ipn/paypal-ipn.php');

saya membaca tentang di dukungan WordPress . dan sekali lagi terima kasih telah menjawab!

Bainternet
sumber
Bisakah Anda mempertimbangkan kembali untuk menandai jawaban ini ( wordpress.stackexchange.com/a/32002/123092 ) sebagai yang diterima?
Saya Orang yang Paling Bodoh
4

Termasuk

Pernyataan include () mencakup dan mengevaluasi file yang ditentukan.

Termasuk Sekali

Pernyataan include_once () termasuk dan mengevaluasi file yang ditentukan selama eksekusi skrip. Ini adalah perilaku yang mirip dengan pernyataan include (), dengan satu-satunya perbedaan adalah bahwa jika kode dari file sudah dimasukkan, itu tidak akan dimasukkan lagi. Seperti namanya, itu akan dimasukkan hanya sekali.

Memerlukan

membutuhkan () dan menyertakan () identik dalam segala hal kecuali bagaimana mereka menangani kegagalan. Keduanya menghasilkan Peringatan, tetapi membutuhkan () hasil dalam Kesalahan Fatal. Dengan kata lain, jangan ragu untuk menggunakan require () jika Anda ingin file yang hilang untuk menghentikan pemrosesan halaman.

Membutuhkan Sekali

Pernyataan require_once () termasuk dan mengevaluasi file yang ditentukan selama eksekusi skrip. Ini adalah perilaku yang mirip dengan pernyataan need (), dengan satu-satunya perbedaan adalah bahwa jika kode dari suatu file telah dimasukkan, itu tidak akan dimasukkan lagi.

Info di atas adalah dari dokumentasi PHP, masalahnya adalah tidak ada yang benar, akan tergantung pada kebutuhan kode, saya memang memerlukan () pada hal-hal penting seperti fungsi, tetapi pada file tema seperti footer atau loop yang saya gunakan include_once atau include karena saya bisa menangani peringatan dan mengatakan kepada pengguna / pengunjung yang melakukan kesalahan bukan hanya fatal_error

Webord
sumber
Seperti @mtekk mengatakan saya akan merekomendasikan Anda untuk menggunakan struktur ini: require_once (dirname ( FILE ). '/Filename.php);
Webord
1

Hai @ בניית אתרים:

Ketika WordPress sedang memuatnya, ia mendefinisikan add_action()fungsi sebelum mencoba memuat plugin apa pun. Fakta Anda mendapatkan kesalahan memberitahu saya bahwa Anda melakukan sesuatu yang aneh atau ada yang salah dengan pemasangan WordPress Anda.

Siapa yang membuat "plugin" Anda dimuat? Apakah Anda menggunakan include*()atau require*()untuk memuatnya, mungkin di wp-config.phpfile Anda ?

MikeSchinkel
sumber
1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

atau

define( 'PLUGIN_ROOT_DIR', plugin_dir_path( __FILE__ ) );
include( PLUGIN_ROOT_DIR . 'ipn/paypal-ipn.php');

atau

$plugin_dir_path = plugin_dir_path( __FILE__ );
include( $plugin_dir_path . 'ipn/paypal-ipn.php');

Catatan: untuk enqueu file .css & .js admin_enqueue_scriptsdi dalam penggunaan pluginplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
Aamer Shahzad
sumber
0

Setiap kali Anda membuat file baru di dalam direktori kerja Anda, Anda harus memasukkannya setiap kali. Tetapi cobalah metode untuk memindai directroy Anda dan melampirkannya secara otomatis, tidak hanya file php, Yang membantu untuk memasukkan php, file js dan css dengan benar di kedua sisi (backend, ujung depan).

http://kvcodes.com/2014/05/wordpress-theme-development-include-files-automatically/

varadha
sumber
1
Harap tambahkan informasi yang relevan dari tautan yang disediakan untuk jawaban Anda. Gunakan tautan untuk tujuan kredit. Harap edit pertanyaan Anda
Pieter Goosen