Help:Templates
Templates enable you to do things much faster and/or easier. Templates are used very frequently on pages, so it's best to learn about them. When the wiki sees a template it recognizes on a page, it will automatically replace it with something else. What appears there is up to the users.
How to use a template
Before a template can be added somewhere, first its contents must be defined on its own page. Template pages should start with the prefix Template:
.
Templates have some limited programming abilities, which gives them lots of possibilities. We'll talk more about those later.
To add a template to a page (which is called transcluding), simply type {{
, the name of the template, and then }}
. If you wish to add any parameters, put a |
between the template's name and the }}
, and define the parameters there. All parameters you define need to be separated by another |
.

Whether you're building a commercial project or a modification for Half-Life® 2, you'll want to sign up as a Valve developer today. It's free to join and is open to anyone working with the Source engine and its software development kit.
GoldSrc and the Half-Life SDK
If you want to create a Mod for Half-Life or looking for more GoldSrc documentation, click above.
Source and the Source SDK
If you want to create a Source SDK Base mod, or content-based mod for Half-Life 2, Team Fortress 2 or looking for more Source documentation, click above.
Source 2 Documentation
If you want to port Source content to Source 2, create a content-based mod for Source 2 games or looking for more Source 2 documentation, click above. Otherwise, you can check out the following Source 2 games with Workshop Tools:
- Source Engine Features
- Why choose the Source engine for your mod?
- Read Making a Mod - building a team through the shipping process.
- Already using the SDK? Check the Source SDK FAQ for some helpful answers.
- New to Source coding? Get started with basic programming articles.
- Read (or add) a tutorial on Source development, or any part of the content creation process.
For help with using the wiki, see Help:Contents. For help with navigating the wiki, see Category:Entry pages or Category:Valve Developer Community. For more information on the community itself, see Community Portal.
|
© 2005–2025 Valve Corporation. All rights reserved. All trademarks are property of their respective owners in the US and other countries. See the Terms of Use for details
About Valve Developer Community · Privacy Policy · Third Party Legal Notices
Examples
Here's a template where we don't define any parameters, you just drop it right in.
{{restart}}
Result: Requires restart to take effect.
If you visit this template's page, you'll see that its just those five words.
The ent template is a template that can accept up to two unnamed parameters.
{{ent|sv_cheats|1}}
Result: sv_cheats 1
Unnamed parameters must be defined in a specific order.
KV is one of the most common templates used. It accepts an optional named parameter (since
).
{{KV|Script think function (thinkfunction)|string|Name of a function in this entity's script which will be called automatically every 100 milliseconds (ten times a second) for the duration of the script. It can be used to create timers or to simulate autonomous behavior. The return value (if present) will set the time until the next call.|since=l4d2}}
Result:
- Script think function (thinkfunction) ([todo internal name (i)]) <string> (in all games since
)
- Name of a function in this entity's script which will be called automatically every 100 milliseconds (ten times a second) for the duration of the script. It can be used to create timers or to simulate autonomous behavior. The return value (if present) will set the time until the next call.
Without the |since=l4d2
at the end, the Template:L4d2 add message would not have displayed. Named parameters can be defined in any order.
Templates can also use templates (nesting). In the KV template above, the |since=l4d2
part adds {{l4d2 add}}
into the page, which is the Template:L4d2 add message.
Making templates
Making a template like Template:Restart is rather easy - just type the text you want, and save it. What about ones with parameters?

Unnamed parameters
To add an unnamed parameter, simply put {{{1}}}
where you want it to be.
Here's part of the code for Template:Tip:
Tip:{{{1}}}
If you've seen this template before you know that it has its own special look, but this is all we will look at for now. All the user has to do when transcluding this is enter the text they want:
{{tip|Do not carve without vertex editing afterward.}}
Result:

If you want to add more than one unnamed parameter, simply change the number. Here's the (condensed) code for Template:Distinguish:
:''Not to be confused with [[:{{{1}}}]]{{#if:{{{2|}}} |{{#if:{{{3|}}} |, [[:{{{2}}}]]| or [[:{{{2}}}]].}}|.}}{{#if:{{{3|}}} |{{#if:{{{4|}}} |, [[:{{{3}}}]]|, or [[:{{{3}}}]].}}}}{{#if:{{{4|}}} |, or [[:{{{4}}}]].}}''
This template has some things we haven't talked about yet, but you can still see that there's four unnamed parameters used: {{{1}}}
, {{{2}}}
, {{{3}}}
, and {{{4}}}
.
All the user has to do when transcluding is this:
{{distinguish|Combine|Civil Protection|Overwatch}}
Result:
Named parameters
Usually you would want to have named parameters affect anything only if they are defined when being transcluded. We'll talk about conditions later. For now, let's look at Template:IO, which has many named parameters. In this template, {{{param}}}
marks a place to add wikitext that's defined by |param=texthere
when transcluding.
With named parameter:
{{IO|SetString|Updates the string.|param=string}}
Result:
- SetString <string>
- Updates the string.
Without named parameter:
{{IO|SetString|Updates the string.}}
Result:
- SetString
- Updates the string.
Parser Functions
#if:
checks if a string or parameter has anything inside it.
{{#if: {{{target|}}} | Target aqcuired | Sleep mode activated... }}
Result: Sleep mode activated... (The parameter {{{target|}}}
returns null because you (probably) are not viewing this page through a transclusion, so it's never had a chance to be defined.)
{{#if: Something is there! | Target aqcuired | Sleep mode activated... }}
Result: Target aqcuired
#ifeq:
checks for equality between two strings. It can be used with parameters as well.
{{#ifeq: {{{target|}}} | friend | Friend... | Go away! }}
Result: Go away!
{{#ifeq: friend | friend | Friend... | Go away! }}
Result: Friend...
#expr:
solves math problems.
{{#expr: 2 + 2}}
Result: 4
See m:Help:Calculation for all it's abilities.
#ifexpr:
tells if a math expression is correct.
{{#ifexpr: 6 + 3 = 9 | Right | Wrong }}
Result: Right
{{#ifexpr: 6 + 3 = 23 | Right | Wrong }}
Result: Wrong
Documentation
Please give a description of what your template is, and maybe examples. To keep this describing text from appearing on pages, there are 3 different HTML tags you can use.
noinclude
keeps wikitext inside it from appearing on the destination page, while keeping it on the source page.
onlyinclude
makes only wikitext inside it appear on destination pages. text not inside these will still appear on the tempalte's page.
includeonly
wikitext inside this will not appear on the template page. It has no effect on the destination page however.
Templates not updating
If you've recently edited a template and the changes are not applying on pages it's been transcluded to, add ?action=purge
at the end of the URL for those pages. This will tell the server to update the page's HTML immediately. You can achieve the same effect by editing a page and saving it without making any changes.
See Also
- Wikipedia:Help:Template - a very helpful resource for template programming.
- New Help Desk - Still having issues? Ask here.