Où mettre mon code: plugin ou functions.php?
-
-
Jeme demande ce qui constituerait desfaits auxfins de cette question.Lapersonne A dit que CPT va dans leplugin,lapersonne B dit que CPT va dans lethème.Comment seprocurer unfaitpour valider l'une des opinions?Celapourrait être dangereusementproche de «non constructif».I wonder what would constitute facts for the purpose of this question. Person A says CPT go in plugin, Person B says CPT go in theme. How can we procure a fact to validate one of opinions? This might be dangerously close to "not constructive".
- 0
- 2012-11-18
- Rarst
-
6 réponses
- votes
-
- 2012-11-19
Je commenceraispar cette question: Lafonctionnalitéest-elle liée à la présentation du contenu,ou à la génération/gestion du contenu,ou du site,ou de l'identité de l'utilisateur?
Si lafonctionnalité n'estpas spécifiquement liée à la présentation du contenu ,alorselleest carrément dans leterritoire duplug-in. Cette listeest longue:
- Modification desfiltres WPprincipaux (contenu
wp_head
,tel que liens canoniques,générateuret autresméta HTML,etc. - Favicon du site
- Codes courtspost-contenu
- Publier des liens departage
- Scripts depied depage Google Analytics (et similaires)
- Outils/contrôles SEO
- etc.
Si lafonctionnalité est liée à la présentation du contenu ,alors c'est un candidat pour êtreinclus dans lethème. À ce stade,je reviendrais au critère de changement dethème de @ Raf912 : manqueriez-vous lafonctionnalité lorsque vous changez dethème? Si la réponse à cette questionest non ,lafonctionnalité appartient authème. Quelquesexemples:
- Suppression/remplacement du CSS de WP Core Gallery
- Filtrage de la longueur de l'extrait de l'article,dutexte "En savoirplus",etc.
- Tout ce quiestmisen œuvre via
add_theme_support()
(I supposons que celui-ci soit évident) - CSSpersonnalisé
Normalement,ces deux questionsfourniront une ligne de différenciation assez claire; cependant,il y a desexceptions.
Types depublicationpersonnalisés
Lestypes depublicationpersonnalisés,parexemple,sont unpeu un hybride unique degénérationet deprésentation de contenu,étant donné lafaçon dont la hiérarchie desmodèlesfonctionnepour untype depublication unique pages d'index d'archive et pages demessage unique . L'aspect degénération de contenu des CPT lesplaceraitnormalement carrément dans Plugin Territory; cependant,lespluginsne peuventpas définir depages demodèle qui s'intègrentintrinsèquement dans la conception/lamiseen page/le style d'unthème donné (enparticulier si le CPT affiche un autretitre/contenu/méta habituel,ouest associé à destaxonomiespersonnalisées).
À longterme,la solution à cette disparité,àmon humble avis,est d'avoir une convention/consensus standardpour la définition des CPTpour destypes de contenu donnés (annoncesimmobilières,événements de calendrier,produits de commerce électronique,livre/médiathèqueentrées,etc.). De cettefaçon,le contenugénérépar l'utilisateur resteraitportableentre lesthèmes quiimplémentent la définition standard/convention d'un CPT donné,tandis que les développeurs dethèmes conservent laflexibilité de définir la conception/lamiseen page/le style de ce CPT dans lesfichiers demodèle dethème.
Liens vers les réseaux sociaux
Demême,je diraisnormalement que les liens deprofil demédias sociaux,qui sont devenuspresque omniprésents dans lesthèmes actuels,sont desterritoires deplugins,carilsn'ont rien à voir avec la présentation du contenu. Lameilleure solution serait que cesprofils soient définis quelquepart dans lenoyau; cependant,iln'existe actuellement aucunmoyen standard/consensuelpour définir ces liens. Sont-ilsmieux définis auniveau de la configuration du site ou sur unebasepar utilisateur? Sipar utilisateur,laméta de quel utilisateurestexposée dans lemodèle?etc.
Encore unefois,à longterme,la solution à cette disparitéest soit que lenoyau définisse où ces liens sont définis,soit que la communauté des développeurs dethèmes développe sonpropre consensus. En attendant,iln'y a vraiment rien d'autre àfaire que de lesgarder définis dans chaquethème.
I would start with this question: Is the functionality related to presentation of content, or with generation/management of content, or of the site, or of the user identity?
If the functionality is not related specifically to presentation of content, then it is squarely within Plugin Territory. This list is long:
- Modifying core WP filters (
wp_head
content, such as canonical links, generator and other HTML meta, etc - Site Favicon
- Post-content shortcodes
- Post sharing links
- Google Analytics (and similar) footer scripts
- SEO tools/controls
- etc.
If the functionality is related to presentation of content, then it is a candidate for being included in the Theme. At this point, I would revert to @Raf912's Theme-switch criterion: would you miss the functionality when you switch Themes? If the answer to that question is no, then the functionality belongs in the Theme. Some examples:
- Removing/overriding the WP core Gallery CSS
- Filtering post excerpt length, "read more" text, etc.
- Anything implemented via
add_theme_support()
(I suppose this one should be obvious) - Custom CSS
Normally, these two questions will provide a fairly clear line of differentiation; however, there are exceptions.
Custom Post Types
Custom Post Types, for example, are a bit of a unique hybrid of content generation and presentation, given the way the Template Hierarchy works for single-post-type archive index pages and single post pages. The content-generation aspect of CPTs would normally place them squarely in Plugin Territory; however, Plugins cannot define template pages that inherently fit into the design/layout/style for any given Theme (especially if the CPT displays other than the usual Title/Content/Meta, or has custom taxonomies associated with it).
Long-term, the solution to this disparity, IMHO, is to have a standard convention/consensus for the definition of CPTs for given types of content (real estate listings, calendar events, e-commerce products, book/media library entries, etc.). That way, user-generated content would remain portable between Themes that implement the standard/convention definition of a given CPT, while Theme developers retain the flexibility to define the design/layout/style of that CPT in the Theme template files.
Social Media Links
Similarly, I would normally say that social media profile links, ave become all but ubiquitous in current Themes, are Plugin Territory, because they have nothing to do with presentation of content. The best solution would be for these profiles to be defined somewhere in core; however, there is currently no standard/consensus means of defining these links. Are they best-defined at the site-setting level, or on a per-user basis? If per-user, which user's meta gets exposed in the template? etc.
So again, long-term, the solution to this disparity is for either core to define where these links are defined, or else for the Theme developer community to develop its own consensus. In the meantime, there's really nothing for it but to keep them defined within each Theme.
-
`add_theme_support ('automatic-feed-links');`n'estpas deprésentation.Maisilest [requispar les lignes directrices duthème] (http://codex.wordpress.org/Theme_Review#Theme_Features).Pourquoiest-ilnécessaire deperdre cettefonctionnalité après un changement dethème?`add_theme_support( 'automatic-feed-links' );` is not presentational. But it is [required by the theme guidelines](http://codex.wordpress.org/Theme_Review#Theme_Features). Why is it a necessary risk to loose this functionality after a theme switch?
- 0
- 2012-11-19
- fuxia
-
Tout ce quiestimplémenté via `add_theme_support ()`ne peut êtreimplémenté que via lethème.L'utilisation de `add_theme_support ('automatic-feed-links')` dans lethème *garantiten fait * uneexpérience cohérente d'unthème à l'autre,puisque les liens defluxgénérés seront lesmêmes.Anything that is implemented via `add_theme_support()` can only be implemented via the Theme. Using `add_theme_support( 'automatic-feed-links' )` within the Theme actually *ensures* a consistent experience from Theme to Theme, since the feed links generated will be the same.
- 1
- 2012-11-19
- Chip Bennett
-
Jepense qu'ilestmalnommé: les liens d'alimentationne sontpas deprésentation.Si lethème suivantn'appellepas cettefonction,l'utilisateurperdra les liens deflux.Et vouspouvez l'ajouterparplugin sans aucunproblème.C’estpourquoije suis confus à ce sujet.:)I think it is misnamed: Feed links are not presentational. If the next theme doesn’t call that function the user will lose the feed links. And you can add that per plugin without any problem. That’s why I am confused about it. :)
- 4
- 2012-11-19
- fuxia
-
Vous savez: c'est unbonpoint.:)You know: that's a good point. :)
- 1
- 2012-11-19
- Chip Bennett
-
- 2012-11-18
Untestfacile où le codeest lemieuxplacé:
- écrivez le code dans lefunctions.php
- Changer dethème
-
lafonctionnalité vousmanque-t-elle,leblogne fonctionne-t-ilpas correctement ou desfragments de l'ancienthème (parexemple des codes courts) sont-ils restés?
-
oui:mettez-le dans unplugin
-
non: laissez-le dansfunctions.php
-
Exemples: écrivez un shortcode.Après avoir changé dethème,les codes courts simples sont laissés dans vosmessages.Il sera doncmieuxplacé dans unplugin.
Ecrivez unefonctionpour lister les derniers commentaires.Après avoir changé dethème,tout vabien carpeut-être que l'autrethème a unefonction équivalente.
Cela dépend vraiment du codeet de ce qu'ilfera.Certains codesn'influencent que le style ou le contenu duthème,d'autresmodifient les articles deblog.
An easy test where the code is best placed:
- write the code into the functions.php
- switch theme
do you miss the functionality, is the blog not proper working or fragments of the old theme (e.g. shortcodes) are left?
yes: put it into a plugin
no: leave it in functions.php
Examples: Write a shortcode. After switching the theme, the plain shortcodes are left in your posts. So it will be better placed in a plugin.
Write a function to list the last comments. After switching the theme, everything is ok because maybe the other theme have an equivalent function.
It really depends on the code and what it will do. Some code only influence the styling or content of the theme, some others will modifiy blog posts.
-
+1 Si le codeest spécifique authème,mettez-le `functions.php`.S'il doit s'appliquer àplus d'unthème,mettez-le dans unplugin.+1 If the code is specific to the theme, put it is `functions.php`. If it needs to apply to more than one theme, put it in a plugin.
- 11
- 2012-11-18
- s_ha_dum
-
- 2012-12-08
Jene pensepas qu'il y ait une réponsefacile à cette question,maisje parie quenouspourrionsfaire un organigrammepour aider à la décision. Voici un aperçu d'untel organigramme,quipeutet doit être développé. Commentaire avec des suggestions!
- Ce code doit-il être hébergé sur uneinstallation sur un seul site de WordPress?
- Oui - Lethème du site change-t-il uniquement avec des refontesmajeureset des changements defonctionnalités?
- Oui - Le codeen questionest-il spécifique à cette conception actuelle ?
- Oui:functions.php
- Non:plug-in
- Non (cela change souvent ou à volonté) - Plugin
- Oui - Le codeen questionest-il spécifique à cette conception actuelle ?
- Non (Multsisite) - Hébergez-vous l'installationmultisite OU s'agit-il d'une solutionmultisite hébergée qui autorise lesplugins?
- Oui: lafonctionnalitéen questionest-elle spécifique à ce site oupeut/doit-elle être utiliséepar d’autres sites du réseau?
- Spécifique à ce site:functions.php
- Partagéentreplusieurs sites - Voulez-vous leforcer sur chaque site?
- Oui: Plugin,stocké dans le répertoiremu-plugins ou activépar le réseau
- Non: s'agit-il d'un réseau de sites indépendants ? (parexemple différents clients)
- Oui: Serait-cemauvais ounonprofessionnel si le client A voyait ou activait leplugin que vous avez écritpour les clients B,Cet D? (parexemple,peut-être que celabriserait le site ouprovoquerait desfonctionnalitésindésirables)
- Oui:functions.php
- Non:plug-in
- Non:probablement unplugin
- Oui: Serait-cemauvais ounonprofessionnel si le client A voyait ou activait leplugin que vous avez écritpour les clients B,Cet D? (parexemple,peut-être que celabriserait le site ouprovoquerait desfonctionnalitésindésirables)
- Non (hébergépar un service comme VIP quin'autorisepas lesplugins): utilisezfunctions.php
- Oui: lafonctionnalitéen questionest-elle spécifique à ce site oupeut/doit-elle être utiliséepar d’autres sites du réseau?
- Oui - Lethème du site change-t-il uniquement avec des refontesmajeureset des changements defonctionnalités?
- Thèmesparents -parfois avec desfonctionnalitéspartagées,il seraitpréférable de créer unthèmeparentet deplacer lafonctionnalité dans lefichierfunctions.php duthèmeparent.
- Les répertoires deplugins degrandesinstallationsmultisitespeuvent rapidement devenirindisciplinés,c'estpourquoiilestparfoispréférable de dupliquer lesfonctionnalitéspartagées utiliséespar unfaiblepourcentage de sites (parexemple & lt; 1%) dans lesfichiersfunctions.php.
I don't think there's an easy answer to this question, but I bet we could make a flow chart to help with the decision. Here's a rough outline of such a flow chart, which can and should be expanded. Comment with suggestions!
- Is this code to be hosted on a single-site installation of WordPress?
- Yes - Does the site's theme only change with major redesigns and shifts in functionality?
- Yes - Is the code in question specific to this current design?
- Yes: functions.php
- No: Plugin
- No (it changes often or at a whim) - Plugin
- Yes - Is the code in question specific to this current design?
- No (Multsisite) - Are you hosting the multisite installation OR is it a hosted multisite solution that allows plugins?
- Yes: Is the functionality in question specific to this site, or can/should it be used by other sites in the network?
- Specific to this site: functions.php
- Shared amongst multiple sites - Do you want to force it on every site?
- Yes: Plugin, stored in mu-plugins directory or network-activated
- No: Is this a network of unrelated sites? (e.g. different clients)
- Yes: Would it be bad or unprofessional if client A saw or activated the plugin you wrote for clients B, C, and D? (e.g. maybe it would break the site or cause undesirable functionality)
- Yes: functions.php
- No: Plugin
- No: Probably plugin
- Yes: Would it be bad or unprofessional if client A saw or activated the plugin you wrote for clients B, C, and D? (e.g. maybe it would break the site or cause undesirable functionality)
- No (hosted by a service like VIP that doesn't allow plugins): use functions.php
- Yes: Is the functionality in question specific to this site, or can/should it be used by other sites in the network?
- Yes - Does the site's theme only change with major redesigns and shifts in functionality?
- Parent themes -- sometimes with shared functionality it would be better to make a parent theme and put the functionality in the parent theme's functions.php file.
- Plugin directories of large multisite installations can quickly become unruly, so sometimes shared functionality used by a low percentage of sites (e.g. < 1%) would be best to duplicate in functions.php files.
-
- 2014-02-04
De là Thèmes VSplugins
Ajoutez du codepersonnalisé à unthèmeenfant afin que lorsque vousmettez àjour lethèmeparent,votre codepersonnaliséne soitpasperdu.
Vouspouvez également créer unplugin spécifique au site qui contient égalementtout votre codepersonnalisé.
En ce qui concerne l'écriture de codepar rapport auxplugins,vouspouvez utiliser despluginset lesfonctions,maispour laplupart de ce que vous voulez,le codagemanuelest lemeilleur carilestplusfacile àmodifier,sauf dans certains cas comme lesméta-boîtes où vouspouvezenvisager d'utiliser unplugin sauf si vous êtes un développeur dethèmes.
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
- Ajouter unnouveautype demessagepersonnalisé - Code
- Ajouter denouveaux champs aux utilisateurs - Code ci-dessus
- Ajouter denouveaux widgets - Code
- Ajouter despermalienspersonnalisés - Paramètres depermalien WordPress
From here Themes VS Plugins
Add custom code to a child theme so when you update the parent theme, your custom code is not lost.
You can also create a site specific plugin which contains all your custom code as well.
As far as writing code versus plugins, you can use plugins to and the functions however for most of what you want, hand coding is the best as its easier to modify except in some cases like meta boxes where you may consider using a plugin unless you're a theme developer.
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
- Add new custom post type - Code
- Add new fields to the Users - Code Above
- Add new widgets - Code
- Add custom permalinks - WordPress Permalink Settings
-
- 2015-01-28
Je sais que c'est un chevalmortet que Chip l'a àpeuprès couvert,maisje voulais ajouter quelques réflexions.
Si vousfaites uneprogrammation vivante et que vous vous retrouvez àtravailler sur des sites wordpress dans des délaisimpartis,vous constaterez que celaprend vraiment dutemps.
Leplus souvent,en particulierpour ceux qui débutent,ilestbeaucoupplus rapideet plus simple d'ajouter simplement ce dont vous avezbesoin dans unthèmeet de l'appelerterminé.
Cela étant dit, si voustravaillez sur wordpress sur unebase semi-régulière,vous devriez sérieusementenvisager defaire ce qui suit :
- Créer un squelette deplug-in
Cela devraitgérertout ce que vous aurezgénéralementbesoin defaire avec unplugin,y compris l'activation,la désactivation,lamise àjour de version,la création depanneaux d'administrationet la désinstallation.
Si vousprenez letemps de lefaire,voustrouverez:
- L'ajout defonctionnalités via despluginsne prendplusbeaucoup detemps
- Vouspouvez commencer à créer une liste solide deplugins à réutiliser sur d'autresprojets sinécessaire,ce qui vousfaitgagnerbeaucoup detemps à longterme.
- Vouspouvez les rendre accessibles aupublic si vous souhaitez une visibilité supplémentaire
Vouspouvez désormais créer des éléments correctement et mener àbien vosfutursprojetsplus rapidement.
- Créer un squelette dethème
Cela devraitgérertout ce quiestgénéralementnécessaire dans unthème:
- Unefeuille de styleprincipale contenant les styles que vous utilisez couramment (réinitialisations,etc.)
- Unfichierindex.php approprié,géranttout ce dont vous avezbesoinpourn'importe quelmodèle
- Unfichierfunctions.php - vousne l'utiliserezpas autant,maisil seratoujours utile.
Unefois que vous avezterminé,créez un squelette dethèmeenfant qui utilise votrethèmeprincipal.
- Ajoutez lafeuille de styleen faisant référence à votrethèmeparent.
- Ajoutez lefichierfunctions.php
Unefois ces deux chosesfaites,la création denouveaux sitespour lesgens devientbeaucoupplus rapide.
Si vousfaites ce quiprécède,vouspouvez alorstravailler sur les éléments suivants:
- Passez votrenouveautemps libre à vousfamiliariser avec PHP,WordPress,JavaScript,CSSet/oumySQL ...plus vousen apprenezplus vite vous accomplirez les choses.
- Mettez àjour vos squelettes deplug-in,dethèmeet dethèmeenfant àmesure que voustrouvez des choses que vous devriez améliorer. Même si vous êtesbon,si vous continuez à apprendre,voustrouverez des améliorations à apporter.
Et,si vousfaites tout ce quiprécède ,vous constaterez que la réponse de Chip sera alorsnon seulementidéale,mais aussi optimale.
I know this is a dead horse and that Chip has pretty much covered it, but wanted to add a few thoughts.
If you make a living programming and find yourself working on wordpress sites under deadlines, you are going to find that it really comes down to time.
More often than not, especially for those just starting out, it is much faster and simpler to just add whatever you need into a theme and call it done.
That being said, if you work on wordpress on a semi regular basis, you should seriously consider doing the following:
- Build out a plugin skeleton
This should handle everything that you will commonly need to do with a plugin, including activation, deactivation, version updating, building admin panels, and uninstalling.
If you make the time to do this, you will find:
- It no longer takes much extra time to add functionality via plugins
- You can start building a solid list of plugins to re-use on other projects as needed, saving yourself a lot of time in the long run.
- You can make them publicly available if you want extra visibility
You can now build things out properly and get future projects done more quickly.
- Build out a theme skeleton
This should handle everything that is commonly needed in a theme:
- A core style sheet containing styles that you use commonly (resets, etc.)
- A proper index.php file, handling everything you need for any template
- A functions.php file - you won't use it nearly as much, but it will still come in handy.
Once you have that done, build out a child theme skeleton that uses your primary theme.
- Add the stylesheet, referencing your parent theme.
- Add the functions.php file
Once you have these two things done, creating new sites for people becomes much faster.
If you do the above, you can then work on the following:
- Spend your new found free time getting more familiar with PHP, WordPress, JavaScript, CSS, and/or mySQL ... the more you learn of these the faster you will get things done.
- Update your plugin, theme, and child theme skeletons as you find things you should improve. No matter how good you are, if you keep learning you will find improvements to be made.
And, if you do all of the above, you will find that Chip's answer will then not only be ideal, it will become optimal.
-
- 2015-10-26
La réponse simpleest la suivante.
Le code dépend-il de l'une desfonctionnalitésintégrées à unthème spécifique?Si oui,insérez unthème.
Voulez-vous que ce code soittransférableentre les siteset entre lesthèmes?Si oui,insérez unplugin.
Si la réponseestnon aux deux questions ci-dessus,imaginez le site dans 5 ans,aumoment de la refonte.Lafonction du code que vous écrivezest-elle quelque chose qui survivra à laprochainemise àjour de conception?Si oui,insérez unplugin.
Deplus,si vousn'utilisezpas dethèmesenfantset que vousprévoyez demettre àjour lethème,je vous suggère également d'utiliser unplugin.
The simple answer is this..
Is the code dependent on any of the functionality built into a specific theme? If yes, then put in a theme.
Do you want this code to be transferable between sites and between themes? If yes, then put in a plugin.
If the answer is no to both of the above, then picture the site 5 years in the future, when it's time for a redesign. Is the function of the code you're writing something that will survive the next design update? If yes, put in a plugin.
Also, if you're not using child themes and you plan to update the theme, I would also suggest you use a plugin.
Existe-t-il un schémafacile à comprendre pour décider queltype de code appartient à unplugin ou au
functions.php
duthème?Il y a plusieurs cas et denombreux débats sur ce sujet,principalementparce qu'il y a desidéesfausses sur lefonctionnementinterne de WordPress. Je demande une réponsebasée sur desfaits,pas sur des opinions.
Il devraitexpliquer commentgérer cespoints (etprobablementplus):
add_theme_support( 'automatic-feed-links' );
meta
personnalisésIl y a souvent des avantageset desinconvénients des deux côtés. Notre question lapluspopulaire Meilleure collection de codepour vosfonctions.php a reçu denombreuxextraits de code comme réponses qui sont aumoins discutables.
Nous avonsbesoin de critères qu'un débutantpeut comprendre,peut-être une liste de contrôle - avec des raisons.
Voir aussi la question connexe de Chip Bennett surnotreméta-site: Questions demandant spécifiquement une solution & quot; sansplugin & quot;
En relation: Où dois-jeplacer lesextraits de code quej'aitrouvésici ou ailleurs sur le Web?