Theme Check - Version 20151211.1

Version Description

  • Full sync with Github and all the changes that have happened there.
  • Release for 4.4 deprecated functions.
Download this release

Release Info

Developer Otto42
Plugin Icon 128x128 Theme Check
Version 20151211.1
Comparing to
See all releases

Version 20151211.1

assets/gray-grad.png ADDED
Binary file
assets/style.css ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .tc-box {
2
+ padding:20px 0;
3
+ border-top:1px solid #dfdfdf;
4
+ }
5
+ .tc-warning, .tc-required, .tc-fail {
6
+ color:red;
7
+ }
8
+ .tc-recommended, .tc-pass {
9
+ color: green;
10
+ }
11
+ .tc-info {
12
+ color: blue;
13
+ }
14
+ .tc-grep span {
15
+ background: yellow;
16
+ }
17
+ pre {
18
+ white-space: pre-wrap;
19
+ }
20
+ .tc-success {
21
+ margin:0 20px 20px 20px;
22
+ background:#e6ffe2;
23
+ border:1px solid #d1eecc;
24
+ }
25
+ form {
26
+ margin:20px auto;
27
+ }
28
+ .theme-check {
29
+ margin:20px auto;
30
+ border:1px solid #dfdfdf;
31
+ -moz-border-radius:5px;
32
+ -khtml-border-radius:5px;
33
+ -webkit-border-radius:5px;
34
+ border-radius:5px;
35
+ }
36
+ .theme-check h2 {
37
+ margin:0 0 20px 0;
38
+ padding:0 20px;
39
+ background:#dfdfdf url("gray-grad.png") repeat-x left top;
40
+ font-size:20px;
41
+ border-bottom:1px solid #ccc;
42
+ }
43
+ .theme-check p {
44
+ padding:5px 20px;
45
+ }
46
+ .theme-check form {
47
+ margin-left:20px;
48
+ }
49
+ .theme-check ul {
50
+ margin-left:20px;
51
+ }
52
+ .theme-check h3 {
53
+ margin:0 0 10px 20px;
54
+ padding:0;
55
+ }
56
+ .theme-check ul {
57
+ margin-bottom:10px;
58
+ }
59
+ .theme-info {
60
+ padding:10px;
61
+ border:1px solid #dfdfdf;
62
+ margin:10px 20px 0 20px;
63
+ }
64
+ .theme-info p {
65
+ padding:0;
66
+ margin-bottom:10px;
67
+ }
68
+ .theme-info label {
69
+ float:left;
70
+ width:100px;
71
+ font-weight:bold;
72
+ display:block;
73
+ }
74
+ .theme-info span.info {
75
+ margin-left:100px;
76
+ display:block;
77
+ }
changelog.txt ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ = 20140929.1 =
2
+ * Added new checks and updates from Frank Klein at Automattic. Thanks Frank!
3
+ * Updated deprecated function listings
4
+ * Customizer check: All add_settings must use sanitization callbacks, for security
5
+ * Plugin territory checks: Themes must not register post types or taxonomies or add shortcodes for post content
6
+ * Widgets: Calls to register_sidebar must be called from the widgets_init action hook
7
+ * Title: <title> tags must exist and not have anything in them other than a call to wp_title()
8
+ * CDN: Checks for use of common CDNs (recommended only)
9
+ * Note: Changed plugin and author URIs due to old URIs being invalid. These may change again in the future, the URIs to my own site are temporarily only.
10
+
11
+ = 20131213.1 =
12
+ * Corrected errors not being displayed by the plugin and it incorrectly giving a "pass" result to everything.
13
+
14
+ = 20131212.1 =
15
+ * Updated for 3.8
16
+ * Most files have changed for better I18N support, so the language files were removed temporarily until translation can be redone.
17
+
18
+ = 20121211.1 =
19
+ * Updated for 3.5
20
+ * Remove Paypal button.
21
+
22
+ = 20110805.1 =
23
+ * TimThumb checks removed.
24
+ * Proper i18n loading. Fixes http://bit.ly/ouD5Ke.
25
+ * Screenshot now previewed in results, with filesize and dimensions.
26
+
27
+ = 20110602.2 =
28
+ * New file list functions hidden folders now detectable.
29
+ * Better fopen checks.
30
+ * TimThumb version bump
31
+
32
+ = 20110602.1 =
33
+ * DOS/UNIX line ending style checks are now a requirement for proper theme uploading.
34
+ * Timthumb version bump
35
+ * Several fixes reported by GaryJ
36
+ * 3.2 deprecated functions added
37
+
38
+ = 20110412.1 =
39
+ * Fix regex's
40
+ * Added check for latest footer injection hack.
41
+ * Fix tags check to use new content function correctly
42
+ * Sync of all changes made for wporg uploader theme-check.
43
+ * Updated checks post 3.1. added screenshot check to svn.
44
+ * Fix links check to not return a false failure in some cases
45
+ * rm one of the checks that causes problems on wporg uploader (and which is also unnecessary)
46
+ * Move unneeded functions out of checkbase into main.php.
47
+ * Minor formatting changes only (spacing and such)
48
+ * Add check for wp_link_pages() + fix eval() check
49
+
50
+ = 20110219.2 =
51
+ * Merged new UI props Gua Bob [1](http://guabob.com/)
52
+ * Last tested theme is always pre-selected in the themes list.
53
+ * Fixed php error in admin_menu.php
54
+
55
+ = 20110219.1 =
56
+ * See [commit log](https://github.com/Pross/theme-check/commits/) for changes.
57
+
58
+ = 20110201.2 =
59
+ * UI bug fixes [forum post](http://bit.ly/ff7amN) props Mamaduka.
60
+ * Textdomain checks for twentyten and no domain.
61
+ * Fix div not closing props Mamaduka.
62
+
63
+ = 20110201.1 =
64
+ * i18n working
65
+ * sr_RS de_DE ro_RO langs props Daniel Tara and Emil Uzelac.
66
+ * Child theme support added, checks made against parent AND child at runtime.
67
+ * Trac formatting button added for reviewers.
68
+
69
+ = 20101228.3 =
70
+ * Last revision for 3.1 (hopefully)
71
+ * Chips suggestion of checking for inclusion of searchform.php ( not
72
+ perfect yet, need more examples to look for ).
73
+ * add_theme_page is required, all others flagged and displayed with line
74
+ numbers.
75
+ * <?= detected properly, short tags outputted with line umbers.
76
+ * Mostly internationalized, needs translations now.
77
+ * Bug fixes.
78
+
79
+ = 20101228.2 =
80
+ * Added menu checking.
81
+ * ThemeURI AuthourURI added to results.
82
+ * Lots of small fixes.
83
+ * Started translation.
84
+
85
+ = 20101228.1 =
86
+ * Fix embed_defaults filter check and stylesheet file data check.
87
+
88
+ = 20101226.1 =
89
+ * Whole system redesign to allow easier synching with WordPress.org uploader. Many other additions/subtractions/changes as well.
90
+ * WordPress 3.1 guidelines added, to help theme authors ensure compatibility for upcoming release.
91
+
92
+ = 20101110.7 =
93
+ * Re-added malware.php checks for fopen and file_get_contents (INFO)
94
+ * fixed a couple of undefined index errors.
95
+
96
+ = 20101110.4_r2 =
97
+ * Fixed Warning: Wrong parameter count for stristr()
98
+
99
+ = 20101110.4_r1 =
100
+ * Added `echo` to suggested.php
101
+
102
+ = 20101110.4 =
103
+ * Fixed deprecated function call to get_plugins()
104
+
105
+ = 20101110.3 =
106
+ * Fixed undefined index.
107
+
108
+ = 20101110.2 =
109
+ * Missing `<` in main.php
110
+ * Added conditional checks for licence.txt OR Licence tags in style.css
111
+ * UI improvements.
112
+
113
+ = 20101110.1 =
114
+ * Date fix!
115
+
116
+ = 10112010_r1 =
117
+ * Fixed hardcoded links check. Added FAQ
118
+
119
+ = 10112010 =
120
+ * First release.
checkbase.php ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // main global to hold our checks
3
+ global $themechecks;
4
+ $themechecks = array();
5
+
6
+ // counter for the checks
7
+ global $checkcount;
8
+ $checkcount = 0;
9
+
10
+ // interface that all checks should implement
11
+ interface themecheck
12
+ {
13
+ // should return true for good/okay/acceptable, false for bad/not-okay/unacceptable
14
+ public function check( $php_files, $css_files, $other_files );
15
+
16
+ // should return an array of strings explaining any problems found
17
+ public function getError();
18
+ }
19
+
20
+ // load all the checks in the checks directory
21
+ $dir = 'checks';
22
+ foreach (glob(dirname(__FILE__). "/{$dir}/*.php") as $file) {
23
+ include $file;
24
+ }
25
+
26
+ do_action('themecheck_checks_loaded');
27
+
28
+ function run_themechecks($php, $css, $other) {
29
+ global $themechecks;
30
+ $pass = true;
31
+ foreach($themechecks as $check) {
32
+ if ($check instanceof themecheck) {
33
+ $pass = $pass & $check->check($php, $css, $other);
34
+ }
35
+ }
36
+ return $pass;
37
+ }
38
+
39
+ function display_themechecks() {
40
+ $results = '';
41
+ global $themechecks;
42
+ $errors = array();
43
+ foreach ($themechecks as $check) {
44
+ if ($check instanceof themecheck) {
45
+ $error = $check->getError();
46
+ $error = (array) $error;
47
+ if (!empty($error)) {
48
+ $errors = array_unique( array_merge( $error, $errors ) );
49
+ }
50
+ }
51
+ }
52
+ if (!empty($errors)) {
53
+ rsort($errors);
54
+ foreach ($errors as $e) {
55
+
56
+ if ( defined( 'TC_TRAC' ) ) {
57
+ $results .= ( isset( $_POST['s_info'] ) && preg_match( '/INFO/', $e ) ) ? '' : '* ' . tc_trac( $e ) . "\r\n";
58
+ } else {
59
+ $results .= ( isset( $_POST['s_info'] ) && preg_match( '/INFO/', $e ) ) ? '' : '<li>' . tc_trac( $e ) . '</li>';
60
+ }
61
+ }
62
+ }
63
+
64
+ if ( defined( 'TC_TRAC' ) ) {
65
+
66
+ if ( defined( 'TC_PRE' ) ) $results = TC_PRE . $results;
67
+ $results = '<textarea cols=140 rows=20>' . strip_tags( $results );
68
+ if ( defined( 'TC_POST' ) ) $results = $results . TC_POST;
69
+ $results .= '</textarea>';
70
+ }
71
+ return $results;
72
+ }
73
+
74
+ function checkcount() {
75
+ global $checkcount;
76
+ $checkcount++;
77
+ }
78
+
79
+ // some functions theme checks use
80
+ function tc_grep( $error, $file ) {
81
+ if ( ! file_exists( $file ) ) {
82
+ return '';
83
+ }
84
+ $lines = file( $file, FILE_IGNORE_NEW_LINES ); // Read the theme file into an array
85
+ $line_index = 0;
86
+ $bad_lines = '';
87
+ foreach( $lines as $this_line ) {
88
+ if ( stristr ( $this_line, $error ) ) {
89
+ $error = str_replace( '"', "'", $error );
90
+ $this_line = str_replace( '"', "'", $this_line );
91
+ $error = ltrim( $error );
92
+ $pre = ( FALSE !== ( $pos = strpos( $this_line, $error ) ) ? substr( $this_line, 0, $pos ) : FALSE );
93
+ $pre = ltrim( htmlspecialchars( $pre ) );
94
+ $bad_lines .= "<pre class='tc-grep'>". __("Line ", "theme-check") . ( $line_index+1 ) . ": " . $pre . htmlspecialchars( substr( stristr( $this_line, $error ), 0, 75 ) ) . "</pre>";
95
+ }
96
+ $line_index++;
97
+ }
98
+ return str_replace( $error, '<span class="tc-grep">' . $error . '</span>', $bad_lines );
99
+ }
100
+
101
+ function tc_preg( $preg, $file ) {
102
+ if ( ! file_exists( $file ) ) {
103
+ return '';
104
+ }
105
+ $lines = file( $file, FILE_IGNORE_NEW_LINES ); // Read the theme file into an array
106
+ $line_index = 0;
107
+ $bad_lines = '';
108
+ $error = '';
109
+ foreach( $lines as $this_line ) {
110
+ if ( preg_match( $preg, $this_line, $matches ) ) {
111
+ $error = $matches[0];
112
+ $this_line = str_replace( '"', "'", $this_line );
113
+ $error = ltrim( $error );
114
+ $pre = '';
115
+ if ( !empty( $error ) ) {
116
+ $pre = ( FALSE !== ( $pos = strpos( $this_line, $error ) ) ? substr( $this_line, 0, $pos ) : FALSE );
117
+ }
118
+ $pre = ltrim( htmlspecialchars( $pre ) );
119
+ $bad_lines .= "<pre class='tc-grep'>" . __("Line ", "theme-check") . ( $line_index+1 ) . ": " . $pre . htmlspecialchars( substr( stristr( $this_line, $error ), 0, 75 ) ) . "</pre>";
120
+ }
121
+ $line_index++;
122
+
123
+ }
124
+ return str_replace( $error, '<span class="tc-grep">' . $error . '</span>', $bad_lines );
125
+ }
126
+
127
+ function tc_strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
128
+ if(strrpos($haystack, $needle)){
129
+ //Everything before last $needle in $haystack.
130
+ $left = substr($haystack, 0, strrpos($haystack, $needle) + $l_inclusive);
131
+ //Switch value of $r_inclusive from 0 to 1 and viceversa.
132
+ $r_inclusive = ($r_inclusive == 0) ? 1 : 0;
133
+ //Everything after last $needle in $haystack.
134
+ $right = substr(strrchr($haystack, $needle), $r_inclusive);
135
+ //Return $left and $right into an array.
136
+ return array($left, $right);
137
+ } else {
138
+ if(strrchr($haystack, $needle)) return array('', substr(strrchr($haystack, $needle), $r_inclusive));
139
+ else return false;
140
+ }
141
+ }
142
+
143
+ function tc_filename( $file ) {
144
+ $filename = ( preg_match( '/themes\/[a-z0-9]*\/(.*)/', $file, $out ) ) ? $out[1] : basename( $file );
145
+ return $filename;
146
+ }
147
+
148
+ function tc_trac( $e ) {
149
+ $trac_left = array( '<strong>', '</strong>' );
150
+ $trac_right= array( "'''", "'''" );
151
+ $html_link = '/<a\s?href\s?=\s?[\'|"]([^"|\']*)[\'|"]>([^<]*)<\/a>/i';
152
+ $html_new = '[$1 $2]';
153
+ if ( defined( 'TC_TRAC' ) ) {
154
+ $e = preg_replace( $html_link, $html_new, $e );
155
+ $e = str_replace( $trac_left, $trac_right, $e );
156
+ $e = preg_replace( '/<pre.*?>/', "\r\n{{{\r\n", $e );
157
+ $e = str_replace( '</pre>', "\r\n}}}\r\n", $e );
158
+ }
159
+ return $e;
160
+ }
161
+
162
+ function listdir( $dir ) {
163
+ $files = array();
164
+ $dir_iterator = new RecursiveDirectoryIterator( $dir );
165
+ $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
166
+
167
+ foreach ($iterator as $file) {
168
+ array_push( $files, $file->getPathname() );
169
+ }
170
+ return $files;
171
+ }
172
+
173
+ function old_listdir( $start_dir='.' ) {
174
+ $files = array();
175
+ if ( is_dir( $start_dir ) ) {
176
+ $fh = opendir( $start_dir );
177
+ while ( ( $file = readdir( $fh ) ) !== false ) {
178
+ # loop through the files, skipping . and .., and recursing if necessary
179
+ if ( strcmp( $file, '.' )==0 || strcmp( $file, '..' )==0 ) continue;
180
+ $filepath = $start_dir . '/' . $file;
181
+ if ( is_dir( $filepath ) )
182
+ $files = array_merge( $files, listdir( $filepath ) );
183
+ else
184
+ array_push( $files, $filepath );
185
+ }
186
+ closedir( $fh );
187
+
188
+ } else {
189
+
190
+ # false if the function was called with an invalid non-directory argument
191
+ $files = false;
192
+ }
193
+ return $files;
194
+ }
195
+
196
+ function tc_print_r( $data ) {
197
+ $out = "\n<pre class='html-print-r'";
198
+ $out .= " style='border: 1px solid #ccc; padding: 7px;'>\n";
199
+ $out .= esc_html( print_r( $data, TRUE ) );
200
+ $out .= "\n</pre>\n";
201
+ echo $out;
202
+ }
203
+
204
+ function get_theme_data_from_contents( $theme_data ) {
205
+ $themes_allowed_tags = array(
206
+ 'a' => array(
207
+ 'href' => array(),'title' => array()
208
+ ),
209
+ 'abbr' => array(
210
+ 'title' => array()
211
+ ),
212
+ 'acronym' => array(
213
+ 'title' => array()
214
+ ),
215
+ 'code' => array(),
216
+ 'em' => array(),
217
+ 'strong' => array()
218
+ );
219
+
220
+ $theme_data = str_replace ( '\r', '\n', $theme_data );
221
+ preg_match( '|^[ \t\/*#@]*Theme Name:(.*)$|mi', $theme_data, $theme_name );
222
+ preg_match( '|^[ \t\/*#@]*Theme URI:(.*)$|mi', $theme_data, $theme_uri );
223
+ preg_match( '|^[ \t\/*#@]*Description:(.*)$|mi', $theme_data, $description );
224
+
225
+ if ( preg_match( '|^[ \t\/*#@]*Author URI:(.*)$|mi', $theme_data, $author_uri ) )
226
+ $author_uri = esc_url( trim( $author_uri[1]) );
227
+ else
228
+ $author_uri = '';
229
+
230
+ if ( preg_match( '|^[ \t\/*#@]*Template:(.*)$|mi', $theme_data, $template ) )
231
+ $template = wp_kses( trim( $template[1] ), $themes_allowed_tags );
232
+ else
233
+ $template = '';
234
+
235
+ if ( preg_match( '|^[ \t\/*#@]*Version:(.*)|mi', $theme_data, $version ) )
236
+ $version = wp_kses( trim( $version[1] ), $themes_allowed_tags );
237
+ else
238
+ $version = '';
239
+
240
+ if ( preg_match('|^[ \t\/*#@]*Status:(.*)|mi', $theme_data, $status) )
241
+ $status = wp_kses( trim( $status[1] ), $themes_allowed_tags );
242
+ else
243
+ $status = 'publish';
244
+
245
+ if ( preg_match('|^[ \t\/*#@]*Tags:(.*)|mi', $theme_data, $tags) )
246
+ $tags = array_map( 'trim', explode( ',', wp_kses( trim( $tags[1] ), array() ) ) );
247
+ else
248
+ $tags = array();
249
+
250
+ $theme = ( isset( $theme_name[1] ) ) ? wp_kses( trim( $theme_name[1] ), $themes_allowed_tags ) : '';
251
+
252
+ $theme_uri = ( isset( $theme_uri[1] ) ) ? esc_url( trim( $theme_uri[1] ) ) : '';
253
+
254
+ $description = ( isset( $description[1] ) ) ? wp_kses( trim( $description[1] ), $themes_allowed_tags ) : '';
255
+
256
+ if ( preg_match( '|^[ \t\/*#@]*Author:(.*)$|mi', $theme_data, $author_name ) ) {
257
+ if ( empty( $author_uri ) ) {
258
+ $author = wp_kses( trim( $author_name[1] ), $themes_allowed_tags );
259
+ } else {
260
+ $author = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', $author_uri, __( 'Visit author homepage' ), wp_kses( trim( $author_name[1] ), $themes_allowed_tags ) );
261
+ }
262
+ } else {
263
+ $author = __('Anonymous');
264
+ }
265
+
266
+ return array( 'Name' => $theme, 'Title' => $theme, 'URI' => $theme_uri, 'Description' => $description, 'Author' => $author, 'Author_URI' => $author_uri, 'Version' => $version, 'Template' => $template, 'Status' => $status, 'Tags' => $tags );
267
+ }
268
+
269
+ /*
270
+ * 3.3/3.4 compat
271
+ *
272
+ */
273
+ function tc_get_themes() {
274
+
275
+ if ( ! class_exists( 'WP_Theme' ) )
276
+ return get_themes();
277
+
278
+ global $wp_themes;
279
+ if ( isset( $wp_themes ) )
280
+ return $wp_themes;
281
+
282
+ $themes = wp_get_themes();
283
+ $wp_themes = array();
284
+
285
+ foreach ( $themes as $theme ) {
286
+ $name = $theme->get('Name');
287
+ if ( isset( $wp_themes[ $name ] ) )
288
+ $wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme;
289
+ else
290
+ $wp_themes[ $name ] = $theme;
291
+ }
292
+
293
+ return $wp_themes;
294
+ }
295
+
296
+ function tc_get_theme_data( $theme_file ) {
297
+
298
+ if ( ! class_exists( 'WP_Theme' ) )
299
+ return get_theme_data( $theme_file );
300
+
301
+ $theme = new WP_Theme( basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) );
302
+
303
+ $theme_data = array(
304
+ 'Name' => $theme->get('Name'),
305
+ 'URI' => $theme->display('ThemeURI', true, false),
306
+ 'Description' => $theme->display('Description', true, false),
307
+ 'Author' => $theme->display('Author', true, false),
308
+ 'AuthorURI' => $theme->display('AuthorURI', true, false),
309
+ 'Version' => $theme->get('Version'),
310
+ 'Template' => $theme->get('Template'),
311
+ 'Status' => $theme->get('Status'),
312
+ 'Tags' => $theme->get('Tags'),
313
+ 'Title' => $theme->get('Name'),
314
+ 'AuthorName' => $theme->display('Author', false, false),
315
+ 'License' => $theme->display( 'License', false, false),
316
+ 'License URI' => $theme->display( 'License URI', false, false),
317
+ 'Template Version' => $theme->display( 'Template Version', false, false)
318
+ );
319
+ return $theme_data;
320
+ }
checks/admin_menu.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class AdminMenu implements themecheck {
3
+ protected $error = array();
4
+
5
+ function check( $php_files, $css_files, $other_files) {
6
+
7
+ $ret = true;
8
+
9
+
10
+ //check for levels deprecated in 2.0 in creating menus.
11
+
12
+ $checks = array(
13
+ '/([^_](add_(admin|submenu|menu|dashboard|posts|media|links|pages|comments|theme|plugins|users|management|options)_page)\s?\([^,]*,[^,]*,\s[\'|"]?(level_[0-9]|[0-9])[^;|\r|\r\n]*)/' => __( 'User levels were deprecated in <strong>2.0</strong>. Please see <a href="https://codex.wordpress.org/Roles_and_Capabilities">Roles_and_Capabilities</a>', 'theme-check' ),
14
+ '/[^a-z0-9](current_user_can\s?\(\s?[\'\"]level_[0-9][\'\"]\s?\))[^\r|\r\n]*/' => __( 'User levels were deprecated in <strong>2.0</strong>. Please see <a href="https://codex.wordpress.org/Roles_and_Capabilities">Roles_and_Capabilities</a>', 'theme-check' )
15
+ );
16
+
17
+ foreach ( $php_files as $php_key => $phpfile ) {
18
+ foreach ( $checks as $key => $check ) {
19
+ checkcount();
20
+ if ( preg_match( $key, $phpfile, $matches ) ) {
21
+ $filename = tc_filename( $php_key );
22
+ $grep = ( isset( $matches[2] ) ) ? tc_grep( $matches[2], $php_key ) : tc_grep( $matches[1], $php_key );
23
+ $this->error[] = sprintf('<span class="tc-lead tc-warning">'.__( 'WARNING', 'theme-check' ) . '</span>: <strong>%1$s</strong>. %2$s%3$s', $filename, $check, $grep );
24
+ $ret = false;
25
+ }
26
+ }
27
+ }
28
+
29
+
30
+ // check for add_admin_page's, except for add_theme_page
31
+ // Note to TGMPA: Stop trying to bypass theme check.
32
+
33
+ $checks = array(
34
+ '/(?<!function)[^_>:](add_[^_\'",();]+?_page)/' => __( 'Themes should use <strong>add_theme_page()</strong> for adding admin pages.', 'theme-check' )
35
+ );
36
+
37
+
38
+ foreach ( $php_files as $php_key => $phpfile ) {
39
+ foreach ( $checks as $key => $check ) {
40
+ checkcount();
41
+ if ( preg_match_all( $key, $phpfile, $matches ) ) {
42
+ foreach ($matches[1] as $match) {
43
+ if ($match == 'add_theme_page') {
44
+ continue;
45
+ }
46
+ $filename = tc_filename( $php_key );
47
+ $error = ltrim( rtrim( $match, '(' ) );
48
+ $grep = tc_grep( $error, $php_key );
49
+ $this->error[] = sprintf('<span class="tc-lead tc-required">'.__( 'REQUIRED', 'theme-check' ) .'</span>: <strong>%1$s</strong>. %2$s%3$s', $filename, $check, $grep);
50
+ $ret = false;
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ return $ret;
57
+ }
58
+
59
+ function getError() { return $this->error; }
60
+ }
61
+
62
+ $themechecks[] = new AdminMenu;
checks/artisteer.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class ArtisteerCheck implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files) {
7
+
8
+ // combine all the php files into one string to make it easier to search
9
+ $php = implode( ' ', $php_files );
10
+
11
+ checkcount();
12
+
13
+ $ret = true;
14
+ if (
15
+ strpos( $php, 'art_normalize_widget_style_tokens' ) !== false
16
+ || strpos( $php, 'art_include_lib' ) !== false
17
+ || strpos( $php, '_remove_last_slash($url) {' ) !== false
18
+ || strpos( $php, 'adi_normalize_widget_style_tokens' ) !== false
19
+ || strpos( $php, 'm_normalize_widget_style_tokens' ) !== false
20
+ || strpos ( $php, "bw = '<!--- BEGIN Widget --->';" ) !== false
21
+ || strpos ( $php, "ew = '<!-- end_widget -->';" ) !== false
22
+ || strpos ( $php, "end_widget' => '<!-- end_widget -->'") !== false
23
+ ) {
24
+ $this->error[] = "<span class='tc-lead tc-warning'>" . __('WARNING', 'theme-check' ). "</span>: " . __( 'This theme appears to have been auto-generated. Generated themes are not allowed in the themes directory.', 'theme-check' );
25
+ $ret = false;
26
+ }
27
+
28
+ return $ret;
29
+ }
30
+
31
+ function getError() { return $this->error; }
32
+ }
33
+ $themechecks[] = new ArtisteerCheck;
checks/badthings.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Bad_Checks implements themecheck {
3
+ protected $error = array();
4
+
5
+ function check( $php_files, $css_files, $other_files ) {
6
+ $ret = true;
7
+
8
+ $checks = array(
9
+ '/(?<![_|a-z0-9|\.])eval\s?\(/i' => __( 'eval() is not allowed.', 'theme-check' ),
10
+ '/[^a-z0-9](?<!_)(popen|proc_open|[^_]exec|shell_exec|system|passthru)\(/' => __( 'PHP system calls are often disabled by server admins and should not be in themes', 'theme-check' ),
11
+ '/\s?ini_set\(/' => __( 'Themes should not change server PHP settings', 'theme-check' ),
12
+ '/base64_decode/' => __( 'base64_decode() is not allowed', 'theme-check' ),
13
+ '/base64_encode/' => __( 'base64_encode() is not allowed', 'theme-check' ),
14
+ '/uudecode/ims' => __( 'uudecode() is not allowed', 'theme-check' ),
15
+ '/str_rot13/ims' => __( 'str_rot13() is not allowed', 'theme-check' ),
16
+ '/cx=[0-9]{21}:[a-z0-9]{10}/' => __( 'Google search code detected', 'theme-check' ),
17
+ '/pub-[0-9]{16}/i' => __( 'Google advertising code detected', 'theme-check' )
18
+ );
19
+
20
+ $grep = '';
21
+
22
+ foreach ( $php_files as $php_key => $phpfile ) {
23
+ foreach ( $checks as $key => $check ) {
24
+ checkcount();
25
+ if ( preg_match( $key, $phpfile, $matches ) ) {
26
+ $filename = tc_filename( $php_key );
27
+ $error = ltrim( trim( $matches[0], '(' ) );
28
+ $grep = tc_grep( $error, $php_key );
29
+ $this->error[] = sprintf('<span class="tc-lead tc-warning">'. __( 'WARNING', 'theme-check' ) . '</span>: ' . __( 'Found %1$s in the file %2$s. %3$s. %4$s', 'theme-check' ), '<strong>' . $error . '</strong>', '<strong>' . $filename . '</strong>', $check, $grep );
30
+ $ret = false;
31
+ }
32
+ }
33
+ }
34
+
35
+
36
+ $checks = array(
37
+ '/cx=[0-9]{21}:[a-z0-9]{10}/' => __( 'Google search code detected', 'theme-check' ),
38
+ '/pub-[0-9]{16}/' => __( 'Google advertising code detected', 'theme-check' )
39
+ );
40
+
41
+ foreach ( $other_files as $php_key => $phpfile ) {
42
+ foreach ( $checks as $key => $check ) {
43
+ checkcount();
44
+ if ( preg_match( $key, $phpfile, $matches ) ) {
45
+ $filename = tc_filename( $php_key );
46
+ $error = ltrim( rtrim( $matches[0],'(' ) );
47
+ $grep = tc_grep( $error, $php_key );
48
+ $this->error[] = sprintf(__('<span class="tc-lead tc-warning">WARNING</span>: Found <strong>%1$s</strong> in the file <strong>%2$s</strong>. %3$s.%4$s', 'theme-check'), $error, $filename, $check, $grep);
49
+ $ret = false;
50
+ }
51
+ }
52
+ }
53
+ return $ret;
54
+ }
55
+ function getError() { return $this->error; }
56
+ }
57
+ $themechecks[] = new Bad_Checks;
checks/basic.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // do some basic checks for strings
4
+ class Basic_Checks implements themecheck {
5
+ protected $error = array();
6
+
7
+ function check( $php_files, $css_files, $other_files) {
8
+
9
+ $php = implode( ' ', $php_files );
10
+ $grep = '';
11
+ $ret = true;
12
+
13
+ $checks = array(
14
+ 'DOCTYPE' => __( 'See: <a href="https://codex.wordpress.org/HTML_to_XHTML">https://codex.wordpress.org/HTML_to_XHTML</a><pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"?&gt;</pre>', 'theme-check' ),
15
+ 'wp_footer\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/wp_footer">wp_footer</a><pre> &lt;?php wp_footer(); ?&gt;</pre>', 'theme-check' ),
16
+ 'wp_head\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/wp_head">wp_head</a><pre> &lt;?php wp_head(); ?&gt;</pre>', 'theme-check' ),
17
+ 'language_attributes' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/language_attributes">language_attributes</a><pre>&lt;html &lt;?php language_attributes(); ?&gt;</pre>', 'theme-check' ),
18
+ 'charset' => __( 'There must be a charset defined in the Content-Type or the meta charset tag in the head.', 'theme-check' ),
19
+ 'add_theme_support\s*\(\s?("|\')automatic-feed-links("|\')\s?\)' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/add_theme_support">add_theme_support</a><pre> &lt;?php add_theme_support( $feature ); ?&gt;</pre>', 'theme-check' ),
20
+ 'comments_template\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/comments_template">comments_template</a><pre> &lt;?php comments_template( $file, $separate_comments ); ?&gt;</pre>', 'theme-check' ),
21
+ 'wp_list_comments\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/wp_list_comments">wp_list_comments</a><pre> &lt;?php wp_list_comments( $args ); ?&gt;</pre>', 'theme-check' ),
22
+ 'comment_form\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/comment_form">comment_form</a><pre> &lt;?php comment_form(); ?&gt;</pre>', 'theme-check' ),
23
+ 'body_class\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/body_class">body_class</a><pre> &lt;?php body_class( $class ); ?&gt;</pre>', 'theme-check' ),
24
+ 'wp_link_pages\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/wp_link_pages">wp_link_pages</a><pre> &lt;?php wp_link_pages( $args ); ?&gt;</pre>', 'theme-check' ),
25
+ 'post_class\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/post_class">post_class</a><pre> &lt;div id="post-&lt;?php the_ID(); ?&gt;" &lt;?php post_class(); ?&gt;&gt;</pre>', 'theme-check' )
26
+ );
27
+
28
+ foreach ($checks as $key => $check) {
29
+ checkcount();
30
+ if ( !preg_match( '/' . $key . '/i', $php ) ) {
31
+ if ( $key === 'add_theme_support\s*\(\s?("|\')automatic-feed-links("|\')\s?\)' ) $key = __( 'add_theme_support( \'automatic-feed-links\' )', 'theme-check');
32
+ if ( $key === 'body_class\s*\(' ) $key = __( 'body_class call in body tag', 'theme-check');
33
+ $key = str_replace( '\s*\(', '', $key );
34
+ $this->error[] = sprintf( '<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('Could not find %1$s. %2$s', 'theme-check' ), '<strong>' . $key . '</strong>', $check );
35
+ $ret = false;
36
+ }
37
+ }
38
+
39
+ return $ret;
40
+ }
41
+
42
+ function getError() { return $this->error; }
43
+ }
44
+
45
+ $themechecks[] = new Basic_Checks;
checks/cdn.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Checks for resources being loaded from CDNs.
5
+ */
6
+
7
+ class CDNCheck implements themecheck {
8
+ protected $error = array();
9
+
10
+ function check( $php_files, $css_files, $other_files) {
11
+
12
+ $ret = true;
13
+ $php_code = implode( ' ', $php_files );
14
+
15
+ checkcount();
16
+
17
+ $cdn_list = array(
18
+ 'bootstrap-maxcdn' => 'maxcdn.bootstrapcdn.com/bootstrap',
19
+ 'bootstrap-netdna' => 'netdna.bootstrapcdn.com/bootstrap',
20
+ 'bootswatch-maxcdn' => 'maxcdn.bootstrapcdn.com/bootswatch',
21
+ 'bootswatch-netdna' => 'netdna.bootstrapcdn.com/bootswatch',
22
+ 'font-awesome-maxcdn' => 'maxcdn.bootstrapcdn.com/font-awesome',
23
+ 'font-awesome-netdna' => 'netdna.bootstrapcdn.com/font-awesome',
24
+ 'html5shiv-google' => 'html5shiv.googlecode.com/svn/trunk/html5.js',
25
+ 'html5shiv-maxcdn' => 'oss.maxcdn.com/libs/html5shiv',
26
+ 'jquery' => 'code.jquery.com/jquery-',
27
+ 'respond-js' => 'oss.maxcdn.com/libs/respond.js',
28
+ );
29
+
30
+ foreach( $cdn_list as $cdn_slug => $cdn_url ) {
31
+ if ( false !== strpos( $php_code, $cdn_url ) ) {
32
+ $this->error[] = '<span class="tc-lead tc-recommended">' . __('RECOMMENDED','theme-check') . '</span>: ' . sprintf( __( 'Found the URL of a CDN in the code: %s. You should not load CSS or Javascript resources from a CDN, please bundle them with the theme.', 'theme-check' ), '<code>' . esc_html( $cdn_url ) . '</code>' );
33
+ //$ret = false;
34
+ }
35
+ }
36
+
37
+ return $ret;
38
+ }
39
+
40
+ function getError() { return $this->error; }
41
+ }
42
+ $themechecks[] = new CDNCheck;
checks/comment_reply.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Comment_Reply implements themecheck {
3
+ protected $error = array();
4
+
5
+ function check( $php_files, $css_files, $other_files) {
6
+
7
+ $php = implode( ' ', $php_files );
8
+ $ret = true;
9
+
10
+ checkcount();
11
+
12
+ if ( ! preg_match( '/wp_enqueue_script\(\s?("|\')comment-reply("|\')/i', $php ) ) {
13
+ if ( ! preg_match( '/comment-reply/', $php ) ) {
14
+ $check = __( 'See: <a href="https://codex.wordpress.org/Migrating_Plugins_and_Themes_to_2.7/Enhanced_Comment_Display">Migrating Plugins and Themes to 2.7/Enhanced Comment Display</a><pre> &lt;?php if ( is_singular() ) wp_enqueue_script( "comment-reply" ); ?&gt;</pre>', 'theme-check' );
15
+ $this->error[] = sprintf('<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('Could not find the <strong>comment-reply</strong> script enqueued. %1$s', 'theme-check'), $check);
16
+ $ret = false;
17
+ } else {
18
+ $this->error[] = '<span class="tc-lead tc-info">'.__('INFO','theme-check').'</span>: '.__('Could not find the <strong>comment-reply</strong> script enqueued, however a reference to \'comment-reply\' was found. Make sure that the comment-reply script is being enqueued properly on singular pages.', 'theme-check');
19
+ }
20
+ }
21
+ return $ret;
22
+ }
23
+
24
+ function getError() { return $this->error; }
25
+ }
26
+
27
+ $themechecks[] = new Comment_Reply;
checks/commpage.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CommentPaginationCheck implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+ $ret = true;
8
+
9
+ // combine all the php files into one string to make it easier to search
10
+ $php = implode( ' ', $php_files );
11
+ checkcount();
12
+ if (strpos( $php, 'paginate_comments_links' ) === false &&
13
+ strpos( $php, 'the_comments_navigation' ) === false &&
14
+ (strpos( $php, 'next_comments_link' ) === false && strpos( $php, 'previous_comments_link' ) === false ) ) {
15
+
16
+ $this->error[] = '<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('The theme doesn\'t have comment pagination code in it. Use <strong>paginate_comments_links()</strong> or <strong>the_comments_navigation</strong> or <strong>next_comments_link()</strong> and <strong>previous_comments_link()</strong> to add comment pagination.', 'theme-check' );
17
+ $ret = false;
18
+ }
19
+
20
+ return $ret;
21
+ }
22
+
23
+ function getError() { return $this->error; }
24
+ }
25
+ $themechecks[] = new CommentPaginationCheck;
checks/constants.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Constants implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+
8
+ $ret = true;
9
+
10
+ $checks = array(
11
+ 'STYLESHEETPATH' => 'get_stylesheet_directory()',
12
+ 'TEMPLATEPATH' => 'get_template_directory()',
13
+ 'PLUGINDIR' => 'WP_PLUGIN_DIR',
14
+ 'MUPLUGINDIR' => 'WPMU_PLUGIN_DIR'
15
+ );
16
+
17
+ foreach ( $php_files as $php_key => $phpfile ) {
18
+ foreach ( $checks as $key => $check ) {
19
+ checkcount();
20
+ if ( preg_match( '/[\s|]' . $key . '/', $phpfile, $matches ) ) {
21
+ $filename = tc_filename( $php_key );
22
+ $error = ltrim( rtrim( $matches[0], '(' ) );
23
+ $grep = tc_grep( $error, $php_key );
24
+ $this->error[] = sprintf('<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('%1$s was found in the file %2$s. Use %3$s instead.%4$s', 'theme-check'), '<strong>' . $error . '</strong>', '<strong>' . $filename . '</strong>', '<strong>' . $check . '</strong>', $grep );
25
+ }
26
+ }
27
+ }
28
+ return $ret;
29
+ }
30
+
31
+ function getError() { return $this->error; }
32
+ }
33
+ $themechecks[] = new Constants;
checks/content-width.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class ContentWidthCheck implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+
8
+ $ret = true;
9
+
10
+ // combine all the php files into one string to make it easier to search
11
+ $php = implode( ' ', $php_files );
12
+ checkcount();
13
+ if ( strpos( $php, '$content_width' ) === false && strpos( $php, '$GLOBALS' . "['content_width']" ) === false && !preg_match( '/add_filter\(\s?("|\')embed_defaults/', $php ) && !preg_match( '/add_filter\(\s?("|\')content_width/', $php ) ) {
14
+ $this->error[] = '<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('No content width has been defined. Example: <pre>if ( ! isset( $content_width ) ) $content_width = 900;</pre>', 'theme-check' );
15
+ $ret = false;
16
+ }
17
+
18
+ return $ret;
19
+ }
20
+
21
+ function getError() { return $this->error; }
22
+ }
23
+ $themechecks[] = new ContentWidthCheck;
checks/customizer.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Checks for the Customizer.
5
+ */
6
+
7
+ class CustomizerCheck implements themecheck {
8
+ protected $error = array();
9
+
10
+ function check( $php_files, $css_files, $other_files) {
11
+
12
+ $ret = true;
13
+
14
+ checkcount();
15
+
16
+ /**
17
+ * Check whether every Customizer setting has a sanitization callback set.
18
+ */
19
+ foreach ( $php_files as $file_path => $file_content ) {
20
+ // Get the arguments passed to the add_setting method
21
+ if ( preg_match_all( '/\$wp_customize->add_setting\(([^;]+)/', $file_content, $matches ) ) {
22
+ // The full match is in [0], the match group in [1]
23
+ foreach ( $matches[1] as $match ) {
24
+ // Check if we have sanitize_callback or sanitize_js_callback
25
+ if ( false === strpos( $match, 'sanitize_callback' ) && false === strpos( $match, 'sanitize_js_callback' ) ) {
26
+ $this->error[] = '<span class="tc-lead tc-required">' . __('REQUIRED','theme-check') . '</span>: ' . __( 'Found a Customizer setting that did not have a sanitization callback function. Every call to the <strong>add_setting()</strong> method needs to have a sanitization callback function passed.', 'theme-check' );
27
+ $ret = false;
28
+ } else {
29
+ // There's a callback, check that no empty parameter is passed.
30
+ if ( preg_match( '/[\'"](?:sanitize_callback|sanitize_js_callback)[\'"]\s*=>\s*[\'"]\s*[\'"]/', $match ) ) {
31
+ $this->error[] = '<span class="tc-lead tc-required">' . __('REQUIRED','theme-check') . '</span>: ' . __( 'Found a Customizer setting that had an empty value passed as sanitization callback. You need to pass a function name as sanitization callback.', 'theme-check' );
32
+ $ret = false;
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+
39
+ return $ret;
40
+ }
41
+
42
+ function getError() { return $this->error; }
43
+ }
44
+ $themechecks[] = new CustomizerCheck;
checks/customs.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CustomCheck implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files) {
7
+
8
+ $ret = true;
9
+ $php = implode( ' ', $php_files );
10
+
11
+ checkcount();
12
+
13
+ if ( ! preg_match( '#add_theme_support\s?\(\s?[\'|"]custom-header#', $php ) ) {
14
+ $this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to <strong>add_theme_support( "custom-header", $args )</strong> was found in the theme. It is recommended that the theme implement this functionality if using an image for the header.', 'theme-check' );
15
+ }
16
+
17
+ if ( ! preg_match( '#add_theme_support\s?\(\s?[\'|"]custom-background#', $php ) ) {
18
+ $this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to <strong>add_theme_support( "custom-background", $args )</strong> was found in the theme. If the theme uses background images or solid colors for the background, then it is recommended that the theme implement this functionality.', 'theme-check' );
19
+ }
20
+
21
+ return $ret;
22
+ }
23
+
24
+ function getError() { return $this->error; }
25
+ }
26
+ $themechecks[] = new CustomCheck;
checks/dep_recommend.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // recommended deprecations checks... After some time, these will move into deprecated.php and become required.
3
+ class Deprecated_Recommended implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+ $grep = '';
8
+
9
+ $ret = true;
10
+
11
+ $checks = array(
12
+ array( 'preview_theme' => '', '4.3' ),
13
+ array( '_preview_theme_template_filter' => '', '4.3' ),
14
+ array( '_preview_theme_stylesheet_filter' => '', '4.3' ),
15
+ array( 'preview_theme_ob_filter' => '', '4.3' ),
16
+ array( 'preview_theme_ob_filter_callback' => '', '4.3' ),
17
+ array( 'wp_richedit_pre' => '', '4.3' ),
18
+ array( 'wp_htmledit_pre' => '', '4.3' ),
19
+ array( 'wp_ajax_wp_fullscreen_save_post' => '', '4.3' ),
20
+
21
+ array( 'post_permalink' => 'get_permalink', '4.4'),
22
+ array( 'wp_get_http' => 'WP_Http', '4.4'),
23
+ array( 'force_ssl_login' => 'force_ssl_admin', '4.4'),
24
+ array( 'create_empty_blog' => '', '4.4'),
25
+ array( 'get_admin_users_for_domain' => '', '4.4'),
26
+ array( 'flush_widget_cache' => '', '4.4'),
27
+ );
28
+
29
+ foreach ( $php_files as $php_key => $phpfile ) {
30
+ foreach ( $checks as $alt => $check ) {
31
+ checkcount();
32
+ $version = $check;
33
+ $key = key( $check );
34
+ $alt = $check[ $key ];
35
+ if ( preg_match( '/[\s?]' . $key . '\(/', $phpfile, $matches ) ) {
36
+ $filename = tc_filename( $php_key );
37
+ $error = ltrim( rtrim( $matches[0], '(' ) );
38
+ $version = $check[0];
39
+ $grep = tc_grep( $error, $php_key );
40
+
41
+ // Point out the deprecated function.
42
+ $error_msg = sprintf(
43
+ __( '%1$s found in the file %2$s. Deprecated since version %3$s.', 'theme-check' ),
44
+ '<strong>' . $error . '()</strong>',
45
+ '<strong>' . $filename . '</strong>',
46
+ '<strong>' . $version . '</strong>'
47
+ );
48
+
49
+ // Add alternative function when available.
50
+ if ( $alt ) {
51
+ $error_msg .= ' ' . sprintf( __( 'Use %s instead.', 'theme-check' ), '<strong>' . $alt . '</strong>' );
52
+ }
53
+
54
+ // Add the precise code match that was found.
55
+ $error_msg .= $grep;
56
+
57
+ // Add the finalized error message.
58
+ $this->error[] = '<span class="tc-lead tc-recommended">' . __('RECOMMENDED','theme-check') . '</span>: ' . $error_msg;
59
+ }
60
+ }
61
+ }
62
+ return $ret;
63
+ }
64
+
65
+ function getError() { return $this->error; }
66
+ }
67
+ $themechecks[] = new Deprecated_Recommended;
checks/deprecated.php ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Deprecated implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+ $grep = '';
8
+
9
+ $ret = true;
10
+
11
+ $checks = array(
12
+ // start wp-includes deprecated
13
+ array( 'get_postdata' => 'get_post()', '1.5.1' ),
14
+ array( 'start_wp' => 'the Loop', '1.5' ),
15
+ array( 'the_category_id' => 'get_the_category()', '0.71' ),
16
+ array( 'the_category_head' => 'get_the_category_by_ID()', '0.71' ),
17
+ array( 'previous_post' => 'previous_post_link()', '2.0' ),
18
+ array( 'next_post' => 'next_post_link()', '2.0' ),
19
+ array( 'user_can_create_post' => 'current_user_can()', '2.0' ),
20
+ array( 'user_can_create_draft' => 'current_user_can()', '2.0' ),
21
+ array( 'user_can_edit_post' => 'current_user_can()', '2.0' ),
22
+ array( 'user_can_delete_post' => 'current_user_can()', '2.0' ),
23
+ array( 'user_can_set_post_date' => 'current_user_can()', '2.0' ),
24
+ array( 'user_can_edit_post_comments' => 'current_user_can()', '2.0' ),
25
+ array( 'user_can_delete_post_comments' => 'current_user_can()', '2.0' ),
26
+ array( 'user_can_edit_user' => 'current_user_can()', '2.0' ),
27
+ array( 'get_linksbyname' => 'get_bookmarks()', '2.1' ),
28
+ array( 'wp_get_linksbyname' => 'wp_list_bookmarks()', '2.1' ),
29
+ array( 'get_linkobjectsbyname' => 'get_bookmarks()', '2.1' ),
30
+ array( 'get_linkobjects' => 'get_bookmarks()', '2.1' ),
31
+ array( 'get_linksbyname_withrating' => 'get_bookmarks()', '2.1' ),
32
+ array( 'get_links_withrating' => 'get_bookmarks()', '2.1' ),
33
+ array( 'get_autotoggle' => '', '2.1' ),
34
+ array( 'list_cats' => 'wp_list_categories', '2.1' ),
35
+ array( 'wp_list_cats' => 'wp_list_categories', '2.1' ),
36
+ array( 'dropdown_cats' => 'wp_dropdown_categories()', '2.1' ),
37
+ array( 'list_authors' => 'wp_list_authors()', '2.1' ),
38
+ array( 'wp_get_post_cats' => 'wp_get_post_categories()', '2.1' ),
39
+ array( 'wp_set_post_cats' => 'wp_set_post_categories()', '2.1' ),
40
+ array( 'get_archives' => 'wp_get_archives', '2.1' ),
41
+ array( 'get_author_link' => 'get_author_posts_url()', '2.1' ),
42
+ array( 'link_pages' => 'wp_link_pages()', '2.1' ),
43
+ array( 'get_settings' => 'get_option()', '2.1' ),
44
+ array( 'permalink_link' => 'the_permalink()', '1.2' ),
45
+ array( 'permalink_single_rss' => 'permalink_rss()', '2.3' ),
46
+ array( 'wp_get_links' => 'wp_list_bookmarks()', '2.1' ),
47
+ array( 'get_links' => 'get_bookmarks()', '2.1' ),
48
+ array( 'get_links_list' => 'wp_list_bookmarks()', '2.1' ),
49
+ array( 'links_popup_script' => '', '2.1' ),
50
+ array( 'get_linkrating' => 'sanitize_bookmark_field()', '2.1' ),
51
+ array( 'get_linkcatname' => 'get_category()', '2.1' ),
52
+ array( 'comments_rss_link' => 'post_comments_feed_link()', '2.5' ),
53
+ array( 'get_category_rss_link' => 'get_category_feed_link()'. '2.5' ),
54
+ array( 'get_author_rss_link' => 'get_author_feed_link()', '2.5' ),
55
+ array( 'comments_rss' => 'get_post_comments_feed_link()', '2.2' ),
56
+ array( 'create_user' => 'wp_create_user()', '2.0' ),
57
+ array( 'gzip_compression' => '', '2.5' ),
58
+ array( 'get_commentdata' => 'get_comment()', '2.7' ),
59
+ array( 'get_catname' => 'get_cat_name()', '2.8' ),
60
+ array( 'get_category_children' => 'get_term_children', '2.8' ),
61
+ array( 'get_the_author_description' => 'get_the_author_meta(\'description\')', '2.8' ),
62
+ array( 'the_author_description' => 'the_author_meta(\'description\')', '2.8' ),
63
+ array( 'get_the_author_login' => 'the_author_meta(\'login\')', '2.8' ),
64
+ array( 'get_the_author_firstname' => 'get_the_author_meta(\'first_name\')', '2.8' ),
65
+ array( 'the_author_firstname' => 'the_author_meta(\'first_name\')', '2.8' ),
66
+ array( 'get_the_author_lastname' => 'get_the_author_meta(\'last_name\')', '2.8' ),
67
+ array( 'the_author_lastname' => 'the_author_meta(\'last_name\')', '2.8' ),
68
+ array( 'get_the_author_nickname' => 'get_the_author_meta(\'nickname\')', '2.8' ),
69
+ array( 'the_author_nickname' => 'the_author_meta(\'nickname\')', '2.8' ),
70
+ array( 'get_the_author_email' => 'get_the_author_meta(\'email\')', '2.8' ),
71
+ array( 'the_author_email' => 'the_author_meta(\'email\')', '2.8' ),
72
+ array( 'get_the_author_icq' => 'get_the_author_meta(\'icq\')', '2.8' ),
73
+ array( 'the_author_icq' => 'the_author_meta(\'icq\')', '2.8' ),
74
+ array( 'get_the_author_yim' => 'get_the_author_meta(\'yim\')', '2.8' ),
75
+ array( 'the_author_yim' => 'the_author_meta(\'yim\')', '2.8' ),
76
+ array( 'get_the_author_msn' => 'get_the_author_meta(\'msn\')', '2.8' ),
77
+ array( 'the_author_msn' => 'the_author_meta(\'msn\')', '2.8' ),
78
+ array( 'get_the_author_aim' => 'get_the_author_meta(\'aim\')', '2.8' ),
79
+ array( 'the_author_aim' => 'the_author_meta(\'aim\')', '2.8' ),
80
+ array( 'get_author_name' => 'get_the_author_meta(\'display_name\')', '2.8' ),
81
+ array( 'get_the_author_url' => 'get_the_author_meta(\'url\')', '2.8' ),
82
+ array( 'the_author_url' => 'the_author_meta(\'url\')', '2.8' ),
83
+ array( 'get_the_author_ID' => 'get_the_author_meta(\'ID\')', '2.8' ),
84
+ array( 'the_author_ID' => 'the_author_meta(\'ID\')', '2.8' ),
85
+ array( 'the_content_rss' => 'the_content_feed()', '2.9' ),
86
+ array( 'make_url_footnote' => '', '2.9' ),
87
+ array( '_c' => '_x()', '2.9' ),
88
+ array( 'translate_with_context' => '_x()', '3.0' ),
89
+ array( 'nc' => 'nx()', '3.0' ),
90
+ array( '__ngettext' => '_n_noop()', '2.8' ),
91
+ array( '__ngettext_noop' => '_n_noop()', '2.8' ),
92
+ array( 'get_alloptions' => 'wp_load_alloptions()', '3.0' ),
93
+ array( 'get_the_attachment_link' => 'wp_get_attachment_link()', '2.5' ),
94
+ array( 'get_attachment_icon_src' => 'wp_get_attachment_image_src()', '2.5' ),
95
+ array( 'get_attachment_icon' => 'wp_get_attachment_image()', '2.5' ),
96
+ array( 'get_attachment_innerhtml' => 'wp_get_attachment_image()', '2.5' ),
97
+ array( 'get_link' => 'get_bookmark()', '2.1' ),
98
+ array( 'sanitize_url' => 'esc_url()', '2.8' ),
99
+ array( 'clean_url' => 'esc_url()', '3.0' ),
100
+ array( 'js_escape' => 'esc_js()', '2.8' ),
101
+ array( 'wp_specialchars' => 'esc_html()', '2.8' ),
102
+ array( 'attribute_escape' => 'esc_attr()', '2.8' ),
103
+ array( 'register_sidebar_widget' => 'wp_register_sidebar_widget()', '2.8' ),
104
+ array( 'unregister_sidebar_widget' => 'wp_unregister_sidebar_widget()', '2.8' ),
105
+ array( 'register_widget_control' => 'wp_register_widget_control()', '2.8' ),
106
+ array( 'unregister_widget_control' => 'wp_unregister_widget_control()', '2.8' ),
107
+ array( 'delete_usermeta' => 'delete_user_meta()', '3.0' ),
108
+ array( 'get_usermeta' => 'get_user_meta()', '3.0' ),
109
+ array( 'update_usermeta' => 'update_user_meta()', '3.0' ),
110
+ array( 'automatic_feed_links' => 'add_theme_support( \'automatic-feed-links\' )', '3.0' ),
111
+ array( 'get_profile' => 'get_the_author_meta()', '3.0' ),
112
+ array( 'get_usernumposts' => 'count_user_posts()', '3.0' ),
113
+ array( 'funky_javascript_callback' => '', '3.0' ),
114
+ array( 'funky_javascript_fix' => '', '3.0' ),
115
+ array( 'is_taxonomy' => 'taxonomy_exists()', '3.0' ),
116
+ array( 'is_term' => 'term_exists()', '3.0' ),
117
+ array( 'is_plugin_page' => '$plugin_page and/or get_plugin_page_hookname() hooks', '3.1' ),
118
+ array( 'update_category_cache' => 'No alternatives', '3.1' ),
119
+ array( 'get_users_of_blog' => 'get_users()', '3.1' ),
120
+ array( 'wp_timezone_supported' => '', '3.2' ),
121
+ array( 'the_editor' => 'wp_editor', '3.3' ),
122
+ array( 'get_user_metavalues' => '', '3.3' ),
123
+ array( 'sanitize_user_object' => '', '3.3' ),
124
+ array( 'get_boundary_post_rel_link' => '', '3.3' ),
125
+ array( 'start_post_rel_link' => 'none available ', '3.3' ),
126
+ array( 'get_index_rel_link' => '', '3.3' ),
127
+ array( 'index_rel_link' => '', '3.3' ),
128
+ array( 'get_parent_post_rel_link' => '', '3.3' ),
129
+ array( 'parent_post_rel_link' => '', '3.3' ),
130
+ array( 'wp_admin_bar_dashboard_view_site_menu' => '', '3.3' ),
131
+ array( 'is_blog_user' => 'is_member_of_blog()', '3.3' ),
132
+ array( 'debug_fopen' => 'error_log()', '3.3' ),
133
+ array( 'debug_fwrite' => 'error_log()', '3.3' ),
134
+ array( 'debug_fclose' => 'error_log()', '3.3' ),
135
+ array( 'get_themes' => 'wp_get_themes()', '3.4' ),
136
+ array( 'get_theme' => 'wp_get_theme()', '3.4' ),
137
+ array( 'get_current_theme' => 'wp_get_theme()', '3.4' ),
138
+ array( 'clean_pre' => '', '3.4' ),
139
+ array( 'add_custom_image_header' => 'add_theme_support( \'custom-header\', $args )', '3.4' ),
140
+ array( 'remove_custom_image_header' => 'remove_theme_support( \'custom-header\' )', '3.4' ),
141
+ array( 'add_custom_background' => 'add_theme_support( \'custom-background\', $args )', '3.4' ),
142
+ array( 'remove_custom_background' => 'remove_theme_support( \'custom-background\' )', '3.4' ),
143
+ array( 'get_theme_data' => 'wp_get_theme()', '3.4' ),
144
+ array( 'update_page_cache' => 'update_post_cache()', '3.4' ),
145
+ array( 'clean_page_cache' => 'clean_post_cache()', '3.4' ),
146
+ array( 'wp_explain_nonce' => 'wp_nonce_ays', '3.4.1' ),
147
+ array( 'sticky_class' => 'post_class()', '3.5' ),
148
+ array( '_get_post_ancestors' => '', '3.5' ),
149
+ array( 'wp_load_image' => 'wp_get_image_editor()', '3.5' ),
150
+ array( 'image_resize' => 'wp_get_image_editor()', '3.5' ),
151
+ array( 'wp_get_single_post' => 'get_post()', '3.5' ),
152
+ array( 'user_pass_ok' => 'wp_authenticate()', '3.5' ),
153
+ array( '_save_post_hook' => '', '3.5' ),
154
+ array( 'gd_edit_image_support' => 'wp_image_editor_supports', '3.5' ),
155
+ array( 'get_user_id_from_string' => 'get_user_by()', '3.6' ),
156
+ array( 'wp_convert_bytes_to_hr' => 'size_format()', '3.6' ),
157
+
158
+ array( 'tinymce_include' => 'wp_tiny_mce()', '2.1' ),
159
+
160
+ array( 'documentation_link' => '', '2.5' ),
161
+
162
+ array( 'dropdown_categories' => 'wp_category_checklist()','2.6' ),
163
+ array( 'dropdown_link_categories' => 'wp_link_category_checklist()','2.6' ),
164
+
165
+ array( 'wp_dropdown_cats' => 'wp_dropdown_categories()','3.0' ),
166
+ array( 'add_option_update_handler' => 'register_setting()','3.0' ),
167
+ array( 'remove_option_update_handler' => 'unregister_setting()','3.0' ),
168
+ array( 'codepress_get_lang' => '','3.0' ),
169
+ array( 'codepress_footer_js' => '','3.0' ),
170
+ array( 'use_codepress' => '','3.0' ),
171
+ array( 'wp_shrink_dimensions' => 'wp_constrain_dimensions()','3.0' ),
172
+
173
+ array( 'get_author_user_ids' => '','3.1' ),
174
+ array( 'get_editable_authors' => '','3.1' ),
175
+ array( 'get_editable_user_ids' => '','3.1' ),
176
+ array( 'get_nonauthor_user_ids' => '','3.1' ),
177
+ array( 'WP_User_Search' => 'WP_User_Query','3.1' ),
178
+ array( 'get_others_unpublished_posts' => '','3.1' ),
179
+ array( 'get_others_drafts' => '','3.1' ),
180
+ array( 'get_others_pending' => '', '3.1' ),
181
+
182
+ array( 'wp_dashboard_quick_press()' => '', '3.2' ),
183
+ array( 'wp_tiny_mce' => 'wp_editor', '3.2' ),
184
+ array( 'wp_preload_dialogs' => 'wp_editor()', '3.2' ),
185
+ array( 'wp_print_editor_js' => 'wp_editor()', '3.2' ),
186
+ array( 'wp_quicktags' => 'wp_editor()', '3.2' ),
187
+ array( 'favorite_actions' => 'WP_Admin_Bar', '3.2' ),
188
+
189
+ array( 'screen_layout' => '$current_screen->render_screen_layout()', '3.3' ),
190
+ array( 'screen_options' => '$current_screen->render_per_page_options()', '3.3' ),
191
+ array( 'screen_meta' => ' $current_screen->render_screen_meta()', '3.3' ),
192
+ array( 'media_upload_image' => 'wp_media_upload_handler()', '3.3' ),
193
+ array( 'media_upload_audio' => 'wp_media_upload_handler()', '3.3' ),
194
+ array( 'media_upload_video' => 'wp_media_upload_handler()', '3.3' ),
195
+ array( 'media_upload_file' => 'wp_media_upload_handler()', '3.3' ),
196
+ array( 'type_url_form_image' => 'wp_media_insert_url_form( \'image\' )', '3.3' ),
197
+ array( 'type_url_form_audio' => 'wp_media_insert_url_form( \'audio\' )', '3.3' ),
198
+ array( 'type_url_form_video' => 'wp_media_insert_url_form( \'video\' )', '3.3' ),
199
+ array( 'type_url_form_file' => 'wp_media_insert_url_form( \'file\' )', '3.3' ),
200
+ array( 'add_contextual_help' => 'get_current_screen()->add_help_tab()', '3.3' ),
201
+
202
+ array( 'get_allowed_themes' => 'wp_get_themes( array( \'allowed\' => true ) )', '3.4' ),
203
+ array( 'get_broken_themes' => 'wp_get_themes( array( \'errors\' => true )', '3.4' ),
204
+ array( 'current_theme_info' => 'wp_get_theme()', '3.4' ),
205
+
206
+ array( '_insert_into_post_button' => '', '3.5' ),
207
+ array( '_media_button' => '', '3.5' ),
208
+ array( 'get_post_to_edit' => 'get_post()', '3.5' ),
209
+ array( 'get_default_page_to_edit' => 'get_default_post_to_edit()', '3.5' ),
210
+ array( 'wp_create_thumbnail' => 'image_resize()', '3.5' ),
211
+
212
+ array( 'wp_nav_menu_locations_meta_box' => '', '3.6' ),
213
+
214
+ array( 'the_attachment_links' => '', '3.7'),
215
+ array( 'wp_update_core' => 'new Core_Upgrader()', '3.7'),
216
+ array( 'wp_update_plugin' => 'new Plugin_Upgrader()', '3.7'),
217
+ array( 'wp_update_theme' => 'new Theme_Upgrader()', '3.7'),
218
+ array( '_search_terms_tidy' => '', '3.7' ),
219
+ array( 'get_blogaddress_by_domain' => '', '3.7' ),
220
+
221
+ array( 'get_screen_icon' => '', '3.8' ),
222
+ array( 'screen_icon' => '', '3.8' ),
223
+ array( 'wp_dashboard_incoming_links' => '', '3.8' ),
224
+ array( 'wp_dashboard_incoming_links_control' => '', '3.8' ),
225
+ array( 'wp_dashboard_incoming_links_output' => '', '3.8' ),
226
+ array( 'wp_dashboard_plugins' => '', '3.8' ),
227
+ array( 'wp_dashboard_primary_control' => '', '3.8' ),
228
+ array( 'wp_dashboard_recent_comments_control' => '', '3.8' ),
229
+ array( 'wp_dashboard_secondary' => '', '3.8' ),
230
+ array( 'wp_dashboard_secondary_control' => '', '3.8' ),
231
+ array( 'wp_dashboard_secondary_output' => '', '3.8' ),
232
+
233
+ array( 'rich_edit_exists' => '', '3.9'),
234
+ array( 'default_topic_count_text' => '', '3.9'),
235
+ array( 'format_to_post' => '', '3.9'),
236
+ array( 'get_current_site_name' => 'get_current_site()', '3.9'),
237
+ array( 'wpmu_current_site' => '', '3.9'),
238
+ array( '_relocate_children' => '', '3.9' ),
239
+
240
+ array( 'get_all_category_ids' => 'get_terms()', '4.0' ),
241
+ array( 'like_escape' => 'wpdb::esc_like()', '4.0' ),
242
+ array( 'url_is_accessable_via_ssl' => '', '4.0' ),
243
+ array( 'get_all_category_ids' => 'get_terms()', '4.0' ),
244
+ array( 'like_escape' => 'wpdb::esc_like()', '4.0' ),
245
+ array( 'url_is_accessable_via_ssl' => '', '4.0' ),
246
+
247
+ array( 'prepare_control' => '', '4.1' ),
248
+ array( 'add_tab' => '', '4.1' ),
249
+ array( 'remove_tab' => '', '4.1' ),
250
+ array( 'print_tab_image' => '', '4.1' ),
251
+
252
+ array( 'setup_widget_addition_previews' => 'customize_dynamic_setting_args', '4.2' ),
253
+ array( 'prepreview_added_sidebars_widgets' => 'customize_dynamic_setting_args', '4.2' ),
254
+ array( 'prepreview_added_widget_instance' => 'customize_dynamic_setting_args', '4.2' ),
255
+ array( 'remove_prepreview_filters' => 'customize_dynamic_setting_args', '4.2' ),
256
+
257
+ );
258
+ foreach ( $php_files as $php_key => $phpfile ) {
259
+ foreach ( $checks as $alt => $check ) {
260
+ checkcount();
261
+ $key = key( $check );
262
+ $alt = $check[ $key ];
263
+ if ( preg_match( '/(?<!function)[\s?]' . $key . '\s?\(/', $phpfile, $matches ) ) {
264
+ $filename = tc_filename( $php_key );
265
+ $error = ltrim( rtrim( $matches[0], '(' ) );
266
+ $version = $check[0];
267
+ $grep = tc_grep( $error, $php_key );
268
+
269
+ // Point out the deprecated function.
270
+ $error_msg = sprintf(
271
+ __( '%1$s found in the file %2$s. Deprecated since version %3$s.', 'theme-check' ),
272
+ '<strong>' . $error . '()</strong>',
273
+ '<strong>' . $filename . '</strong>',
274
+ '<strong>' . $version . '</strong>'
275
+ );
276
+
277
+ // Add alternative function when available.
278
+ if ( $alt ) {
279
+ $error_msg .= ' ' . sprintf( __( 'Use %s instead.', 'theme-check' ), '<strong>' . $alt . '</strong>' );
280
+ }
281
+
282
+ // Add the precise code match that was found.
283
+ $error_msg .= $grep;
284
+
285
+ // Add the finalized error message.
286
+ $this->error[] = '<span class="tc-lead tc-required">' . __('REQUIRED','theme-check') . '</span>: ' . $error_msg;
287
+
288
+ $ret = false;
289
+ }
290
+ }
291
+ }
292
+ return $ret;
293
+ }
294
+
295
+ function getError() { return $this->error; }
296
+ }
297
+ $themechecks[] = new Deprecated;
checks/directories.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class DirectoriesCheck implements themecheck {
4
+ protected $error = array();
5
+
6
+ function check( $php_files, $css_files, $other_files ) {
7
+
8
+ $ret = true;
9
+ $found = false;
10
+
11
+ foreach ( $php_files as $name => $file ) {
12
+ checkcount();
13
+ if ( strpos( $name, '.git' ) !== false || strpos( $name, '.svn' ) !== false ) $found = true;
14
+ }
15
+
16
+ foreach ( $css_files as $name => $file ) {
17
+ checkcount();
18
+ if ( strpos( $name, '.git' ) !== false || strpos( $name, '.svn' ) !== false || strpos( $name, '.hg' ) !== false || strpos( $name, '.bzr' ) !== false ) $found = true;
19
+ }
20
+
21
+ foreach ( $other_files as $name => $file ) {
22
+ checkcount();
23
+ if ( strpos( $name, '.git' ) !== false || strpos( $name, '.svn' ) !== false || strpos( $name, '.hg' ) !== false || strpos( $name, '.bzr' ) !== false ) $found = true;
24
+ }
25
+
26
+ if ($found) {
27
+ $this->error[] = sprintf('<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check' ) . '</span>: ' . __( 'Please remove any extraneous directories like .git or .svn from the ZIP file before uploading it.', 'theme-check') );
28
+ $ret = false;
29
+ }
30
+
31
+ return $ret;
32
+ }
33
+
34
+ function getError() { return $this->error; }
35
+ }
36
+ $themechecks[] = new DirectoriesCheck;
checks/editorstyle.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+