get_template_part( string $slug, string $name = null, array $args = array() ): void|false

Loads a template part into a template.


Description

Provides a simple mechanism for child themes to overload reusable sections of code in the theme.

Includes the named template part for a theme or if a name is specified then a specialized part will be included. If the theme contains no {slug}.php file then no template will be included.

The template is included using require, not require_once, so you may include the same template part multiple times.

For the $name parameter, if the file is called "{slug}-special.php" then specify "special".


Top ↑

Parameters

$slug string Required
The slug name for the generic template.
$name string Optional
The name of the specialized template.

Default: null

$args array Optional
Additional arguments passed to the template.

Default: array()


Top ↑

Return

void|false Void on success, false if the template does not exist.


Top ↑

More Information

Top ↑

Usage

get_template_part( $slug );
get_template_part( $slug, $name );

Note: get_template_part() fails silently


Top ↑

Source

File: wp-includes/general-template.php. View all references

function get_template_part( $slug, $name = null, $args = array() ) {
	/**
	 * Fires before the specified template part file is loaded.
	 *
	 * The dynamic portion of the hook name, `$slug`, refers to the slug name
	 * for the generic template part.
	 *
	 * @since 3.0.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string      $slug The slug name for the generic template.
	 * @param string|null $name The name of the specialized template.
	 * @param array       $args Additional arguments passed to the template.
	 */
	do_action( "get_template_part_{$slug}", $slug, $name, $args );

	$templates = array();
	$name      = (string) $name;
	if ( '' !== $name ) {
		$templates[] = "{$slug}-{$name}.php";
	}

	$templates[] = "{$slug}.php";

	/**
	 * Fires before an attempt is made to locate and load a template part.
	 *
	 * @since 5.2.0
	 * @since 5.5.0 The `$args` parameter was added.
	 *
	 * @param string   $slug      The slug name for the generic template.
	 * @param string   $name      The name of the specialized template.
	 * @param string[] $templates Array of template files to search for, in order.
	 * @param array    $args      Additional arguments passed to the template.
	 */
	do_action( 'get_template_part', $slug, $name, $templates, $args );

	if ( ! locate_template( $templates, true, false, $args ) ) {
		return false;
	}
}

Top ↑

Hooks



Top ↑

Changelog

Changelog
Version Description
5.5.0 The $args parameter was added.
3.0.0 Introduced.

Top ↑

User Contributed Notes

  1. Skip to note 1 content
    Contributed by Codex

    Using with theme subfolders

    To use this function with subfolders in your theme directory, simply prepend the folder name before the slug. For example, if you have a folder called “partials” in your theme directory and a template part called “content-page.php” in that sub-folder, you would use get_template_part() like this:

    <?php get_template_part( 'partials/content', 'page' ); ?>
  2. Skip to note 2 content
    Contributed by Vinobe

    Passing variables after WordPress 5.5 update
    ======================================

    When calling function

    get_template_part(
    	'template-part',
    	'name',
    	array(
    		'key'	=> 'value',
    		'key2'	=> 'value2'
    	)
    );

    In your template part

    var_dump( $args );	// Everything
    echo $args['key'];	// Specific values
  3. Skip to note 3 content
    Contributed by pcarvalho

    the old codex had this entry about “Passing Variables to Template”

    Because the template is being required, it will not have access to any variables you define within the calling theme’s PHP code, unless you explicitly declare them as global.

    However, load_template(), which is called indirectly by get_template_part() extracts all of the WP_Query query variables, into the scope of the loaded template. So you can use set_query_var() to make your variable available to the template part.

    // You wish to make $my_var available to the template part at `content-part.php`
    set_query_var( 'my_var', $my_var );
    get_template_part( 'content', 'part' );
  4. Skip to note 4 content
    Contributed by Codex

    Using loop.php in child themes
    Assuming the theme folder is wp-content/themes, that the parent theme is twentyten, and the child theme is twentytenchild, then the following code —

    <?php get_template_part( 'loop', 'index' ); ?>

    will do a PHP require() for the first file that exists among these, in this priority:

    wp-content/themes/twentytenchild/loop-index.php
    wp-content/themes/twentyten/loop-index.php
    wp-content/themes/twentytenchild/loop.php
    wp-content/themes/twentyten/loop.php

  5. Skip to note 5 content
    Contributed by Codex

    Navigation
    Adding a navigation bar to theme using a generic nav.php template file:

    <?php get_template_part( 'nav' );           // Navigation bar (nav.php) ?>
    <?php get_template_part( 'nav', '2' );      // Navigation bar #2 (nav-2.php) ?>
    <?php get_template_part( 'nav', 'single' ); // Navigation bar to use in single pages (nav-single.php) ?>
  6. Skip to note 6 content
    Contributed by captaincainer

    A simple example of how to use the $args parameter in WordPress 5.5 in your template parts.

    <?php 
    
    $args = array( 'section_title' => 'hello world' );
    
    get_template_part( 'template-parts/file', 'name', $args ); // template-parts/file-name.php

    In your template part.

    <h2><?php echo __( $args['section_title'] ); ?></h2>

    Output:

    <h2>hello world</h2>
  7. Skip to note 7 content

    Sometime since January 2019, the function has changed to return false if no template file is found. This isn’t noted in the code comments or changelog. The note that the function fails silently is no longer correct.

    This now makes it easy for plugins to provide a template fallback (or allow a template override, depending on your perspective) like this:

    if ( false === get_template_part( $slug, $name, $args ) ) {
    	// default output
    }
  8. Skip to note 8 content
    Contributed by Selrond

    Get a specific file

    Although this kind of defeats the purpose of this function, it’s also possible to load a specific template file with it. All you have to do is use just one argument:

    <?php get_template_part('template-parts/layout'); ?>

    will include layout.php from template-parts subdirectory placed in the root of your theme folder.

  9. Skip to note 10 content
    Contributed by Ahmad Karim

    You can also access the template variables in your template part file by doing this:

    extract( $args );
    
    echo $variable1;
    echo $variable2;

    Your get_template_part will look something like this:

    $args = array(
    	'variable1' => '$variable1 Value',
    	'variable2' => '$variable2 Value',
    );
    
    get_template_part( 'template-parts/template-part-file', null, $args );

    – Keep in mind that the third argument $args has been added since version 5.5

  10. Skip to note 13 content

    get_template_part(foldername/filename without .php extension)

    <?php
    if(is_user_logged_in()){
    	get_template_part('template-parts/loginuser');
    }
    else{
    	get_template_part('template-parts/nonloginuser');
    }
    ?>

    Create a folder in the theme main directory

    Folder name “template-parts” then add two .php files in “template-parts” folder loginuser.php and nonloginuser.php

    If user login show loginuser.php file content

    If the user do not login show nonloginuser.php file content

    Note: Use any folder & files name above I have use random folder name and files name.

  11. Skip to note 14 content
    Contributed by luboslives

    If your web server is using ModSecurity, it will likely block attempts to inline SVGs using a PHP method like file_get_contents(). You can use get_template_part() to inline SVGs.

    1. Create a duplicate of your SVG, where icon.svg becomes inline-icon.svg.php
    2. Inline them in your template using get_template_part( 'images/inline', 'icon.svg' );

    At the time of writing, this works to get around the default OWASP rule set for ModSecurity. Not tested with other rule sets.

  12. Skip to note 15 content
    Contributed by Felipe Marcos

    Passing variables to get_template_part()

    It’s not possible to pass variables to a template loaded via get_template_part(). I came up with a workaround that doesn’t rely on global variables for it to work.

    /* functions.php */ 
    function get_custom_template($file = '', $arguments = []) {
      extract($arguments);
      include( locate_template( $file .'.php', false, false ) );
    }
    /* loop.php */ 
    while( have_posts() ): 
      the_post(); 
      get_custom_template( 'content', [
    	'is_featured' => true
      ]);
    endwhile;

    Now, when we try to use $is_featured, it will be available to content.php only.

    /* content.php */ 
    the_title(); 
    the_content(); 
    var_dump($is_featured); // true 
  13. Skip to note 16 content
    Contributed by shahriyar.modami

    How to passing variables to get_template_part() correctly: Wordpress + 5.5

    1- Setup variable

    $data = array(
    	'location' 	=> 'slider',
    	'number'	=>	3
    );

    2- Passing variable to get_template_part

    get_template_part( 'templates/slider', 'full', $data ); //templates/slider-full.php 

    3- get data in part of template

    global $data; //dont forget use globally
    print_r($data); // output: array('location' => 'slider', 'number' => 3) 

You must log in before being able to contribute a note or feedback.