Куди поставити свій код: плагін або function.php?


86

Чи легко зрозуміти схему, щоб вирішити, який код належить плагіну чи темі functions.php?

На цю тему є багато випадків і багато дебатів , здебільшого тому, що існують деякі помилки щодо внутрішнього функціонування WordPress. Я прошу відповіді, грунтуючись на фактах, а не на думках.

Він повинен пояснити, як поводитися з цими пунктами (і, можливо, більше):

  • користувацькі типи публікацій та таксономії
  • контактні форми
  • короткі коди
  • спеціальні віджети
  • add_theme_support( 'automatic-feed-links' );
  • SEO функціонує як користувацькі metaелементи
  • перемикач теми

Часто є плюси і мінуси для обох сторін. У нашому найпопулярнішому запитанні Найкраща колекція коду для файлу function.php отримано багато фрагментів коду як відповідей, принаймні дискусійних.
Нам потрібні критерії, які може зрозуміти новачок, можливо, контрольний список - із причинами.

Дивіться також пов’язане запитання від Chip Bennett на нашому мета-сайті: Питання, що спеціально задають рішення "без плагіна"

Пов'язане: Де я можу розмістити фрагменти коду, які я знайшов тут чи десь в Інтернеті?


Цікаво, що б складало факти для цілей цього питання. Людина A каже, що CPT переходить у плагін, людина B каже, що CPT переходить у тему. Як ми можемо здобути факт для підтвердження однієї думки? Це може бути небезпечно близьким до "неконструктивного".
Рарст

Відповіді:


72

Я б почав з цього питання: чи функціональність пов'язана з представленням вмісту, або з генерацією / керуванням вмістом, або з сайтом, або з ідентифікацією користувача?

Якщо функціональність не пов’язана конкретно з представленням вмісту , вона прямо знаходиться в межах плагінної території. Цей список довгий:

  • Модифікація основних WP-фільтрів ( wp_headвміст, такий як канонічні посилання, генератор та інші HTML-мета тощо)
  • Сайт Favicon
  • Постмістові шорт-коди
  • Опублікувати посилання для обміну
  • Сценарії колонтитулів Google Analytics (та подібні до них)
  • Інструменти / засоби управління SEO
  • тощо.

Якщо функціональність пов'язана з презентацією вмісту , то вона є кандидатом на включення до Теми. На цьому етапі я б повернувся до критерію Тема перемикання @ Raf912 : чи втратили б ви функціональність при переключенні тем? Якщо відповідь на це питання - ні , функціональність належить до Теми. Деякі приклади:

  • Видалення / переосмислення основного CSS галереї WP
  • Фільтрування довжини витягу публікації, тексту "читати далі" тощо.
  • Все, що реалізується через add_theme_support()(я думаю, це має бути очевидним)
  • Спеціальний CSS

Зазвичай ці два питання дадуть досить чітку лінію розмежування; однак, є винятки.

Спеціальні типи публікацій

Наприклад, користувацькі типи публікацій - це трохи унікальний гібрид створення вмісту та презентації, враховуючи спосіб роботи Ієрархії шаблонів для індексованих сторінок архівів одного типу та одних сторінок публікацій . Аспект CPT, що генерує вміст, зазвичай розміщує їх прямо на Території плагінів; однак плагіни не можуть визначати сторінки шаблонів, які по своїй суті вписуються у дизайн / макет / стиль для будь-якої заданої теми (особливо якщо CPT відображає, крім звичайного заголовка / вмісту / мета, або з нею пов'язані власні таксономії).

В довгостроковій перспективі рішення цієї невідповідності IMHO полягає у встановленні стандартної конвенції / консенсусу щодо визначення CPT для заданих типів вмісту (списки нерухомості, календарні події, продукти електронної комерції, записи бібліотек книг / медіа тощо) .). Таким чином, створений користувачем вміст залишатиметься переносним між Темами, які реалізують стандартне / конвенційне визначення даної CPT, тоді як розробники Теми зберігають гнучкість у визначенні дизайну / макета / стилю цього CPT у файлах шаблонів Тема.

Посилання в соціальних мережах

Так само, як правило, я б сказав, що посилання на профілі соціальних медіа, які стають усіма повсюдними в нинішніх Темах, є плагіновою територією, оскільки вони не мають нічого спільного з презентацією вмісту. Найкращим рішенням було б, щоб ці профілі були визначені десь в основі; однак, наразі не існує стандартних / консенсусних засобів визначення цих зв’язків. Чи найкраще вони визначені на рівні налаштування сайту чи на основі кожного користувача? Якщо в шаблоні користувача, який користувач мета відображається в шаблоні? тощо.

Отже, довготерміново, рішення цієї невідповідності полягає в тому, щоб або ядро ​​визначити, де визначені ці посилання, або для того, щоб спільнота розробників Теми виробила власний консенсус. Тим часом, насправді немає нічого, крім того, щоб вони були визначені у межах кожної теми.


add_theme_support( 'automatic-feed-links' );не є презентаційним. Але цього вимагають вказівки щодо теми . Чому після переключення теми необхідний ризик втратити цю функціональність?
фуксія

1
Все, що реалізується через, add_theme_support()може бути реалізовано лише через Тему. Використання add_theme_support( 'automatic-feed-links' )в межах теми фактично забезпечує постійний досвід роботи від теми до теми, оскільки створені посилання каналів будуть однаковими.
Чіп Беннетт

4
Я думаю, що це неправильно названо: посилання на канал не є презентаційними. Якщо наступна тема не викликає цю функцію, користувач втратить посилання на канал. І ви можете додати це за плагін без проблем. Тому я з цим плутаюсь. :)
fuxia

1
Ви знаєте: це хороший момент. :)
Чіп Беннетт

50

Простий тест, де найкраще розмістити код:

  • запишіть код у function.php
  • тема переключення
  • чи не вистачає вам функціональності, чи не працює блог належним чином, або залишилися фрагменти старої теми (наприклад, шорткоди)?

    • так: помістіть його у плагін

    • ні: залиште його у function.php

Приклади: Напишіть короткий код. Після переключення теми звичайні шорт-коди залишаються у ваших публікаціях. Так що краще буде розміщений у плагіні.

Напишіть функцію, щоб перелічити останні коментарі. Після переключення теми все нормально, тому що, можливо, інша тема має еквівалентну функцію.

Це дійсно залежить від коду і того, що він буде робити. Деякі коди впливають лише на стиль чи зміст теми, інші - змінюють публікації блогу.


11
+1 Якщо код специфічний для теми, поставте його так functions.php. Якщо це потрібно застосувати до декількох тем, поставте його у плагін.
s_ha_dum

18

Я не думаю, що на це питання легко відповісти, але я думаю, що ми могли б скласти схему, яка допоможе прийняти рішення. Ось приблизний контур такої блок-схеми, яку можна і потрібно розширити. Прокоментуйте пропозиції!

  • Чи повинен цей код розміщуватись на установці WordPress на одному місці?
    • Так - Чи змінюється тема сайту лише за допомогою основних переробок та змін функціональності?
      • Так - Чи специфічний код у цьому поточному дизайні ?
        • Так: function.php
        • Ні: плагін
      • Ні (вона часто змінюється або примха) - плагін
    • Ні.
      • Так: Чи специфічна для цього веб-сайту функціональність , чи можна / чи слід її використовувати інші сайти в мережі?
        • Спеціально для цього сайту: functions.php
        • Спільний доступ до кількох сайтів - Ви хочете застосовувати їх на кожному сайті?
          • Так: Плагін, що зберігається в каталозі mu-плагінів або активований мережею
          • Ні: Це мережа споріднених сайтів? (наприклад, різні клієнти)
            • Так: Було б погано чи непрофесійно, якби клієнт A бачив або активував плагін, який ви написали для клієнтів B, C та D? (наприклад, це може зламати сайт або спричинити небажану функціональність)
              • Так: function.php
              • Ні: плагін
            • Ні: Можливо, плагін
      • Ні (розміщується така послуга, як VIP, яка не дозволяє плагіни): використовуйте function.php
Деякі інші думки, які я не знав, як тут поміститися:

  • Батьківські теми - іноді з спільним функціоналом краще було б зробити батьківську тему і помістити функціональність у файл з функцією .php батьківської теми.
  • Каталоги плагінів великих багатосайтових установок можуть швидко стати недоброзичливими, тому іноді спільну функціональність, яку використовує низький відсоток сайтів (наприклад, <1%), було б найкраще дублювати у файлах funk.php.

6

Звідси Теми VS плагіни

Додайте спеціальний код до дочірньої теми, щоб під час оновлення батьківської теми ваш власний код не втрачався.

Ви також можете створити плагін, специфічний для сайту, який також містить весь ваш власний код.

Що стосується написання коду проти плагінів, ви можете використовувати плагіни та функції, однак для більшості всього, що ви хочете, ручне кодування є найкращим, оскільки його простіше змінювати, за винятком деяких випадків, наприклад, мета-поля, де ви можете розглянути можливість використання плагіна, якщо ви не ти розробник тем.

 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. Додати новий спеціальний тип публікації - Код
  2. Додайте нові поля для користувачів - код вище
  3. Додати нові віджети - код
  4. Додайте власні постійні посилання - Налаштування Постійної посилання WordPress

5

Я знаю, що це мертвий кінь і що Чіп його майже прикрив, але хотів додати кілька думок.

Якщо ви заробляєте програмне забезпечення для життя і опиняєтесь, що працюєте на сайтах WordPress в терміни, ви виявите, що це дійсно з часом.

Найчастіше, особливо для тих, хто тільки починає, набагато швидше і простіше просто додати все те, що вам потрібно в тему, і назвати його виконаним.

При цьому, якщо ви працюєте над wordpress на регулярній основі, вам слід серйозно розглянути наступне :


  1. Створіть скелет плагіна

Це має вирішувати все, що вам зазвичай потрібно робити з плагіном, включаючи активацію, деактивацію, оновлення версій, створення адміністраторських панелей та видалення.

Якщо ви зробите час для цього, ви знайдете:

  • Для додавання функціональності через плагіни більше не потрібно багато часу
  • Ви можете почати складати суцільний список плагінів для повторного використання інших проектів за необхідності, заощаджуючи багато часу в довгостроковій перспективі.
  • Ви можете зробити їх загальнодоступними, якщо хочете отримати додаткову видимість

Тепер ви можете будувати речі належним чином і швидше робити майбутні проекти.


  1. Створіть каркас теми

Це має обробляти все, що зазвичай потрібно в темі:

  • Основна таблиця стилів, що містить стилі, якими ви часто користуєтесь (скидання тощо)
  • Правильний файл index.php, який обробляє все необхідне для будь-якого шаблону
  • Файл function.php - ви не будете використовувати його майже так само, але він все одно стане у нагоді.

Коли ви це зробите, складіть скелет дочірньої теми, який використовує вашу основну тему.

  • Додайте таблицю стилів, посилаючись на свою батьківську тему.
  • Додайте файл function.php

Коли ви виконаєте ці дві речі, створення нових сайтів для людей стає набагато швидшим.


Якщо ви зробите вищезазначене, ви можете працювати над наступним:

  • Витратьте свій новий знайдений вільний час, ознайомившись із PHP, WordPress, JavaScript, CSS та / або mySQL ... чим більше ви дізнаєтесь про них, тим швидше ви все зробите.
  • Оновіть скелети плагінів, теми та дочірні теми, коли знайдете речі, які слід вдосконалити. Незалежно від того, наскільки ви гарні, якщо ви продовжуєте вчитися, ви знайдете вдосконалення.

І якщо ви зробите все вищезазначене , ви побачите, що відповідь Чіпа буде тоді не тільки ідеальним, він стане оптимальним.


3

Проста відповідь така:

Чи залежить код від будь-якої функціональності, вбудованої в певну тему? Якщо так, то поставте тему.

Ви хочете, щоб цей код передавався між сайтами та між темами? Якщо так, то вставте плагін.

Якщо відповідь на те і інше сказане "ні", тоді сфотографуйте сайт 5 років у майбутньому, коли настане час перепроектувати. Чи є функція коду, який ви пишете, щось, що переживе наступне оновлення дизайну? Якщо так, вставте плагін.

Крім того, якщо ви не використовуєте дочірні теми і плануєте оновити тему, я б також запропонував використовувати плагін.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.