Jak poprawnie umieszczać pliki PHP we wtyczkach

59

Mój problem polega na tym, że w głównym pliku wtyczki dołączam plik PHP podobny do tego:

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

i w tym pliku mam wywołanie funkcji WordPress, takiej jak:

add_action('hook', 'callback');

i dostaję:

Błąd krytyczny: wywołanie niezdefiniowanej funkcji add activity ()

Zanim powiesz „użyj if(**function_exists**('add_action')){”, jeśli go użyję, to po prostu nie działa.

Pytania:

  • Jaki byłby właściwy sposób to zrobić?
  • Jakie są różnice między include, include_once, requirei kiedy mogę używać czarownicę?
Bainternet
źródło
robisz coś złego, jeśli dostaniesz tę wiadomość. Upewnij się, że
dołączasz
to nie to, połączenia są w plikach, które dołączam!
Bainternet,
lol, teraz widzę WP_PLUGIN_URLw twoim kodzie powyżej :)
onetrickpony 21.01.11
3
Mówiąc najprościej, możesz dołączać pliki () tylko przez ścieżkę do pliku, a nie przez identyfikator URI.
redaktor
1
Ten artykuł w Kodeksie (prawdopodobnie napisany po zadaniu
henrywright

Odpowiedzi:

88

Spóźniam się na tę imprezę, ale oto sposób „WordPress”: użyj plugin_dir_path( __FILE__ ), np .:

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

Zauważ, że funkcja nie zwróci ukośnik tyłu za filePath.

Chip Bennett
źródło
3
Zauważ, że użycie __FILE__go spowoduje wyjście w stosunku do bieżącego pliku, z którego go wywołujesz, więc jeśli twoja includeinstrukcja jest wykonana z podkatalogu wewnątrz struktury pliku wtyczki, również odzyskasz ten podkatalog.
squarecandy
Alternatywą - jeśli POTRZEBUJESZ ścieżek względnych, jestrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay
10

Przejrzałem kilka wcześniej utworzonych wtyczek, aby zobaczyć różne sposoby, w jakie zawarłem dodatkowe pliki wewnątrz wtyczek i zauważyłem, że są dwie metody, których możesz użyć, prawdopodobnie jest ich więcej.

Zdefiniuj katalog wtyczek

Wewnątrz wtyczki masz następującą definicję, aby zdefiniować bieżącą lokalizację wtyczki.

Przykładowy kod:

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

Po prostu włącz lub wymagaj

Możesz po prostu użyć; włącz, include_once, wymagaj lub wymagaj_once w folderze wtyczki, odwołując się do lokalizacji jak w poniższym przykładowym kodzie. Poniższy przykład będzie oparty na pliku w katalogu głównym wtyczki, w tym innym pliku z folderu w folderze wtyczki.

Przykładowy kod:

include "classes/plugin-core.php";
Dwayne Charrington
źródło
krewny obejmuje może przynieść różnego rodzaju paskudne nieoczekiwane problemy.
Mark Kaplun,
5

W końcu rezygnuję z konstruktów WordPress dla obejmuje i używam:

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

Nie sądzę, żeby to faktycznie rozwiązało problem, który wydaje się być problemem zakresu, ale to jest kod, którego używam.

Jeśli chodzi o różnicę między włączeniem a wymaganiem:
włączenie spowoduje wyświetlenie ostrzeżenia, jeśli plik nie zostanie znaleziony.
Wymaganie spowoduje wygenerowanie błędu krytycznego, jeśli plik nie zostanie znaleziony

include_once i requ_once nie będą ponownie zawierać / wymagać pliku / kodu, jeśli został już uwzględniony / wymagany (zauważ, że o ile wiem, dotyczy to tylko określonego pliku w określonym katalogu).

mtekk
źródło
5

Po pierwsze dziękuję wszystkim, którzy odpowiedzieli,

Moim problemem było wywołanie dołączonych plików z pełnym adresem URL w ten sposób, że nie przechodzą one przez WordPress. i tak się stało, ponieważ jak powiedziałem w pytaniu, dzwoniłem do nich z głównego pliku wtyczki. więc poprawka zakończyła się przy użyciu:

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

czytałem o pomocy WordPress . i jeszcze raz dziękuję za odpowiedź!

Bainternet
źródło
Czy możesz ponownie rozważyć oznaczenie tej odpowiedzi ( wordpress.stackexchange.com/a/32002/123092 ) jako zaakceptowanej?
Jestem najgłupszą osobą
4

Zawierać

Instrukcja include () obejmuje i ocenia określony plik.

Uwzględnij raz

Instrukcja include_once () obejmuje i ocenia określony plik podczas wykonywania skryptu. Jest to zachowanie podobne do instrukcji include (), z tą różnicą, że jeśli kod z pliku został już dołączony, to nie zostanie dołączony ponownie. Jak sama nazwa wskazuje, zostanie dołączona tylko raz.

Wymagać

wymagają () i obejmują () są identyczne pod każdym względem, z wyjątkiem sposobu obsługi awarii. Oba generują Ostrzeżenie, ale wymagają () powoduje błąd krytyczny. Innymi słowy, nie wahaj się użyć funkcji replace (), jeśli chcesz, aby brakujący plik zatrzymał przetwarzanie strony.

Wymagają raz

Instrukcja Requ_once () zawiera i ocenia określony plik podczas wykonywania skryptu. Jest to zachowanie podobne do instrukcji wymagającej (), z tą różnicą, że jeśli kod z pliku został już dołączony, nie zostanie dołączony ponownie.

Powyższe informacje pochodzą z dokumentacji PHP, chodzi o to, że nie jest poprawna, będzie zależeć od potrzeby kodu, wymagam () od ważnych rzeczy, takich jak funkcje, ale od plików motywów, takich jak stopka lub pętla, których używam include_once lub include, ponieważ mogę obsłużyć ostrzeżenie i powiedzieć użytkownikowi / odwiedzającemu, że wystąpił błąd zamiast tylko fatal_error

Webord
źródło
Jak mawiają @mtekk, zalecałbym użycie tej struktury: wymagany_once (nazwa_pliku ( PLIK ). '/ Nazwa_pliku.php);
Webord
1

Cześć @ בניית אתרים:

Podczas ładowania WordPress definiuje add_action()funkcję przed próbą załadowania jakichkolwiek wtyczek Fakt, że pojawia się błąd mówi mi, że robisz coś dziwnego lub że coś jest nie tak z instalacją WordPressa.

Do kogo ładujesz swoją „wtyczkę” ? Czy używasz include*()lub, require*()aby go załadować, może w swoim wp-config.phppliku?

MikeSchinkel
źródło
1
include( plugin_dir_path( __FILE__ ) . 'ipn/paypal-ipn.php');

lub

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

lub

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

Uwaga: do kolejkowania plików .css i .js admin_enqueue_scriptswewnątrz wtyczki należy użyćplugin_dir_url( __FILE__ )

$plugin_dir_uri = plugin_dir_url( __FILE__ );
wp_enqueue_style( 'plugin-style', $plugin_dir_uri . 'css/plugin-style.css');
Aamer Shahzad
źródło
0

Za każdym razem, gdy tworzysz nowy plik w katalogu roboczym, musisz go dołączać za każdym razem. Ale wypróbuj metodę przeskanowania twojego directroy i dołączenia go automatycznie, nie tylko plików php, co pomaga poprawnie dołączyć pliki php, js i css po obu stronach (backend, front end).

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

varadha
źródło
1
Dodaj odpowiednie informacje z linku podanego w odpowiedzi. Użyj linku do celów kredytowych. Proszę edytować swoje pytanie
Pieter Goosen