Codex

Interested in functions, hooks, classes, or methods? Check out the new WordPress Code Reference!

Difference between revisions of "WordPress Coding Standards"

m (changed "(never camelcase.)" to "(never camelcase).")
m (Update links to devhub)
 
(91 intermediate revisions by 41 users not shown)
Line 1: Line 1:
 
{{Languages|
 
{{Languages|
 
{{en|WordPress Coding Standards}}
 
{{en|WordPress Coding Standards}}
  +
{{fr|Normes de Codage WordPress}}
  +
{{it|Standard di codifica di WordPress}}
 
{{ja|WordPress コーディング基準}}
 
{{ja|WordPress コーディング基準}}
 
{{pt-br|Padroes_de_Codificacao_do_WordPress}}
 
{{pt-br|Padroes_de_Codificacao_do_WordPress}}
  +
{{zh-hans|WordPress 代码规范}}
 
}}
 
}}
   
  +
= WordPress PHP, HTML, CSS and JavaScript Standards Have Moved =
Some legacy parts of the WordPress code structure for PHP markup are inconsistent in their style. WordPress is working to gradually improve this by helping users maintain a consistent style so the code can remain clean and easy to read at a glance.
 
   
  +
'''The WordPress coding standards have been moved to the developer Hub''':
Keep the following points in mind when writing code for WordPress, whether for core programming code, [[Writing a Plugin|Plugins]], or [[Theme Development|WordPress Themes]]. The guidelines are similar to [http://pear.php.net/manual/en/standards.php Pear standards] in many ways, but differ in some key respects.
 
   
  +
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/ WordPress PHP Coding Standards].
Also see [http://comox.textdrive.com/pipermail/wp-hackers/2006-July/006930.html this post on the wp-hackers list].
 
   
  +
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/html/ WordPress HTML Coding Standards].
There is also a page on proposed [[Inline Documentation]] standards.
 
   
  +
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/css/ WordPress CSS Coding Standards].
;Single and double quotes :Use single and double quotes when appropriate. If you're not evaluating anything in the string, use single quotes. You should almost never have to escape HTML quotes in a string, because you can just alternate your quoting style, like so:
 
   
  +
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/javascript/ WordPress JavaScript Coding Standards].
<pre><nowiki>echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
 
echo "<a href='$link' title='$linktitle'>$linkname</a>";</nowiki></pre>
 
 
:The only exception to this is JavaScript, which sometimes requires double or single quotes. Text that goes into attributes should be run through <tt>attribute_escape()</tt> so that single or double quotes do not end the attribute value and invalidate the XHTML and cause a security issue.
 
 
;Indentation : Your indentation should always reflect logical structure. Use '''real tabs''' and '''not spaces''', as this allows the most flexibility across clients.
 
 
:Exception: if you have a block of code that would be more readable if things aligned, use spaces:
 
 
<pre><nowiki>
 
[tab]$foo = 'somevalue';
 
[tab]$foo2 = 'somevalue2';
 
[tab]$foo34 = 'somevalue3';
 
[tab]$foo5 = 'somevalue4';
 
</nowiki></pre>
 
 
:Rule of thumb: tabs should be used at the beginning of the line and spaces should be used mid-line.
 
 
;Brace Style : Braces should be used for multiline blocks:
 
 
<pre><nowiki>
 
if ( condition ) {
 
action1();
 
action2();
 
} elseif ( condition2 && condition3 ) {
 
action3();
 
action4();
 
} else {
 
defaultaction();
 
}
 
</nowiki></pre>
 
 
:Furthermore, if you have a really long block, consider whether it can be broken into two or more shorter blocks or functions. If you consider such a long block unavoidable, please put a short comment at the end so people can tell at glance what that ending brace ends -- typically this is appropriate for a logic block, longer than about 35 rows, but any code that's not intuitively obvious can be commented.
 
 
:single line blocks can omit braces for brevity:
 
 
<pre><nowiki>
 
if ( condition )
 
action1();
 
elseif ( condition2 )
 
action2();
 
else
 
action3();
 
</nowiki></pre>
 
 
:if any related set of blocks is more than one line long then all of the related blocks should be enclosed in braces:
 
 
<pre><nowiki>
 
if ( condition ) {
 
action1();
 
} elseif ( condition2 ) {
 
action2a();
 
action2b();
 
}
 
</nowiki></pre>
 
 
:loops should always contain braces as this enhances readability, and allows for fewer line edits for debugging or additional functionality later
 
 
<pre><nowiki>
 
foreach ( $items as $item ) {
 
process_item( $item );
 
}
 
</nowiki></pre>
 
 
;include_once vs. require_once :Learn the difference between [http://us3.php.net/manual/en/function.include-once.php <tt>include_once</tt>] and [http://us3.php.net/manual/en/function.require-once.php <tt>require_once</tt>], and use each as appropriate. To quote the [http://us3.php.net/manual/en/function.include.php php manual page on include()]: "The two constructs are identical in every way except how they handle failure. include() produces a Warning while require() results in a Fatal Error." Fatal errors stop script execution.
 
 
;Regular expressions: Perl compatible regular expressions (PCRE, <tt>preg_</tt> functions) should be used in preference to their POSIX counterparts. Never use the <tt>/e</tt> switch, use <tt>preg_replace_callback</tt> instead.
 
 
;No Shorthand PHP :'''Never use shorthand PHP start tags''' (<tt>&lt;? ... ?&gt;</tt> or <tt>&lt;?=$var?&gt;</tt>). Always use full PHP tags (<tt>&lt;?php ... ?&gt;</tt>). '''Make sure you remove trailing whitespace after closing PHP tags.'''
 
 
;Space Usage :Always put spaces after commas and on both sides of logical and assignment operators like "<tt>x == 23</tt>", "<tt>foo && bar</tt>", "<tt>array( 1, 2, 3 )</tt>", as well as on both sides of the opening and closing parenthesis of <tt>if</tt>, <tt>elseif</tt>, <tt>foreach</tt>, <tt>for</tt> and <tt>switch</tt> blocks (e.g. <tt>foreach ( $foo as $bar ) { ...</tt>). When defining a function, do it like so: <tt>function myfunction( $param1 = 'foo', $param2 = 'bar' ) {</tt> and when calling a function, do it like so: <tt>myfunction( $param1, funcparam( $param2 ) );</tt>
 
 
;Formatting SQL statements :When formatting SQL statements you may break it into several lines and indent if it is sufficiently complex to warrant it. Most statements work well as one line though. Always capitalize the SQL parts of the statement like <tt>UPDATE</tt> or <tt>WHERE</tt>.
 
 
:Functions that update the database should expect their parameters to lack SQL slash escaping when passed. Escaping should be done as close to the time of the query as possible, preferably by using <tt>$wpdb-&gt;prepare()</tt>
 
 
:<tt>$wpdb-&gt;prepare()</tt> is a method that handles escaping, quoting, and int-casting for SQL queries. It uses a subset of the <tt>sprintf()</tt> style of formatting. Example :
 
 
<pre><nowiki>
 
$var = "dangerous'"; // raw data that may or may not need to be escaped
 
$id = some_foo_number(); // data we expect to be an integer, but we're not certain
 
 
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );
 
</nowiki></pre>
 
 
: <tt>%s</tt> is used for string placeholders and %d is used for integer placeholders. Note that they are not 'quoted'! <tt>$wpdb-&gt;prepare()</tt> will take care of escaping and quoting for us. The benefit of this is that we don't have to remember to manually use <tt>$wpdb-&gt;escape()</tt>, and also that it is easy to see at a glance whether something has been escaped or not, because it happens right when the query happens.
 
 
: See [[Data Validation#Database|database Data Validation]] for more information.
 
 
;Database Queries :Avoid touching the database directly. If there is a defined function that can get the data you need, use it. Database abstraction (using functions instead of queries) helps keep your code forward-compatible and, in cases where results are cached in memory, it can be many times faster. If you must touch the database, get in touch with some developers by posting a message to the [[Mailing_Lists#Hackers|wp-hackers mailing list]]. They may want to consider creating a function for the next WordPress version to cover the functionality you wanted.
 
 
;Variables, functions, file names, and operators :Use lowercase letters in variable and function names (never camelcase). Separate words via underscores
 
 
<pre><nowiki>
 
function some_name( $some_variable ) { [...] }
 
</nowiki></pre>
 
 
:Files should be named descriptively using lowercase letters. Hyphens should separate words
 
 
<pre><nowiki>
 
my-plugin-name.php
 
</nowiki></pre>
 
 
:If you don't use a variable more than once, don't create it. This includes queries. Always use the [[Function_Reference/wpdb Class|wpdb Class]] of functions when interacting with the database.
 
 
:[[Wikipedia:Ternary_operation|Ternary]] operators are fine, but always have them test if the statement is true, not false. Otherwise it just gets confusing.
 
 
<pre><nowiki>// GOOD example:
 
// (if statement is true) ? (do this) : (if false, do this);
 
$musictype = ( 'jazz' == $music ) ? 'cool' : 'blah';
 
</nowiki>
 
</pre>
 
 
:Another important point in the above example, when doing logical comparisons always put the variable on the right side, like above. If you forget an equal sign it'll throw a parse error instead of just evaluating true and executing the statement. It really takes no extra time to do, so if this saves one bug it's worth it.
 
 
;Self-explanatory flag values for function arguments :Prefer string values to just <tt>true</tt> and <tt>false</tt> when calling functions.
 
<pre><nowiki>//BAD
 
function eat( $what, $slowly = true ) {
 
...
 
}
 
eat( 'mushrooms' );
 
eat( 'mushrooms', true ); // what does true mean?
 
eat( 'dogfood', false ); // what does false mean? The opposite of true?
 
</nowiki></pre>
 
 
Since PHP doesn't support named arguments, the values of the flags are meaningless and each time we come across a function call like these above we have to search for the function definition. The code can be made more readable by using descriptive string values, instead of booleans:
 
 
<pre><nowiki>//GOOD
 
function eat( $what, $speed = 'slowly' ) {
 
...
 
}
 
eat( 'mushrooms' );
 
eat( 'mushrooms', 'slowly' );
 
eat( 'dogfood', 'fast' );
 
 
</nowiki></pre>
 
 
[[Category:WordPress Development]]
 

Latest revision as of 05:33, 2 May 2022

WordPress PHP, HTML, CSS and JavaScript Standards Have Moved

The WordPress coding standards have been moved to the developer Hub: