Làm cách nào để bao gồm một tệp bằng cách sử dụng get_template_part () trong một plugin?


13

Một câu hỏi rất đơn giản có thể, nhưng tôi đang vật lộn. Trong phát triển chủ đề, tôi đã làm việc với get_template_part()nhiều lần và tôi hiểu những điều cơ bản của nó. Nhưng khi tôi đang phát triển một plugin, tôi đã tự hỏi sử dụng nó cho tôi thấy một số lỗi:

Lưu ý: Sử dụng hằng số STYLESHEETPATH ​​không xác định - giả sử 'STYLESHEETPATH' ...\wp-includes\template.phptrên dòng 407

Lưu ý: Sử dụng hằng số TEMPLATEPATH không xác định - giả sử 'TEMPLATEPATH' ...\wp-includes\template.phptrên dòng 410

Googling vấn đề cho thấy một sửa chữa hỗ trợ:

Nhưng đó có vẻ là một cách giải quyết lớn - tôi nghi ngờ điều đó. Tôi nghĩ rằng không nên phức tạp nhiều. Tôi đã kiểm tra Câu trả lời WPSE này và tìm thấy dòng mã này:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

Trường hợp có include()chức năng PHP . Theo kiến ​​thức WordPress của tôi, tôi đã học cách thích get_template_part()hơn PHP include(). Sau đó, làm thế nào chính xác tôi có thể sử dụng một đơn giản get_template_part()trong plugin của tôi.

Tôi không sử dụng bất kỳ vòng lặp hay thứ gì, tôi chỉ tách (hoặc có thể nói là tổ chức) mã plugin của tôi thành các tệp khác nhau để trong một số trường hợp, tôi sẽ chỉ nhận xét chúng để bỏ đi khi không cần thiết. Tôi đã thử:

get_template_part( 'my', 'special-admin' );

và sau đó xảy ra lỗi, thay đổi nó thành:

get_template_part( 'my', 'specialadmin' );

Nhưng bạn biết đó không phải là vấn đề. Tôi đang ở máy chủ cục bộ, sử dụng WAMP.

Câu trả lời:


11

get_template_partlà một chức năng chủ đề . Bạn không thể tải tập tin plugin với chức năng đó. Hãy xem nguồn và bạn sẽ nhận thấy công việc được thực hiện bởi locate_template. Nhìn vào nguồn đó và bạn sẽ thấy rằng nó luôn tải từ các thư mục chủ đề .

Tuy nhiên nhiều bạn có thể muốn sử dụng get_template_partnó là chức năng sai.

Bạn sẽ cần đến includecác tập tin của bạn.

Lý do, có vẻ như đối với tôi, get_template_partlà để cho phép các chủ đề được mở rộng - hay còn gọi là để dễ dàng tạo ra các chủ đề con. Các plugin không có ý định được mở rộng theo cách đó vì vậy không cần get_template_parthoặc không có bất kỳ plugin nào tương đương.


6

@s_ha_dum đúng get_template_partlà một chức năng chủ đề, nhưng anh ta không chính xác rằng các plugin không có ý định được mở rộng theo cách này. Nó chỉ đơn giản là phức tạp hơn.

Bài đăng này của Pippin, mô tả cách sử dụng một chức năng sẽ thực hiện công việc tải các mẫu plugin của bạn, đồng thời cho phép người dùng ghi đè các mẫu plugin của bạn trong chủ đề của họ.

Về cơ bản, nó tìm trong một thư mục đặc biệt trong chủ đề, sau đó nếu không tìm thấy ở đó, nó sẽ nằm trong thư mục mẫu cho plugin.


4

Như đã nói trước đây, bạn không thể sử dụng các get_template_partplugin, nhưng có một lớp tiện dụng trên Github (được tạo bởi Gary Jones) bắt chước get_template_partchức năng trong các plugin, thêm plugin vào dự phòng (chủ đề con> chủ đề gốc> plugin).

Bằng cách này, bạn có thể ghi đè lên phần mẫu mẫu của plugin của bạn trong một chủ đề con hoặc chủ đề chính.

Cách sử dụng (lấy từ hướng dẫn repo Github):

  1. Sao chép class-gamajo-template-loader.phpvào plugin của bạn. Nó có thể vào một tập tin trong thư mục gốc, hoặc tốt hơn là một thư mục bao gồm.
  2. Tạo một tệp mới, chẳng hạn như class-your-plugin-template-loader.php, trong cùng một thư mục.
  3. Tạo một classtrong đó tập tin mở rộng Gamajo_Template_Loader.
  4. Ghi đè các thuộc tính lớp cho phù hợp với plugin của bạn. Bạn cũng có thể ghi đè get_templates_dir()phương thức nếu nó không phù hợp với bạn.
  5. Bây giờ bạn có thể khởi tạo lớp trình tải mẫu tùy chỉnh của mình và sử dụng nó để gọi get_template_part()phương thức. Điều này có thể nằm trong một cuộc gọi lại mã ngắn hoặc một cái gì đó bạn muốn các nhà phát triển chủ đề đưa vào các tệp của họ.

Mã ví dụ:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// The value of bar is now available inside the recipe template as $context->foo.
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.