Cách bao gồm các tệp PHP trong plugin một cách chính xác


59

Vấn đề của tôi là khi trên tệp plugin chính, tôi có một tệp PHP giống như thế này:

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

và trên tập tin đó, tôi có một cuộc gọi đến một chức năng WordPress như:

add_action('hook', 'callback');

va tôi lây:

Lỗi nghiêm trọng: Gọi hàm không xác định add_action ()

Bây giờ trước khi bạn nói "sử dụng if(**function_exists**('add_action')){" nếu tôi sử dụng thì nó không hoạt động.

Các câu hỏi:

  • Điều gì sẽ là cách chính xác để làm điều đó?
  • Sự khác nhau giữa là gì include, include_once, requirevà khi nào tôi sử dụng phù thủy?

bạn đang làm gì đó sai nếu bạn nhận được tin nhắn đó. Đảm bảo bạn bao gồm bất kỳ tệp nào trước khi bạn bắt đầu chạy các chức năng từ các tệp này
onetrickpony

Không có gì, các cuộc gọi nằm trong các tệp tôi đang bao gồm!
BaiNET

lol, bây giờ tôi thấy WP_PLUGIN_URLtrong mã của bạn ở trên :)
onetrickpony

3
Nói một cách đơn giản, bạn chỉ có thể bao gồm các tệp () thông qua filepath chứ không phải URI.
biên tập viên

1
Bài viết về Codex này (có lẽ được viết sau khi bạn hỏi câu hỏi của bạn) khá hữu ích: codex.wordpress.org/Determining_Plugin_and_Content_Directories
henrywright

Câu trả lời:


88

Đến muộn trong bữa tiệc này, nhưng đây là cách "WordPress": sử dụng plugin_dir_path( __FILE__ ), ví dụ:

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

Lưu ý rằng hàm sẽ trả về dấu gạch chéo cho filepath.


3
Lưu ý rằng bằng cách sử dụng __FILE__nó sẽ xuất ra liên quan đến tệp hiện tại mà bạn gọi nó từ đó, vì vậy nếu includecâu lệnh của bạn được thực hiện từ thư mục con bên trong cấu trúc tệp plugin của bạn, bạn cũng sẽ nhận được thư mục con.
squarecandy

Cách khác - nếu bạn CẦN các đường dẫn tương đối, làrequire_once(plugin_dir_path(__DIR__).'/myfile.inc');
FoggyDay

10

Tôi đã xem qua một vài plugin mà tôi đã tạo trước đây để thấy những cách khác nhau mà tôi đã bao gồm các tệp bổ sung bên trong các plugin và tôi nhận thấy có hai phương pháp bạn có thể sử dụng, có lẽ còn nhiều phương pháp khác.

Xác định thư mục plugin của bạn

Bên trong plugin của bạn có định nghĩa sau để xác định vị trí plugin hiện tại.

Mã ví dụ:

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

Chỉ cần một thẳng lên bao gồm hoặc yêu cầu

Bạn chỉ có thể sử dụng; bao gồm, include_once, yêu cầu hoặc request_once bên trong thư mục plugin của bạn bằng cách tham chiếu vị trí như trong mã ví dụ bên dưới. Ví dụ dưới đây sẽ dựa trên một tệp trong thư mục plugin gốc của bạn bao gồm một tệp khác từ trong một thư mục bên trong thư mục plugin của bạn.

Mã ví dụ:

include "classes/plugin-core.php";

tương đối bao gồm có thể mang lại tất cả các loại vấn đề bất ngờ khó chịu.
Đánh dấu Kaplun

5

Tôi cuối cùng đã gửi các cấu trúc WordPress để bao gồm và sử dụng như sau:

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

Tôi không nghĩ rằng nó thực sự sẽ giải quyết vấn đề của bạn, dường như là vấn đề phạm vi, nhưng đó là mã tôi sử dụng.

Đối với sự khác biệt giữa bao gồm và yêu cầu:
bao gồm sẽ đưa ra cảnh báo nếu không tìm thấy tệp
yêu cầu sẽ gây ra lỗi nghiêm trọng nếu không tìm thấy tệp

bao gồm


5

Trước tiên, cảm ơn tất cả những người đã trả lời,

Vấn đề của tôi là gọi các tệp được bao gồm với url đầy đủ theo cách mà họ không thông qua WordPress. và điều đó đã xảy ra bởi vì như tôi đã nêu trong câu hỏi tôi đã gọi họ từ tệp plugin chính. Vì vậy, sửa chữa kết thúc bằng cách sử dụng:

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

Tôi đọc về hỗ trợ WordPress . và một lần nữa cảm ơn vì đã trả lời!


Bạn có thể vui lòng xem xét lại để đánh dấu câu trả lời này ( wordpress.stackexchange.com/a/32002/123092 ) là được chấp nhận không?
Tôi là người ngu ngốc nhất

4

Bao gồm

Câu lệnh include () bao gồm và đánh giá tệp đã chỉ định.

Bao gồm một lần

Câu lệnh include_once () bao gồm và đánh giá tệp được chỉ định trong quá trình thực thi tập lệnh. Đây là một hành vi tương tự như câu lệnh include (), với điểm khác biệt duy nhất là nếu mã từ một tệp đã được đưa vào, nó sẽ không được đưa vào lại. Như tên cho thấy, nó sẽ được bao gồm chỉ một lần.

Yêu cầu

Yêu cầu () và bao gồm () giống hệt nhau theo mọi cách trừ cách họ xử lý thất bại. Cả hai đều tạo Cảnh báo, nhưng yêu cầu () dẫn đến Lỗi nghiêm trọng. Nói cách khác, đừng ngần ngại sử dụng request () nếu bạn muốn một tệp bị thiếu để tạm dừng xử lý trang.

Yêu cầu một lần

Câu lệnh allow_once () bao gồm và đánh giá tệp được chỉ định trong quá trình thực thi tập lệnh. Đây là một hành vi tương tự như câu lệnh request (), với điểm khác biệt duy nhất là nếu mã từ một tệp đã được đưa vào, nó sẽ không được đưa vào lại.

Thông tin ở trên là từ tài liệu PHP, điều không có chính xác, sẽ phụ thuộc vào nhu cầu của mã, tôi yêu cầu () về các nội dung quan trọng như hàm, nhưng trên các tệp chủ đề như chân trang hoặc vòng lặp tôi sử dụng include_once hoặc bao gồm bởi vì tôi có thể xử lý cảnh báo và nói với người dùng / khách truy cập rằng có lỗi xảy ra thay vì chỉ là fatal_error


Như @mtekk nói tôi sẽ khuyên bạn nên sử dụng cấu trúc tis: allow_once (dirname ( FILE ). '/Filename.php);
Webord

1

Xin chào @ בנ

Khi WordPress đang tải, nó xác định add_action()chức năng trước khi nó cố tải bất kỳ plugin nào. Thực tế là bạn đang gặp lỗi cho tôi biết bạn đang làm gì đó lạ hoặc có gì đó không ổn với cài đặt WordPress của bạn.

Bạn đang tải "plugin" của mình là ai? Bạn đang sử dụng một include*()hoặc require*()để tải nó, có thể trong wp-config.phptập tin của bạn ?


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

hoặc là

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

hoặc là

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

Lưu ý: để admin_enqueue_scriptssử dụng các tập tin enqueu .css & .js bên trong pluginplugin_dir_url( __FILE__ )

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

0

Bất cứ khi nào bạn tạo một tệp mới trong thư mục làm việc của mình, bạn phải đưa nó vào mọi lúc. Nhưng hãy thử một phương pháp để quét directroy của bạn và tự động đính kèm, không chỉ các tệp php, giúp bao gồm các tập tin php, js và css đúng cách ở cả hai bên (phụ trợ, giao diện người dùng).

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


1
Vui lòng thêm thông tin liên quan từ liên kết được cung cấp cho câu trả lời của bạn. Sử dụng liên kết cho mục đích tín dụng. Vui lòng chỉnh sửa câu hỏi của bạn
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.