問題描述

有沒有一個容易理解的方案來決定什麼樣的代碼屬於一個插件或主題的 functions.php

有關於該主題的 are many cases 和許多 debates,主要是因為對 WordPress 的內部工作有一些誤解。我根據事實要求一個答案,而不是意見。

它應該解釋如何處理這些問題 (或許更多):

  • 定製帖子類型和分類
  • 聯絡表格
  • 短碼
  • 自定義小工具
  •  add_theme_support( 'automatic-feed-links' );
  • SEO 功能像自定義 meta 元素
  • 主題開關

雙方往往有利弊。我們最受歡迎的問題 Best Collection of Code for your functions.php file 得到了很多代碼片段作為至少有爭議的答案。我們需要一個初學者可以理解的標準,也許是一個檢查列表 – 有理由。

另見 Chip Bennett 在我們的元網站:Questions specifically asking for a solution “without a plugin” 的相關問題

相關:Where do I put the code snippets I found here or somewhere else on the web?

最佳解決方案

我將從這個問題開始:功能與內容的呈現,內容的生成/管理,網站的還是用户的身份有關?

如果功能與內容的呈現不具體相關,那麼它就是在插件領域內。這個列表很長:

  • 修改核心 WP 過濾器 (wp_head 內容,如規範鏈接,生成器和其他 HTML 元等)
  • 網站圖標
  • Post-content 短碼
  • 發佈共享鏈接
  • Google Analytics(分析)(和類似的) 腳註腳本
  • SEO 工具/控件
  • 等等

如果功能與內容的呈現相關,那麼它是被包含在主題中的候選者。在這一點上,我會回到 @Raf912’s Theme-switch criterion:你會錯過功能,當你切換主題?如果該問題的答案為否,則該功能屬於主題。一些例子:

  • 刪除/覆蓋 WP 核心 Gallery CSS
  • 過濾帖子摘錄長度,「閲讀更多」 文字等
  • 任何通過 add_theme_support()實現的 (我想這應該是明顯的)
  • 自定義 CSS

通常,這兩個問題將提供一個相當明確的區別; 但是,也有例外。

自定義帖子類型

例如,自定義帖子類型是內容生成和呈現的一個獨特的混合,給出了模板層次結構對於 single-post-type archive index pagessingle post pages 的工作原理。 CPT 的 content-generation 方面通常將它們放在插件領域中; 然而,插件無法定義適合任何給定主題的設計/佈局/樣式的模板頁面 (特別是如果 CPT 顯示的內容不是通常的標題/內容/元數據,或者與之相關聯的自定義分類法) 。

Long-term 是對這種差異的解決方案,IMHO 是針對給定類型內容 (房地產列表,日曆事件,e-commerce 產品,圖書/媒體庫條目等) 的 CPT 定義具有標準約定/共識。這樣,user-generated 內容將在實現給定 CPT 的標準/慣例定義的主題之間保持可移植性,而主題開發人員保留在主題模板文件中定義該 CPT 的設計/佈局/樣式的靈活性。

社交媒體鏈接

同樣地,我通常會説社交媒體簡介鏈接,ave 在現在的主題中變得普遍存在,是插件領域,因為它們與內容呈現無關。最好的解決方案是將這些配置文件定義在核心的某個位置; 然而,目前沒有標準/共識的方式來定義這些鏈接。在 site-setting 級別是 best-defined 還是基於 per-user?如果 per-user,哪個用户的 meta 在模板中暴露出來?等等

那麼,再次,long-term,解決這個差距是任何一個核心來定義這些鏈接的定義,否則主題開發者社區就會發展自己的共識。在此期間,真正沒有任何東西可以讓它們在每個主題中保持定義。

次佳解決方案

一個簡單的測試代碼最好放在哪裏:

  • 將代碼寫入 functions.php
  • 切換主題
  • 你是否錯過了這個功能,博客是不是正確的工作或舊主題的碎片 (如短碼)?

    • 是的,把它放入一個插件
    • 否:將其留在 functions.php 中

示例:寫一個短碼。切換主題後,簡短的代碼將留在您的帖子中。所以它會更好地放在插件中。

寫一個函數列出最後的註釋。切換主題後,一切都可以,因為其他主題可能具有相同的功能。

它真的取決於代碼和它將做什麼。一些代碼隻影響主題的樣式或內容,還有一些代碼將修改博客文章。

第三種解決方案

我不認為這個問題有一個簡單的答案,但我敢打賭,我們可以製作流程圖來幫助決定。這是一個這樣一個流程圖的大綱,可以並且應該擴展。評論與建議!

      • 具體到這個當前的設計

        • 是的:functions.php
        • 否:插件
      • 不 (它經常改變或者是一個奇怪的) – 插件
      • 具體到這個網站

        • 具體到這個網站:functions.php
          • 是:插件,存儲在 mu-plugins 目錄或 network-activated
          • 無關

              • 是的:functions.php
              • 否:插件
            • 不,可能是插件
      • 否 (由諸如 VIP 的服務託管,不允許插件):use functions.php

  • 父主題 – 有時具有共享功能,最好做一個父主題,並將功能放在父主題的 functions.php 文件中。
  • 大型多站點安裝的插件目錄可能會很快變得不守規矩,所以有時在低百分比網站 (例如<1%) 使用的共享功能最好在 functions.php 文件中複製。

第四種方案

從這裏 Themes VS Plugins

將自定義代碼添加到子主題,以便在更新父主題時,您的自定義代碼不會丟失。

您還可以創建一個包含所有自定義代碼的網站特定插件。

就編寫代碼與插件而言,您可以使用插件和功能,但是對於大多數您想要的,手工編碼是最好的,因為它更容易修改,除了在某些情況下,如元框,您可以考慮使用插件,除非你 「是一個主題開發者

 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. 添加新的自定義帖子類型 – Code
  2. 向用户 – 上面的代碼添加新的字段
  3. 添加新的小工具 – Code
  4. 添加自定義永久鏈接 – WordPress Permalink Settings

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。