Without a plugin? The functions.php myth.
A comprehensive user guide.

Meh.

State of the file

There's a wide spread digital myth in the WordPress microverse about the functions.php file and that it's a code snippet container. Let's take a look at the opinions of some developers who think that this is plain wrong.

Konstantin Kovshenin has posted an article, which can be summed up that using this file instead of plugins makes code harder to maintain, port, share and debug. Then Rodolfo Buiaz posted a meme on G+ that had one interesting line:

Hello Dolly?! One line in functions.php IS A PLUGIN!

And he's quite right with that. The functions.php is what one could define as a Themeplugin container. Or at least it now mainly is used as such.

The origins

Let's now take a look at what purpose it originally served:

  • Holds all custom Template Tags your theme defines
  • Loads the theme textdomain and translation files
  • Loads additional theme files that the author uses for code organization (menus, etc.)
  • Has filter or action callbacks that modify the internal behavior of WordPress core
  • Registers and enqueues the themes stylesheets and javascript files
  • Defines custom backgrounds, Header images
  • Registers option pages or Theme Customizer settings

And it still serves those purposes. So, as you can see, there's already a lot going on in the functions.php file.

Why are you still misusing it?

As we already discussed the cons of stuffing snippets, we should take a look at the pros. The only pro that I've ever heard of was that it might be easier to add something to the functions.php than to add a new plugin. This might be the case, if you are using the built in WordPress theme editor instead of a desktop texteditor. At a first glance, this might be convenient, but it only makes one thing easier: Adding code. When you finally want to switch your theme, you'll have a hard time, as you need to port all your code snippets over to the new theme and test each if it works or if it collides with some part of your new theme. And then there's this thing that you might have forgotten what part of the functions.php was something that you added and what part was already in the theme when you installed it. And that's a pain in the censored.

Alternatives? A nano scale tutorial.

As in nearly every case in every situation in every part of the world, there're alternatives that will help you to get most of both sides. In this case, you'll even get everything of both sides. And this in less than five minutes.

  • Open your texteditor. Something like Notepad++ or Proton is fine enough.
  • Add a new file named functions.php and save it to your desktop.
  • Now add a plugin header comment on top. We'll go with the minimum, the Plugin Name: part. The following lines only do three things: 1) Open the PHP file 2) Deny direct file access for security 3) Give the plugin a name.

    1. <?php
    2. defined( 'ABSPATH' ) OR exit;
    3. /** Plugin Name: Custom code snippets container */
    
  • Now use a zip program like Winrar, Winzip or 7zip, make an archive and go to your admin/plugins page.

  • Choose upload, select the file on your computer and upload your new plugin.

  • Activate it.

  • Done.

From the beginning to the end you shouldn't have needed more than some minutes to complete this tutorial. You now have officially created your first plugin. So don't be afraid, it doesn't slow down your system - that's just part of the myth. It's absolutely equal in loading speed and execution time as if you'd still stuff snippets in your functions.php file.

What's next? Now open your plugin file in your WordPress admin UI plugins editor. Then start moving all your custom snippets from your Themes functions.php to your new Plugin functions.php file. And you're done! Congratulations! You just saved yourself some hours when switching themes, have a secure place for your snippets as they can't get lost during Theme updates and you have even secured a file against direct file access (if this was possible before).

Alternatives

Now that you're beyond level 1 of professional WordPress usage, you might consider taking a step further. There're several routes that you can walk from here on. Each one will make your life even more easy, as you will be left with the option to activate or deactivate single snippets in case you get the ☠ white screen of death - or a nasty error message in case you got WP_DEBUG set to true in your wp-config.php file more about debugging here.

…or move straight to the pro level:

  • (S)FTP to your server and navigate to the ~/wp-content directory
  • Add a new folder named mu-plugins
  • Done.

What have you got now? The answer is simple, but pretty unknown: A M(ust) U(se) plugins container. To shed some light on this, here's a short explanation what will happen and how this might help you. You'll get an additional tab on the admin UI plugins page. It will appear after you (S)FTP-ed your first plugin there. Then you'll notice that you can't activate or deactivate any plugins in there. WordPress activates them automagically for your. And if you own and run a multisite setup, it will even activate them on every single site in your network.

There's only one minor drawback to this solution: You'll have to use your (S)FTP browser as there's no upload interface for such plugins. But I guess you can live with that.

What is a plugin?

One thing that sometimes comes up in discussions about plugins vs. functions.php as plugin container: "Is this plugin material?". In any case the answer is simple and always the same: Yes. Look at the following example that deactivates the admin toolbar. In fact it's just a single line of code. And it belongs in a plugin file. Why? Easy: Because it does add functionality and not style. If you need to add style, go with a Child Theme.

<?php
defined( 'ABSPATH' ) OR exit;
/** Plugin Name: Disable the admin bar */
add_filter( 'show_admin_bar', '__return_false' );

Conclusion

We've now discussed all the pros and cons of different solutions, have stepped into several levels of snippet handling and left you back with a bunch of options. Now only one question remains:

Are you going to use it?

Talk at the WPMeetUp Vienna #3 plus Slides and links

Photocollage by Floor Drees

111 Photocollage by Floor Drees

I talked at the 3rd WPMeetUp Vienna at Sektor5. You can read the slides on GitHub. (Use your arrow keys to navigate.)

The other talks were by

A complete post about what happened can be found at Floor Drees blog.


Photocollage by Floor Drees

121212 Photocollage by Floor Drees

Then there was a 4th MeetUp on 30th of May at Spaces03, with a bunch of interesting talks.

A big Thank you! to Floor Drees - the heart of the group - for taking pictures, writing blog posts, handing out Hello my name is-stickers … In short: managing everything as smooth as always.