Di mana saya harus meletakkan kode: plugin atau functions.php?

86

Apakah ada skema yang mudah dipahami untuk memutuskan jenis kode apa yang dimiliki plugin atau temanya functions.php?

Ada yang banyak kasus dan banyak perdebatan tentang topik itu, terutama karena ada beberapa kesalahpahaman tentang cara kerja bagian dalam WordPress. Saya meminta jawaban berdasarkan fakta, bukan pada pendapat.

Itu harus menjelaskan bagaimana menangani poin-poin ini (dan mungkin lebih):

Sering ada pro dan kontra untuk kedua belah pihak. Pertanyaan kami yang paling populer. Kumpulan Kode Terbaik untuk file functions.php Anda mendapatkan banyak potongan kode sebagai jawaban yang setidaknya dapat diperdebatkan.
Kami membutuhkan kriteria yang bisa dipahami oleh pemula, mungkin daftar periksa - dengan alasan.

Lihat juga pertanyaan terkait oleh Chip Bennett di situs meta kami: Pertanyaan khusus yang meminta solusi "tanpa plugin"

Terkait: Di mana saya menempatkan potongan kode yang saya temukan di sini atau di tempat lain di web?

fuxia
sumber
Saya ingin tahu apa yang merupakan fakta untuk tujuan pertanyaan ini. Orang A mengatakan CPT masuk plugin, Orang B mengatakan CPT masuk tema. Bagaimana kita bisa mendapatkan fakta untuk memvalidasi salah satu pendapat? Ini mungkin sangat dekat dengan "tidak konstruktif".
Paling lambat

Jawaban:

72

Saya akan mulai dengan pertanyaan ini: Apakah fungsi terkait dengan presentasi konten, atau dengan generasi / manajemen konten, atau situs, atau identitas pengguna?

Jika fungsionalitas tidak terkait khusus dengan presentasi konten , maka itu tepat di dalam Wilayah Plugin. Daftar ini panjang:

  • Memodifikasi filter WP inti ( wp_headkonten, seperti tautan kanonik, generator, dan meta HTML lainnya, dll
  • Situs Favicon
  • Kode singkat pos-konten
  • Posting tautan berbagi
  • Google Footer (dan sejenisnya) skrip footer
  • Alat / kontrol SEO
  • dll.

Jika fungsi terkait dengan presentasi konten , maka itu adalah kandidat untuk dimasukkan dalam Tema. Pada titik ini, saya akan kembali ke kriteria Theme-switch @ Raf912 : apakah Anda akan kehilangan fungsionalitas ketika Anda mengganti Tema? Jika jawaban untuk pertanyaan itu adalah tidak , maka fungsionalitasnya menjadi milik Tema. Beberapa contoh:

  • Menghapus / mengganti CSS Galeri inti WP
  • Memfilter panjang kutipan kutipan, teks "baca lebih lanjut", dll.
  • Apa pun yang diterapkan melalui add_theme_support()(saya kira yang ini harus jelas)
  • CSS khusus

Biasanya, dua pertanyaan ini akan memberikan garis diferensiasi yang cukup jelas; Namun, ada beberapa pengecualian.

Jenis Posting Kustom

Jenis Posting Kustom, misalnya, adalah sedikit hibrida yang unik dari pembuatan konten dan presentasi, mengingat cara Hierarki Templat bekerja untuk halaman indeks arsip tipe posting tunggal dan halaman posting tunggal . Aspek pembuatan konten CPT biasanya menempatkannya tepat di Wilayah Plugin; namun, Plugin tidak dapat menentukan halaman templat yang secara inheren sesuai dengan desain / tata letak / gaya untuk setiap Tema tertentu (terutama jika CPT menampilkan selain Judul / Konten / Meta biasa, atau memiliki taksonomi khusus yang terkait dengannya).

Jangka panjang, solusi untuk perbedaan ini, IMHO, adalah memiliki konvensi / konsensus standar untuk definisi CPT untuk jenis konten tertentu (daftar real estat, acara kalender, produk e-commerce, entri perpustakaan buku / media, dll. .). Dengan cara itu, konten yang dibuat pengguna akan tetap portabel antara Tema yang menerapkan definisi standar / konvensi dari CPT yang diberikan, sementara pengembang Tema mempertahankan fleksibilitas untuk menentukan desain / tata letak / gaya CPT dalam file template Tema.

Tautan Media Sosial

Demikian pula, saya biasanya mengatakan bahwa tautan profil media sosial, yang sudah ada di mana-mana dalam Tema saat ini, adalah Wilayah Plugin, karena tidak ada hubungannya dengan penyajian konten. Solusi terbaik adalah agar profil ini didefinisikan di suatu tempat di inti; namun, saat ini tidak ada sarana standar / konsensus untuk mendefinisikan tautan ini. Apakah mereka didefinisikan terbaik di tingkat pengaturan situs, atau berdasarkan per pengguna? Jika per-pengguna, meta pengguna mana yang terpapar dalam templat? dll.

Jadi sekali lagi, dalam jangka panjang, solusi untuk perbedaan ini adalah baik bagi inti untuk menentukan di mana tautan-tautan ini ditentukan, atau jika tidak bagi komunitas pengembang Tema untuk mengembangkan konsensusnya sendiri. Sementara itu, benar-benar tidak ada apa-apa selain membuat mereka tetap didefinisikan dalam setiap Tema.

Chip Bennett
sumber
add_theme_support( 'automatic-feed-links' );tidak presentasional. Tapi itu diperlukan oleh pedoman tema . Mengapa risiko yang diperlukan untuk kehilangan fungsi ini setelah beralih tema?
fuxia
1
Apa pun yang diimplementasikan via add_theme_support()hanya dapat diimplementasikan melalui Tema. Penggunaan add_theme_support( 'automatic-feed-links' )di dalam Tema sebenarnya memastikan pengalaman yang konsisten dari Tema ke Tema, karena tautan umpan yang dihasilkan akan sama.
Chip Bennett
4
Saya pikir itu salah nama: Tautan feed tidak bersifat presentasi. Jika tema berikutnya tidak memanggil fungsi itu, pengguna akan kehilangan tautan umpan. Dan Anda dapat menambahkannya per plugin tanpa masalah. Itu sebabnya saya bingung tentang itu. :)
fuxia
1
Anda tahu: itu poin yang bagus. :)
Chip Bennett
50

Tes mudah di mana kode ditempatkan:

  • tulis kode ke dalam functions.php
  • beralih tema
  • apakah Anda melewatkan fungsionalitasnya, apakah blognya tidak berfungsi dengan baik atau fragmen dari tema lama (mis. shortcode) ditinggalkan?

    • ya: masukkan ke dalam plugin

    • tidak: tinggalkan di functions.php

Contoh: Tulis kode pendek. Setelah beralih tema, kode pendek biasa dibiarkan dalam posting Anda. Jadi akan lebih baik ditempatkan di plugin.

Tulis fungsi untuk menuliskan komentar terakhir. Setelah beralih tema, semuanya baik-baik saja karena mungkin tema lain memiliki fungsi yang setara.

Itu benar-benar tergantung pada kode dan apa yang akan dilakukan. Beberapa kode hanya memengaruhi gaya atau konten tema, sebagian lainnya akan mengubah posting blog.

Ralf912
sumber
11
+1 Jika kode tersebut khusus untuk tema, cantumkan functions.php. Jika perlu diterapkan ke lebih dari satu tema, masukkan ke dalam plugin.
s_ha_dum
18

Saya tidak berpikir ada jawaban yang mudah untuk pertanyaan ini, tetapi saya yakin kita bisa membuat diagram alur untuk membantu dengan keputusan. Berikut ini garis besar kasar dari diagram alir tersebut, yang dapat dan harus diperluas. Beri komentar dengan saran!

  • Apakah kode ini di-host pada instalasi satu situs WordPress?
    • Ya - Apakah tema situs hanya berubah dengan desain ulang utama dan perubahan fungsionalitas?
      • Ya - Apakah kode tersebut khusus untuk desain saat ini ?
        • Ya: functions.php
        • Tidak: Plugin
      • Tidak (sering berubah atau sambil lalu) - Plugin
    • Tidak (Multsisite) - Apakah Anda meng-hosting instalasi multisite ATAU apakah ini solusi multisite yang di-host yang memungkinkan plugin?
      • Ya: Apakah fungsionalitas yang dimaksud khusus untuk situs ini , atau dapatkah itu digunakan oleh situs lain di jaringan?
        • Khusus untuk situs ini: functions.php
        • Dibagi di antara banyak situs - Apakah Anda ingin memaksanya di setiap situs?
          • Ya: Plugin, disimpan di direktori mu-plugins atau diaktifkan jaringan
          • Tidak: Apakah ini jaringan situs yang tidak terkait ? (mis. klien yang berbeda)
            • Ya: Apakah buruk atau tidak profesional jika klien A melihat atau mengaktifkan plugin yang Anda tulis untuk klien B, C, dan D? (mis. mungkin itu akan merusak situs atau menyebabkan fungsi yang tidak diinginkan)
              • Ya: functions.php
              • Tidak: Plugin
            • Tidak: Mungkin plugin
      • Tidak (di-host oleh layanan seperti VIP yang tidak mengizinkan plugin): gunakan functions.php
Beberapa pemikiran lain yang saya tidak tahu bagaimana menyesuaikannya di sini:

  • Tema induk - terkadang dengan fungsionalitas bersama, lebih baik membuat tema induk dan meletakkan fungsionalitas dalam file functions.php tema induk.
  • Direktori plugin dari instalasi multisite besar dapat dengan cepat menjadi susah diatur, sehingga terkadang fungsionalitas yang digunakan bersama oleh persentase situs yang rendah (mis. <1%) akan lebih baik untuk digandakan dalam file functions.php.
Matthew Boynes
sumber
6

Dari sini Tema VS Plugins

Tambahkan kode khusus ke tema anak sehingga ketika Anda memperbarui tema orang tua, kode kustom Anda tidak hilang.

Anda juga dapat membuat plugin khusus situs yang juga berisi semua kode khusus Anda.

Sejauh menulis kode versus plugin, Anda dapat menggunakan plugin untuk dan fungsi namun untuk sebagian besar yang Anda inginkan, pengkodean tangan adalah yang terbaik karena lebih mudah untuk dimodifikasi kecuali dalam beberapa kasus seperti kotak meta di mana Anda dapat mempertimbangkan menggunakan plugin kecuali jika Anda adalah pengembang tema.

 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. Tambahkan jenis pos kustom baru - Kode
  2. Tambahkan bidang baru ke Pengguna - Kode Di Atas
  3. Tambahkan widget baru - Kode
  4. Tambahkan permalinks khusus - Pengaturan Permalink WordPress
Brad Dalton
sumber
5

Saya tahu ini adalah kuda mati dan Chip telah menutupinya, tetapi ingin menambahkan beberapa pemikiran.

Jika Anda membuat program hidup dan menemukan diri Anda bekerja di situs wordpress di bawah tenggat waktu, Anda akan menemukan bahwa itu benar-benar turun ke waktu.

Lebih sering daripada tidak, terutama bagi mereka yang baru memulai, itu jauh lebih cepat dan sederhana untuk hanya menambahkan apa pun yang Anda butuhkan ke dalam tema dan menyebutnya selesai.

Yang sedang berkata, jika Anda bekerja di wordpress secara setengah reguler, Anda harus serius mempertimbangkan melakukan hal berikut :


  1. Buat kerangka plugin

Ini harus menangani semua yang biasanya perlu Anda lakukan dengan sebuah plugin, termasuk aktivasi, penonaktifan, pembaruan versi, membuat panel admin, dan mencopot pemasangan.

Jika Anda meluangkan waktu untuk melakukan ini, Anda akan menemukan:

  • Tidak lagi membutuhkan banyak waktu ekstra untuk menambahkan fungsionalitas melalui plugin
  • Anda dapat mulai membuat daftar plugin yang solid untuk digunakan kembali pada proyek lain sesuai kebutuhan, menghemat banyak waktu dalam jangka panjang.
  • Anda dapat membuatnya tersedia untuk umum jika Anda ingin visibilitas ekstra

Anda sekarang dapat membangun semuanya dengan benar dan menyelesaikan proyek di masa depan dengan lebih cepat.


  1. Buat kerangka tema

Ini harus menangani semua yang biasanya dibutuhkan dalam sebuah tema:

  • Lembar gaya inti berisi gaya yang biasa Anda gunakan (reset, dll.)
  • File index.php yang tepat, menangani semua yang Anda butuhkan untuk template apa pun
  • File functions.php - Anda tidak akan menggunakannya hampir sebanyak itu, tetapi masih akan berguna.

Setelah selesai, buat kerangka tema anak yang menggunakan tema utama Anda.

  • Tambahkan stylesheet, referensi tema orang tua Anda.
  • Tambahkan file functions.php

Setelah Anda menyelesaikan dua hal ini, membuat situs baru untuk orang menjadi lebih cepat.


Jika Anda melakukan hal di atas, Anda dapat mengerjakan hal-hal berikut:

  • Habiskan waktu luang Anda yang baru ditemukan untuk lebih mengenal PHP, WordPress, JavaScript, CSS, dan / atau mySQL ... semakin banyak Anda mempelajari ini, semakin cepat Anda menyelesaikan sesuatu.
  • Perbarui plugin, tema, dan kerangka tema anak saat Anda menemukan hal-hal yang harus Anda tingkatkan. Tidak peduli seberapa baik Anda, jika Anda terus belajar Anda akan menemukan perbaikan yang harus dilakukan.

Dan, jika Anda melakukan semua hal di atas , Anda akan menemukan bahwa jawaban Chip tidak hanya ideal, tetapi juga akan menjadi optimal.

Privateer
sumber
3

Jawaban sederhananya adalah ini ..

Apakah kode tergantung pada salah satu fungsi yang dibangun ke dalam tema tertentu? Jika ya, masukkan tema.

Apakah Anda ingin kode ini dapat ditransfer antara situs dan antar tema? Jika ya, masukkan plugin.

Jika jawabannya adalah tidak untuk kedua hal di atas, maka gambar situs 5 tahun di masa depan, ketika saatnya untuk mendesain ulang. Apakah fungsi kode Anda sedang menulis sesuatu yang akan bertahan pembaruan desain berikutnya? Jika ya, masukkan plugin.

Juga, jika Anda tidak menggunakan tema anak dan Anda berencana untuk memperbarui tema, saya juga menyarankan Anda menggunakan plugin.

Komputasi CO4
sumber