31

I need to run a function when a particular post or page is loaded. Is there any hook that lets me check whether a post is being displayed during page load ?

2
  • public or admin side/facing?
    – kaiser
    Commented Oct 16, 2012 at 10:48
  • 1
    For front end. Basically I want it to trigger only when a particular single custom post type is displayed. Commented Oct 16, 2012 at 10:52

3 Answers 3

35

You can use the wp hook and check the global $wp_query object or any conditional.

add_action( 'wp', 'wpse69369_special_thingy' );
function wpse69369_special_thingy()
{
    if (
        'special_cpt' === get_post_type()
        AND is_singular()
    )
        return print "Yo World!";

    return printf(
        '<p>Nothing to see here! Check the object!<br /></p><pre>%s</pre>',
        var_export( $GLOBALS['wp_query'], true )
    );
}

See: wp in codex.wordpress.org and wp in developer.wordpress.org

3
  • can you please tell me when does 'wp' hook run? Commented Oct 16, 2012 at 11:07
  • A) It runs before after_setup_theme and setup_theme, so it's only accessible for plugins B) inside WP :: main(), which is called from within wp-settings.php.
    – kaiser
    Commented Oct 16, 2012 at 11:19
  • 1
    @kaiser Doesn't the wp hook fire after the after_setup_theme hook and right before template_redirect therefore making wp accessible by themes as well as plugins? (just to clarify?)
    – Adam
    Commented Oct 17, 2012 at 6:18
25

Use template_redirect which is the action hook that fires before rendering the template;

add_action('template_redirect', 'hooker');
function hooker(){
    //I load just before selecting and rendering the template to screen
}
4
  • @PoulomiNag No problem, glad you found your answer above. Though I think one small note is that wp runs after the after_theme_setup hook, so its not just accessible by plugins, making it safe to use in themes.
    – Adam
    Commented Oct 17, 2012 at 6:21
  • I just checked and yes ; wp runs after after_theme_setup. But I need it for my plugin. So wp as well as template_redirect both work fine for me. Wish I could accept two answers here! :) Commented Oct 17, 2012 at 7:33
  • That's ok, not necessary to accept both, just wanted to clarify the order in which they fire. Making sure I'm not going crazy you know. Good luck with your plugin...
    – Adam
    Commented Oct 17, 2012 at 7:42
  • 4
    +1 for function name pun
    – MJHd
    Commented Feb 28, 2020 at 21:56
1

I've quite often used the following to load in custom meta boxes on pages (rather than custom posts).

    add_action('admin_init','how_we_do_it_meta');

    function how_we_do_it_meta() {

        if ( $_SERVER['SCRIPT_NAME'] == '/wp-admin/post.php' ) {

            $post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'];
            $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);

            if ($template_file == 'page-how-we-do-it.php') {

                add_meta_box('how_we_do_it_who-meta', 'Who we work with...', 'how_we_do_it_who', 'page', 'normal', 'high');

                add_action('save_post', 'save_how_we_do_it_meta');

            }
        }
    }
3
  • 1
    Thanks Darronz. But I need some hook to work at the front end during a page load. Any ideas? Commented Oct 16, 2012 at 7:07
  • If you changed the above to add_action('init', // etc) then it'll work on the page load rather than only in the admin section.
    – darronz
    Commented Oct 16, 2012 at 7:19
  • 2
    @darronz And then you need to check ! is_admin() inside, because the init hook runs on both sides.
    – kaiser
    Commented Oct 16, 2012 at 11:20

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.