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?

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.


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";

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).


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!


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


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 ?


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');

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/


1
Harap tambahkan informasi yang relevan dari tautan yang disediakan untuk jawaban Anda. Gunakan tautan untuk tujuan kredit. Harap edit pertanyaan Anda
Pieter Goosen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.