Use locate_template instead of TEMPLATEPATH to Include Files in a BuddyPress Child Theme

Today I ran into an interesting problem while developing a BuddyPress theme. I was attempting to include a custom sidebar using PHP’s “include” function. The WordPress codex page on “include tags” gives us this:

<?php include( TEMPLATEPATH . ‘/sidebar-index.php’ ); ?>

The problem is that the above code doesn’t always work when you are utilizing a child theme (I am building a child theme based on the default BuddyPress theme). Rather, you should use the “locate_template” hook:

<?php locate_template( array( ‘sidebar-index.php’ ), true ) ?>

What the “locate_template” hook does is searches the child theme’s template folder before searching the parent theme’s template folder.

Pretty nifty, eh?

7 comments ↓

#1 alan on 03.06.10 at 3:57 am

thanks this works perfect…

thanks for sharing.this is why I like wordpress ,community is awesome!

#2 Marco on 03.08.10 at 7:28 am

Hello, I’m facing some problem with this method, I tried to use a hook in child functions.php so I won’t touch files directly, but that didn’t work. Could you drop me a line via mail so I can show you what I’ve done and maybe show me where’s the error.

#3 Toby on 03.08.10 at 1:40 pm

Marco,

Can you explain a little bit more?

So far, I have only used the “locate_template” hook from a child theme’s page and post template files, so I can’t vouch for how it might work in the functions.php file.

#4 Marco on 03.09.10 at 4:43 am

Hello, here’s what I’ve done in functions.php (shouty is the site theme name):

/*define constant*/
define(‘SHOUTY_DIR’, STYLESHEETPATH);

then:
/*here we insert, after the regular sidebar, Shouty’s left sidebar*/
add_action(‘bp_after_sidebar’, ‘shouty_include_sidebar_left’);
function shouty_include_sidebar_left() {
require(SHOUTY_DIR.’/sidebar_left.php’);
}

But this does not load the sidebar_left.php givin an error of file/folder not found in child theme dir, even though is actually there and I can’t figure why. I use this method with frameworks like Hybrid, Thematic and the new Genesis and it always works well.

ps. I tried hardcoding but doesn’t work either.

#5 Toby on 03.15.10 at 11:08 pm

Marco,
Have you tried using include( TEMPLATEPATH . ‘/sidebar-index.php’ ); rather than define(‘SHOUTY_DIR’, STYLESHEETPATH); ?

#6 Marco on 03.16.10 at 1:42 am

Yes I did it at first.
TEMPLATEPATH leads you into the parent theme, giving the error of file/dir not found. Quite the same error as STYLESHEETPATH, this time from the child theme’s dir.

#7 Toby on 03.16.10 at 8:17 am

Marco,
Will the path work properly if you include your code in the template itself (i.e. index.php rather than in functions.php)?

Leave a Comment