Nơi để đặt mã của tôi: plugin hoặc hàm.php?


86

Có một sơ đồ dễ hiểu để quyết định loại mã nào thuộc về plugin hoặc chủ đề functions.phpkhông?

rất nhiều trường hợp và nhiều cuộc tranh luận về chủ đề đó, chủ yếu là do có một số quan niệm sai lầm về hoạt động bên trong của WordPress. Tôi đang yêu cầu một câu trả lời dựa trên sự thật, không dựa trên ý kiến.

Nó sẽ giải thích làm thế nào để xử lý những điểm này (và có thể nhiều hơn):

  • loại bài tùy chỉnh và phân loại
  • hình thức liên lạc
  • mã ngắn
  • vật dụng tùy chỉnh
  • add_theme_support( 'automatic-feed-links' );
  • Chức năng SEO như các metayếu tố tùy chỉnh
  • chuyển đổi chủ đề

Thường có những ưu và nhược điểm cho cả hai bên. Câu hỏi phổ biến nhất của chúng tôi Bộ sưu tập mã tốt nhất cho tệp tin.php của bạn có rất nhiều đoạn mã dưới dạng câu trả lời ít nhất là gây tranh cãi.
Chúng tôi cần tiêu chí mà một người mới bắt đầu có thể hiểu, có thể là một danh sách kiểm tra - với lý do.

Xem thêm câu hỏi liên quan của Chip Bennett trên trang meta của chúng tôi: Các câu hỏi đặc biệt yêu cầu giải pháp "không có plugin"

Liên quan: Tôi đặt đoạn mã tôi tìm thấy ở đâu hoặc ở nơi nào khác trên web?


Tôi tự hỏi điều gì sẽ tạo thành sự thật cho mục đích của câu hỏi này. Người A nói CPT đi trong plugin, Người B nói CPT đi theo chủ đề. Làm thế nào chúng ta có thể mua một thực tế để xác nhận một trong những ý kiến? Điều này có thể nguy hiểm gần với "không mang tính xây dựng".
Rarst

Câu trả lời:


72

Tôi sẽ bắt đầu với câu hỏi này: Là chức năng liên quan đến việc trình bày nội dung, hoặc với việc tạo / quản lý nội dung, hoặc của trang web, hoặc về danh tính người dùng?

Nếu chức năng không liên quan cụ thể đến việc trình bày nội dung , thì nó nằm trong Lãnh thổ Plugin. Danh sách này dài:

  • Sửa đổi bộ lọc WP lõi ( wp_headnội dung, chẳng hạn như liên kết chính tắc, trình tạo và meta HTML khác, v.v.
  • Trang web Favicon
  • Mã ngắn nội dung
  • Liên kết chia sẻ bài viết
  • Tập lệnh chân trang Google Analytics (và tương tự)
  • Công cụ / kiểm soát SEO
  • Vân vân.

Nếu chức năng liên quan đến việc trình bày nội dung , thì đó là một ứng cử viên để được đưa vào Chủ đề. Tại thời điểm này, tôi sẽ trở lại tiêu chí chuyển đổi Chủ đề của @ Raf912 : bạn có bỏ lỡ chức năng khi chuyển Chủ đề không? Nếu câu trả lời cho câu hỏi đó là không , thì chức năng thuộc về Chủ đề. Vài ví dụ:

  • Xóa / ghi đè CSS Thư viện lõi của WP
  • Lọc độ dài bài đăng, văn bản "đọc thêm", v.v.
  • Bất cứ điều gì được thực hiện thông qua add_theme_support()(tôi cho rằng điều này nên rõ ràng)
  • CSS tùy chỉnh

Thông thường, hai câu hỏi này sẽ cung cấp một dòng phân biệt khá rõ ràng; Tuy nhiên, có những trường hợp ngoại lệ.

Các loại bài tùy chỉnh

Tuỳ chỉnh bài viết các loại, ví dụ, là một chút của một hybrid độc đáo của hệ nội dung và trình bày, đưa ra cách Template Hierarchy làm việc cho đơn hậu kiểu trang index lưu trữbài duy nhất trang . Khía cạnh tạo nội dung của CPT thường đặt chúng thẳng đứng trong Lãnh thổ Plugin; tuy nhiên, Plugin không thể xác định các trang mẫu vốn phù hợp với thiết kế / bố cục / kiểu cho bất kỳ Chủ đề cụ thể nào (đặc biệt là nếu CPT hiển thị khác với Tiêu đề / Nội dung / Meta thông thường hoặc có các phân loại tùy chỉnh được liên kết với nó).

Về lâu dài, giải pháp cho sự chênh lệch này, IMHO, là phải có một quy ước / đồng thuận tiêu chuẩn cho định nghĩa về CPT cho các loại nội dung nhất định (danh sách bất động sản, sự kiện lịch, sản phẩm thương mại điện tử, mục nhập thư viện sách / phương tiện truyền thông, v.v. .). Theo cách đó, nội dung do người dùng tạo sẽ vẫn có thể di chuyển giữa các Chủ đề triển khai định nghĩa tiêu chuẩn / quy ước của CPT nhất định, trong khi các nhà phát triển Chủ đề giữ tính linh hoạt để xác định thiết kế / bố cục / kiểu của CPT đó trong tệp mẫu Chủ đề.

Liên kết truyền thông xã hội

Tương tự, tôi thường nói rằng các liên kết hồ sơ truyền thông xã hội, đã trở thành tất cả nhưng phổ biến trong các Chủ đề hiện tại, là Lãnh thổ Plugin, vì chúng không liên quan gì đến việc trình bày nội dung. Giải pháp tốt nhất sẽ là cho các cấu hình này được xác định ở đâu đó trong lõi; tuy nhiên, hiện tại không có phương tiện tiêu chuẩn / đồng thuận để xác định các liên kết này. Chúng được xác định tốt nhất ở cấp cài đặt trang hay trên cơ sở mỗi người dùng? Nếu mỗi người dùng, meta của người dùng nào được hiển thị trong mẫu? Vân vân.

Vì vậy, một lần nữa, về lâu dài, giải pháp cho sự chênh lệch này là để cốt lõi xác định nơi các liên kết này được xác định hoặc nếu không thì cộng đồng nhà phát triển Theme sẽ phát triển sự đồng thuận của riêng mình. Trong khi đó, thực sự không có gì cho nó ngoài việc giữ chúng được xác định trong mỗi Chủ đề.


add_theme_support( 'automatic-feed-links' );không mang tính trình bày. Nhưng nó được yêu cầu bởi các hướng dẫn chủ đề . Tại sao nó là một rủi ro cần thiết để mất chức năng này sau khi chuyển đổi chủ đề?
fuxia

1
Bất cứ điều gì được thực hiện thông qua add_theme_support()chỉ có thể được thực hiện thông qua Chủ đề. Sử dụng add_theme_support( 'automatic-feed-links' )trong Chủ đề thực sự đảm bảo trải nghiệm nhất quán từ Chủ đề đến Chủ đề, vì các liên kết nguồn cấp được tạo sẽ giống nhau.
Chip Bennett

4
Tôi nghĩ rằng nó được đặt tên sai: Liên kết nguồn cấp dữ liệu không phải là trình bày. Nếu chủ đề tiếp theo không gọi chức năng đó, người dùng sẽ mất các liên kết nguồn cấp. Và bạn có thể thêm vào mỗi plugin mà không có vấn đề gì. Đó là lý do tại sao tôi bối rối về nó. :)
fuxia

1
Bạn biết đấy: đó là một điểm tốt. :)
Chip Bennett

50

Một thử nghiệm dễ dàng trong đó mã được đặt tốt nhất:

  • viết mã vào các hàm.php
  • chuyển chủ đề
  • Bạn có bỏ lỡ chức năng không, blog không hoạt động đúng hay các đoạn của chủ đề cũ (ví dụ: shortcodes) còn lại?

    • có: đặt nó vào một plugin

    • không: để nó trong hàm.php

Ví dụ: Viết một mã ngắn. Sau khi chuyển đổi chủ đề, các mã ngắn đơn giản được để lại trong bài viết của bạn. Vì vậy, nó sẽ được đặt tốt hơn trong một plugin.

Viết một hàm để liệt kê các bình luận cuối cùng. Sau khi chuyển đổi chủ đề, mọi thứ đều ổn vì có thể chủ đề khác có chức năng tương đương.

Nó thực sự phụ thuộc vào mã và những gì nó sẽ làm. Một số mã chỉ ảnh hưởng đến kiểu dáng hoặc nội dung của chủ đề, một số mã khác sẽ sửa đổi các bài đăng trên blog.


11
+1 Nếu mã dành riêng cho chủ đề, hãy đặt nó là functions.php. Nếu nó cần áp dụng cho nhiều hơn một chủ đề, hãy đặt nó vào một plugin.
s_ha_dum

18

Tôi không nghĩ rằng có một câu trả lời dễ dàng cho câu hỏi này, nhưng tôi cá là chúng ta có thể tạo ra một biểu đồ dòng chảy để giúp đưa ra quyết định. Đây là một phác thảo sơ bộ của biểu đồ dòng chảy như vậy, có thể và nên được mở rộng. Nhận xét với các đề xuất!

  • Mã này có được lưu trữ trên một bản cài đặt WordPress không?
    • Có - Chủ đề của trang web chỉ thay đổi với các thiết kế lại và thay đổi lớn về chức năng?
      • Có - Mã trong câu hỏi cụ thể cho thiết kế hiện tại này ?
        • Có: Hàm.php
        • Không: Plugin
      • Không (nó thay đổi thường xuyên hoặc bất chợt) - Plugin
    • Không (Multsisite) - Bạn đang lưu trữ cài đặt multisite HOẶC nó có phải là một giải pháp multisite được lưu trữ cho phép bổ trợ không?
      • Có: Chức năng được đề cập cụ thể cho trang web này , hoặc có thể / nên được sử dụng bởi các trang web khác trong mạng không?
        • Cụ thể cho trang web này: Hàm.php
        • Được chia sẻ giữa nhiều trang web - Bạn có muốn buộc nó trên mọi trang web không?
          • Có: Plugin, được lưu trong thư mục mu-plugins hoặc được kích hoạt mạng
          • Không: Đây có phải là một mạng lưới các trang web không liên quan ? (ví dụ: khách hàng khác nhau)
            • Có: Sẽ là xấu hoặc không chuyên nghiệp nếu khách hàng A nhìn thấy hoặc kích hoạt plugin bạn đã viết cho khách hàng B, C và D? (ví dụ: có thể nó sẽ phá vỡ trang web hoặc gây ra chức năng không mong muốn)
              • Có: Hàm.php
              • Không: Plugin
            • Không: Có lẽ là plugin
      • Không (được lưu trữ bởi một dịch vụ như VIP không cho phép bổ trợ): sử dụng hàm.php
Một số suy nghĩ khác mà tôi không biết làm thế nào để phù hợp ở đây:

  • Chủ đề gốc - đôi khi với chức năng được chia sẻ, sẽ tốt hơn nếu tạo chủ đề gốc và đặt chức năng trong tệp tin.php của chủ đề gốc.
  • Các thư mục plugin của các bản cài đặt nhiều trang lớn có thể nhanh chóng trở nên ngang ngược, do đó, đôi khi chức năng được chia sẻ được sử dụng bởi một tỷ lệ thấp các trang web (ví dụ <1%) sẽ tốt nhất để sao chép trong các tệp tin.php.

6

Từ đây Chủ đề VS Plugins

Thêm mã tùy chỉnh vào chủ đề con để khi bạn cập nhật chủ đề gốc, mã tùy chỉnh của bạn sẽ không bị mất.

Bạn cũng có thể tạo một plugin cụ thể cho trang web chứa tất cả mã tùy chỉnh của bạn.

Theo như viết mã so với plugin, bạn có thể sử dụng plugin và các chức năng tuy nhiên đối với hầu hết những gì bạn muốn, mã hóa tay là cách tốt nhất vì nó dễ sửa đổi hơn trong một số trường hợp như hộp meta nơi bạn có thể xem xét sử dụng plugin trừ khi bạn là một nhà phát triển chủ đề.

 function modify_contact_methods($profile_fields) {

// Add new fields
$profile_fields['twitter'] = 'Twitter Username';
$profile_fields['facebook'] = 'Facebook URL';
$profile_fields['gplus'] = 'Google+ URL';

return $profile_fields;
}
add_filter('user_contactmethods', 'modify_contact_methods');

http://codex.wordpress.org/Plugin_API/Filter_Reference/user_contactmethods

  1. Thêm loại bài đăng tùy chỉnh mới -
  2. Thêm các trường mới cho người dùng - Mã ở trên
  3. Thêm vật dụng mới -
  4. Thêm permalinks tùy chỉnh - Cài đặt Permalink WordPress

5

Tôi biết đây là một con ngựa chết và Chip đã che đậy nó khá nhiều, nhưng muốn thêm một vài suy nghĩ.

Nếu bạn thực hiện một chương trình sống và thấy mình làm việc trên các trang web wordpress theo thời hạn, bạn sẽ thấy rằng nó thực sự đi vào thời gian.

Thường xuyên hơn không, đặc biệt đối với những người mới bắt đầu, sẽ nhanh hơn và đơn giản hơn nhiều khi chỉ cần thêm bất cứ thứ gì bạn cần vào một chủ đề và gọi nó là xong.

Điều đó đang được nói, nếu bạn làm việc trên wordpress trên cơ sở bán thường xuyên, bạn nên nghiêm túc xem xét việc làm như sau :


  1. Xây dựng bộ xương plugin

Điều này sẽ xử lý mọi thứ bạn thường cần làm với một plugin, bao gồm kích hoạt, hủy kích hoạt, cập nhật phiên bản, xây dựng bảng quản trị và gỡ cài đặt.

Nếu bạn dành thời gian để làm điều này, bạn sẽ tìm thấy:

  • Không còn mất nhiều thời gian để thêm chức năng thông qua các plugin
  • Bạn có thể bắt đầu xây dựng một danh sách bổ sung vững chắc để sử dụng lại cho các dự án khác khi cần thiết, tiết kiệm cho mình rất nhiều thời gian trong thời gian dài.
  • Bạn có thể làm cho chúng công khai nếu bạn muốn có thêm tầm nhìn

Bây giờ bạn có thể xây dựng mọi thứ đúng cách hoàn thành các dự án trong tương lai nhanh hơn.


  1. Xây dựng bộ xương chủ đề

Điều này sẽ xử lý mọi thứ thường cần trong một chủ đề:

  • Biểu định kiểu lõi chứa các kiểu mà bạn thường sử dụng (đặt lại, v.v.)
  • Một tệp index.php thích hợp, xử lý mọi thứ bạn cần cho bất kỳ mẫu nào
  • Một tệp tin.php. Bạn sẽ không sử dụng nó nhiều như vậy, nhưng nó vẫn sẽ có ích.

Một khi bạn đã hoàn thành, xây dựng một bộ xương chủ đề con sử dụng chủ đề chính của bạn.

  • Thêm biểu định kiểu, tham khảo chủ đề cha mẹ của bạn.
  • Thêm tệp tin.php.

Khi bạn đã hoàn thành hai điều này, việc tạo trang web mới cho mọi người trở nên nhanh hơn nhiều.


Nếu bạn làm như trên, bạn có thể làm việc sau:

  • Dành thời gian rảnh mới tìm thấy của bạn để làm quen với PHP, WordPress, JavaScript, CSS và / hoặc myQuery ... bạn càng tìm hiểu về những điều này nhanh hơn bạn sẽ hoàn thành công việc.
  • Cập nhật plugin, chủ đề và bộ xương chủ đề con của bạn khi bạn tìm thấy những điều bạn nên cải thiện. Cho dù bạn có giỏi đến đâu, nếu bạn tiếp tục học hỏi, bạn sẽ tìm thấy những cải tiến cần thực hiện.

Và, nếu bạn làm tất cả những điều trên , bạn sẽ thấy rằng câu trả lời của Chip sẽ không chỉ lý tưởng, nó sẽ trở nên tối ưu.


3

Câu trả lời đơn giản là đây ..

Là mã phụ thuộc vào bất kỳ chức năng được xây dựng trong một chủ đề cụ thể? Nếu có, sau đó đưa vào một chủ đề.

Bạn có muốn mã này có thể được chuyển giữa các trang web và giữa các chủ đề không? Nếu có, sau đó đặt trong một plugin.

Nếu câu trả lời là không cho cả hai điều trên, thì hãy hình dung trang web này trong 5 năm tới, khi đó là thời gian để thiết kế lại. Là chức năng của mã bạn đang viết một cái gì đó sẽ tồn tại trong bản cập nhật thiết kế tiếp theo? Nếu có, hãy đặt một plugin.

Ngoài ra, nếu bạn không sử dụng các chủ đề con và bạn dự định cập nhật chủ đề, tôi cũng khuyên bạn nên sử dụng một plugin.

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.