I would like to create shortcodes, but some tutorials write about to use add_action:

add_action( 'init', 'register_shortcodes');

But I read another tutorial where the author didn't use it, only put this to functions.php:

add_shortcode( 'recent-posts', 'recent_posts_function' );

Which is the best method, and why to use add_action?

  • Wrapping the calls to add_shortcode in a function and calling that function with a hook gives you more control of when the shortcodes are added. For example, you may want to add those shortcodes when a specific plugin is activated, but not otherwise.
    – admcfajn
    Feb 20, 2019 at 6:26

3 Answers 3


If you take a look at the Codex page about add_shortcode() you won't see anything about the need of an add_action() before you can use add_shortcode().

So, you can just put your add_shortcode() directly into your functions.php. This is what I do too.

See this article - WordPress Shortcodes: A Complete Guide about the use of shortcodes and best practices.

  • 6
    You have actuaclly linked to an article saying you should wrap in an action.
    – raam86
    Sep 1, 2013 at 13:39

Sometimes it is required to use 'init' action. For example, right now I edit theme heavily based on widgets and customize panel. I tried to add custom shortcode without actions and got errors upon saving content in Customize panel. Action ensures the right order of executing functions. It says "hey shortcodes! First I will load most important functions, then you!"


Without repeating too much that has been covered in the answers above; this is just a best practices approach. I often use this in plugin development where I need to have separate classes like in the wppb.me plugin starter template.

It makes sense to register all your admin hooks in the loader. In the case of the shortcode, you can add the add_action shortcode hook in the hooks loader method :

   * Register all of the hooks related to the admin area functionality
   * of the plugin

     private function define_admin_hooks() {

     $plugin_admin = new instance( $this->get_plugin_name(), $this->get_version() );

     $this->loader->add_action( 'init', $plugin_admin, 'register_shortcodes');

The main benefit I have with this approach is for easy code maintenance since the code is modular. You can add several other hooks in the same method which makes it easy to track and change things, especially for a large plugin.

It, therefore, means in the class where you want to use add_shortcodeyou do not have to run the action hook in the constructor method, you can now use it in a custom method like :

public function register_shortcodes(){

        add_shortcode('recent-posts', array($this, 'recent_posts_function'));

  • You saved me time. I was not passing the second argument with an instance of the class and kept on debugging for 2hours. :|
    – Tan-007
    Sep 20, 2019 at 0:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.