ご存知の方も多いと思うが、先週、Syed BalkhiはWordCamp Raleigh 2012に参加した。その中で、彼のあるツイートが大きな議論を巻き起こしました。この投稿では、WordPressカスタム投稿タイプはfunctions.phpファイルに属するのか、それともプラグインに属するのかについて、創設者のSyed Balkhiが議論します。以下は、この議論の発端となったツイートです:
Don't add Custom Post Types in functions.php -> You should ALWAYS use a site-specific plugin – http://t.co/bebYXq2F #wcraleigh
— WordPress Beginner (@wpbeginner) November 4, 2012
このツイートの後、WordPressコミュニティで評判の高い多くの人々が意見を述べました。会話の全文はこちらでご覧いただけます。Curtis McHaleはさらに一歩踏み込んで、彼の新規ブログ投稿でこのトピックについて詳しく述べている。
Twitterでの会話は、いくつかの素晴らしい点を提起した。
引数の要約
プラグインの引数:テーマを変更しても、ユーザーは常にデータを保持できる。見栄えは悪くなるかもしれないが、データはそのまま残る。
Functions.phpの引数:デザインのないデータは意味がない。ユーザーをさらに混乱させる。
あなたはどちらの意見に賛成ですか?どちらの側にも問題があるのは明らかですが、2つの悪のうちどちらが少ないでしょうか?
ここでは、カスタム投稿タイプは常に サイト固有のプラグインか、まったく別のプラグインに入れるべきだと考える理由を説明します。
データ万歳
カスタム投稿タイプはデータです。ほとんどの場合、データは現在のデザインよりも長持ちします。何度かテーマを変更した経験から、私たちはこの言葉をはっきりと理解しています。投稿、ページ、リンク、添付ファイル、リビジョンはすべてWordPressにビルトインされている投稿タイプです。さらに、Books、Testimonials、Dealsなどの投稿タイプもあります。もしテーマを変更して、これらすべてが消えてしまったらと想像できますか?本当に〜してもよいですか?
私たちのチームには開発者がいるので、これはあまり問題ではありません。私たちのテーマはすべて私たちのチームによってカスタマイザーでデザインされている。その秘密は2つの言葉にあります。必要なデータさえすべてあれば、今後私たちがしなければならないのは、スタイリングを変更することだけです。関数を個別ファイルから別のファイルにいちいちコピー&ペーストする心配はない。機能を複製したい場合は?プラグインを新しいサイトにドロップするだけです。スタイリングを変更すれば完了だ。
ルールと基準
今回のツイートのようにALWAYSという言葉を使う場合、ルールとスタンダードの両方の意味がある。ルールも基準も大多数のために作られる。ルールが曲げられ、スタンダードが破られるような特殊なケースは常に存在するが、だからといってスタンダードを完全になくすべきだということにはならない。
一般的な投稿タイプには、ほとんどが同じメタ情報の追加を必須とするものが山ほどある。いくつか思いつく例を挙げよう:引用、書籍、レシピ、お客様の声、ポートフォリオなど。
無料や商用で利用可能な写真やポートフォリオのテーマが数多くあることを考えると、ユーザーがテーマを変更するたびにカスタマイ投稿タイプの情報をすべて再入力させるのはほとんど意味がありません。シナリオの例を見てみましょう:
フォトグラファー– ユーザーはブログ機能(初期設定「投稿」CPT)を持つWordPressをセットアップした。自分の作品のポートフォリオを追加したい(Portfolio CPTが必須)。クライアントの声を表示したい(Testimonial CPTが必須)。これらの情報はすべて、テーマデザインを過ぎても生き続けることでしょう。1年後、ユーザーはサイトの外観を変更し、リフレッシュしたいと考えました。同じような機能をすべて備えた新しいテーマを見つける。テーマを切り替えた瞬間、ブーン。それまで入力していたデータがすべて消えてしまったのだ。PortfolioというメニューとTestimonialsというメニューはあるが、データは何もない。ユーザーは「なんてこった、コンテンツがすべて消えてしまった」と思った。フォーラムに新規サポート質問を作成する。WPBeginnerなどのサイトにメールを送る。もし良い返答がなければ、すべてのデータを再入力しなければならない。これはくだらないユーザー体験だ。
では、どうすればこの問題を解決できるでしょうか?
考えられる解決策は?
新しい標準ベースを作る。ジャスティン・タドロックはすでにしばらく前に、ポートフォリオ・プラグインを作成し、この問題に取り組み始めている。すべての人にとって完璧な解決策になるでしょうか?NOですが、大多数の人にとってはそうなるでしょう。
ジャスティンが投稿で問いかけているように、どのような標準フィールドをポートフォリオプラグインに含めるべきか(投稿のメタ情報を参照)。この種の会話は、テーマで同様の機能を作っている開発者の間で行われる必要がある。プラグインで実現できるのに、なぜテーマ間で同じことを何度もコピー&ペーストするのでしょうか?それが標準になれば、他のテーマ投稿者もそれに合わせ始めるだろう。
例えば、GenesisなどのWordPressテーマフレームワークでGravity Formsをサポートするスタイルが増えています。なぜか?ユーザーが使っていることを理解しているからです。
私たちがプラグインであるべきだと考える機能を満載した、堅牢なWordPressテーマがいくつかあります。求人広告テーマ、課題トラッキングテーマ、クラシファイド広告テーマ、不動産テーマなど。これらはすべて、ベースとなるプラグインによって駆動されるべきである。WooCommerceではすでにそうなっている。WooThemesはプラグインのスタイリングサポートをビルトインしたテーマを数多くリリースしている。他のテーマ会社もWooCommerceベースのeコマーステーマをリリースすることを約束している。あるテーマから別のテーマに切り替えても、商品はすべてそのまま維持できる。テーマが変わっても、すべてがうまく収まるという感じだ。これこそ、私たちが目指すべきテーマ変更体験なのだ。
なぜ、ポートフォリオ、お客様の声、その他の一般的なカスタム投稿タイプで同じことをしないのでしょうか?eコマースが征服すべき大きな獣であるのに対して、シンプルすぎるからだろうか?eコマースは他の投稿タイプに比べてフィールドが多すぎる。より良いものを作るために意識的に努力すればいいだけのことだ。
ReciPressプラグインを見てみよう。これはレシピフィールドを持つカスタムメタボックスを作成し、投稿に添付します。しかし、カスタム投稿タイプに添付することも可能だ。このプラグインを使えば、誰でもそんな手間をかけずにテーマを変更することができる。
AgentPressのようなテーマが、一元化されたベースプラグインによって動かされるのを見るのは良いことでしょう。テーマ変更の移行がもっと簡単になれば最高です。例えば、ユーザーがある写真テーマから別のテーマに切り替えた場合、カオスになるべきではありません。小さなエラーは起こるかもしれませんが、少なくとも大局的にはうまくいくはずです。
一度限りのクライアントの使用のために作成された超カスタマイズ投稿タイプの例を挙げることはいつでもできますが、それはルールではなく例外です。
皆さんはこのトピックについてどう思いますか?カスタム投稿タイプのコードはどこに置くべきでしょうか?functions.phpファイルですか、それともプラグインですか?
Yazmin
Having been on the end of losing my CPTs numerous times as I switched themes, I find it frustrating to have to set up the same functionality over and over again in functions.php.
I completely prefer the plugin route and that is the method I will be using from here on out for my business projects as well.
Joshua Jarvis
Having this exact issue with a real estate theme. The “listings” were all custom types in a theme that is now functionally obsolete. When I went to upgrade the theme I lost all the custom post content, now I have to figure out a way to transfer it all. I have options, but if it were plugin, this wouldn’t be necessary.
Editorial Staff
Extremely sorry about your inconvenience. This is why we wrote this post because we know that it really makes the end-user’s life harder.
管理者
Hugh H. Sands
“We won’t have to worry about copying and pasting the functions from one file to another every single time.”
I can’t imagine someone writing code for a CPT in functions.php when it’s so easy to isolate it with includes
This debate goes most of the times around data vs design and I wonder, being quite new to WP, what about performance? Do plugins impose any overload?
Editorial Staff
This article should answer your question about plugins and performance:
https://www.wpbeginner.com/opinion/how-many-wordpress-plugins-should-you-install-on-your-site/
管理者
Hugh Sands
Thanks for the link, really helpful!
Kelvin Alfonso
I’ve always included CPT’s through a separate file into the functions.php but I think I’ll be switching over to the plugins route. Thank you!
Sudhakar
I am a beginner and I have no expertise to comment one way or the other in favor or against of a plug-in or functions.php. But I am wondering if I want to go the functions.php route and do it under a child theme, what is the problem then? Why do I need to have it in a plug-in, wouldn’t my child theme save me from future theme upgrades and changes in the themes?
Editorial Staff
Your child theme would save you from future theme updates. However, it will NOT save you if you change your themes. Because you change the child theme if you change the active theme.
管理者
Pat Ramsey
I’m a believer in the plugin route for custom post types & taxonomies. The author’s mention of a site-specific plugin is how I do it. I place any custom post types, custom taxonomies & metaboxes in this plugin, tailored for the site’s purpose. Eventually the site’s theme will change but the data lives on & is still easily accessible.
shawn
If developers continue to ignore the fact that separating “data” from for “design” is necessary to create modular apps, and it does not matter where it is the data placed, reusing that data / code will always be problem.
There seems to be a perception by some in the WP community, for one reason or the other that you can only access data in the WordPress ecosystem if it is wrapped in a plugin so we keep seeing discussions like this contributing to “The great plugin vs theme debate”.
Focus needs to placed on evolving the WordPress’ archaic plugin system, to creating libraries based on a modular design patterns that separate code / data from design. Libraries that can be used in both themes and plugins….
Debates like these are pointless in the WP post PHP4 era!!! (re-post)
Mark Simchock
Re: “As Justin asks in his post, what standard fields should be included in the portfolio plugin (referring to post meta). This type of conversation needs to happen among developers who are creating similar functionality in their themes.”
Moi? I would prefer a well documented plugin that’s engineered to be enhanced than a “closed”, one size fits all approach that difficult to work with (that code).
My point is, perhaps it’s possible to say, “I’m not trying to be all things to all people. Here’s my basic plugin. Here’s how you trick it out. It’s designed to be tricked out.” and just leave it at that. No matter what you do it’s difficult to anticipate every use case, every use need. So why bother? Why not approach it as a framework (of sorts) and let the dev in need just customize as needed?
Justin Tadlock
That’s actually the plan. I’m building an extremely small and easily-customizable base. But, I’d like to know what, if any, fields should be standard.
Kevin Maines
Typo?:
“Considering all of our teams are custom designed by our team”
Editorial Staff
Fixed it. Thanks for catching that
管理者
Affan Ruslan
I believe it should be on plugin.
In case the user might not need the data in future, they can always convert the custom post type post to the “normal” post type. There’s plugin to do so, search in the repo and you’ll find at least one.
Christophe Debruel
I don’t really care what people say. Custom post type goes into a plugin. A theme can easily be modified to fit the custom post type in the frontend. I find it more logic to style the theme for the CTP than having different themes with the same CTP code.
Ingo
“Pods Framework” could be a good plugin solution, too. For CPT, CT and CF.
http://wordpress.org/extend/plugins/pods/
Editorial Staff
Yes, pods is awesome.
管理者
Elliott Richmond
Plugin for me. At least for a non technical client, although the theme might not function correctly it will become apparent that there is a problem and that will prompt them to get a developer onboard.
Kailas Mahajan
Its all depend on the project…
if one handling project which needs to change theme after a certaine period of time…can use plugin..
or if project which are sticking with the one theme.. can go with function.php
Ross W
Everyone’s talking about how the data needs to be styled by the theme, and examples where that’s the case and where the data and theme can be separated.
What I don’t see is anyone talking about cases where a theme depends on having some specific data available. Lets say you have a theme that has a map of countries and some country-specific data, and that, without that map and data the theme loses some of its key functionality.
Yes, you could still do this with the data in a plugin, but is it reasonable for a theme to assume that some data exists? Is it reasonable to assume that the plugin that creates the data types is installed and enabled? (Genuine questions…discuss!)
What if my slightly non-technical client wants to create a copy of the site with their ‘theme’. They enable the theme on a new Wordpress install only to find that a whole load of stuff is missing or broken? They thought that the theme contained all that they needed for their site to look right?
I can see uses for both approaches. For most of my client work I set up CPT’s, meta-boxes, and some functions to make accessing them simple, in library files and include them. This keeps all the ‘stuff’ that my theme needs to work in one package, but keeps it simple to move the CPT’s to a new theme should I want to.
Of course, if a CPT looks like it could be used across multiple themes and isn’t SO specific that it only really applies to a single client’s data then you turn it into a plugin that can be deployed at will.
I don’t think there’s a simple, one-way relationship between data and themes. It’s not always the case that ‘I have some data that needs styling’…sometimes ‘my styling needs some data’.
Thoughts on that?
Andres Hermosilla
I definitely agree that there is a benefit to having one “complete” package. Often times there is very theme specific functionality that is better to be tied in directly (i.e. P2 from Auttomatic) vs. installed theme and theme plugin.
Konstantin Kovshenin
Plugins. Period.
Curtis McHale
Your reference to AgentPress is one of the reasons I’m 100% for CPT’s in plugins. I’ve had to deal with themes like that and it’s so hard to skin them properly unless you remove the custom function from the theme. My client and I spent 20 hours getting the code to a point we could actually work on it.
Birgit
my best and favorite, recommended solution is the highly flexible TOOLBOX: http://wordpress.org/extend/plugins/toolbox/
Editorial Staff
Neat idea. I wish I could understand what the screenshot was showing without downloading the plugin.
-Syed
管理者
Birgit
The plugin is a “toolbox” for code snippets, that you do normally in your functions.php.
But with a theme update, custom code in the theme’s function.php might get lost.
So I use within my network installation this plugin, activated it network-wide and then the plugin comes with “modules”, that you can access for example by FTP.
You can create modules as much as you like – I have one for each of my blogs within this network. In this modules (= just .php files, let’s say just like site-specific plugins) you can add all the code, that you normally put in your theme’s function.php.
Then at the options page of the plugin you can activate in each blog, which module you would like to load and whether to load it only for frontend or only for backend or for both.
So I only need to have 1 plugin to serve all blogs with individual code snippets, that normally go to their functions.php – and can decide, where to load these modules.
uff, hope this is understandable, because my English is not the best
Perhaps this will work for you to read it: http://tinyurl.com/bf5dflt
Editorial Staff
Brigit, I did translate the WP.org page as well. I understood what the plugin was intended for. However the screenshots were in German, and google is not smart enough to translate images just yet. Same issue is with the link you posted
Sara
I always prefer plugins over functions.php for anything that would materially “break” on the front end or lose data if the theme were changed. This is for precisely the reasons you cite, and I also feel that it is NUTSO for those of us who are not really php programmers to try to troubleshoot conflicts when you have to be commenting out stuff in functions.php to isolate a problem.
matt
ok, so which cpt plugin do you recommend?
Editorial Staff
The idea is that you should register CPT’s in a site-specific plugin. There is not a specific plugin out there yet. But this is just tossing around the idea of creating a base plugin for generic post types.
管理者
Muhammad Waqas
I’m more convinced with the use of local functions. but in this case I think plugin can be trusted more. For example if you start using wp with a specific framework. In most of cases It possible that you’ll become a slave for a long time unless until you hire a wp professional to help you escape from that framework without losing your settings and data. On the other hand plugins can work at almost at every theme.
When I started working with wp I preferred framework over plugin. The reality is that plugin developer consider newbie and less literate people when developing something. I personally believe that most part of wp users like manual code hacks than depending on plugins for core functions of sites. in long term plugins aren’t reliable. I fee so..