Version Description
Download this release
Release Info
Developer | Otto42 |
Plugin | Theme Check |
Version | 20150818.1 |
Comparing to | |
See all releases |
Version 20150818.1
- assets/gray-grad.png +0 -0
- assets/style.css +77 -0
- checkbase.php +317 -0
- checks/admin_menu.php +62 -0
- checks/artisteer.php +33 -0
- checks/badthings.php +57 -0
- checks/basic.php +45 -0
- checks/cdn.php +42 -0
- checks/comment_reply.php +27 -0
- checks/commpage.php +24 -0
- checks/constants.php +33 -0
- checks/content-width.php +23 -0
- checks/customizer.php +44 -0
- checks/customs.php +26 -0
- checks/dep_recommend.php +60 -0
- checks/deprecated.php +290 -0
- checks/directories.php +36 -0
- checks/editorstyle.php +21 -0
- checks/filenames.php +66 -0
- checks/gravatar.php +24 -0
- checks/i18n.php +64 -0
- checks/iframes.php +29 -0
- checks/include.php +29 -0
- checks/lineendings.php +43 -0
- checks/links.php +34 -0
- checks/malware.php +34 -0
- checks/more_deprecated.php +64 -0
- checks/navmenu.php +23 -0
- checks/nonprintable.php +27 -0
- checks/phpshort.php +25 -0
- checks/plugin-territory.php +41 -0
- checks/post-formats.php +38 -0
- checks/postsnav.php +28 -0
- checks/postthumb.php +27 -0
- checks/required.php +31 -0
- checks/screenshot.php +43 -0
- checks/searchform.php +26 -0
- checks/style_needed.php +40 -0
- checks/style_suggested.php +29 -0
- checks/style_tags.php +38 -0
- checks/suggested.php +43 -0
- checks/tags.php +22 -0
- checks/textdomain.php +141 -0
- checks/time_date.php +31 -0
- checks/title.php +59 -0
- checks/widgets.php +42 -0
- checks/worms.php +33 -0
- lang/theme-check.pot +947 -0
- main.php +136 -0
- readme.txt +176 -0
- theme-check.php +73 -0
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 |
+
}
|
checkbase.php
ADDED
@@ -0,0 +1,317 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 = ( FALSE !== ( $pos = strpos( $this_line, $error ) ) ? substr( $this_line, 0, $pos ) : FALSE );
|
115 |
+
$pre = ltrim( htmlspecialchars( $pre ) );
|
116 |
+
$bad_lines .= "<pre class='tc-grep'>" . __("Line ", "theme-check") . ( $line_index+1 ) . ": " . $pre . htmlspecialchars( substr( stristr( $this_line, $error ), 0, 75 ) ) . "</pre>";
|
117 |
+
}
|
118 |
+
$line_index++;
|
119 |
+
|
120 |
+
}
|
121 |
+
return str_replace( $error, '<span class="tc-grep">' . $error . '</span>', $bad_lines );
|
122 |
+
}
|
123 |
+
|
124 |
+
function tc_strxchr($haystack, $needle, $l_inclusive = 0, $r_inclusive = 0){
|
125 |
+
if(strrpos($haystack, $needle)){
|
126 |
+
//Everything before last $needle in $haystack.
|
127 |
+
$left = substr($haystack, 0, strrpos($haystack, $needle) + $l_inclusive);
|
128 |
+
//Switch value of $r_inclusive from 0 to 1 and viceversa.
|
129 |
+
$r_inclusive = ($r_inclusive == 0) ? 1 : 0;
|
130 |
+
//Everything after last $needle in $haystack.
|
131 |
+
$right = substr(strrchr($haystack, $needle), $r_inclusive);
|
132 |
+
//Return $left and $right into an array.
|
133 |
+
return array($left, $right);
|
134 |
+
} else {
|
135 |
+
if(strrchr($haystack, $needle)) return array('', substr(strrchr($haystack, $needle), $r_inclusive));
|
136 |
+
else return false;
|
137 |
+
}
|
138 |
+
}
|
139 |
+
|
140 |
+
function tc_filename( $file ) {
|
141 |
+
$filename = ( preg_match( '/themes\/[a-z0-9]*\/(.*)/', $file, $out ) ) ? $out[1] : basename( $file );
|
142 |
+
return $filename;
|
143 |
+
}
|
144 |
+
|
145 |
+
function tc_trac( $e ) {
|
146 |
+
$trac_left = array( '<strong>', '</strong>' );
|
147 |
+
$trac_right= array( "'''", "'''" );
|
148 |
+
$html_link = '/<a\s?href\s?=\s?[\'|"]([^"|\']*)[\'|"]>([^<]*)<\/a>/i';
|
149 |
+
$html_new = '[$1 $2]';
|
150 |
+
if ( defined( 'TC_TRAC' ) ) {
|
151 |
+
$e = preg_replace( $html_link, $html_new, $e );
|
152 |
+
$e = str_replace( $trac_left, $trac_right, $e );
|
153 |
+
$e = preg_replace( '/<pre.*?>/', "\r\n{{{\r\n", $e );
|
154 |
+
$e = str_replace( '</pre>', "\r\n}}}\r\n", $e );
|
155 |
+
}
|
156 |
+
return $e;
|
157 |
+
}
|
158 |
+
|
159 |
+
function listdir( $dir ) {
|
160 |
+
$files = array();
|
161 |
+
$dir_iterator = new RecursiveDirectoryIterator( $dir );
|
162 |
+
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
|
163 |
+
|
164 |
+
foreach ($iterator as $file) {
|
165 |
+
array_push( $files, $file->getPathname() );
|
166 |
+
}
|
167 |
+
return $files;
|
168 |
+
}
|
169 |
+
|
170 |
+
function old_listdir( $start_dir='.' ) {
|
171 |
+
$files = array();
|
172 |
+
if ( is_dir( $start_dir ) ) {
|
173 |
+
$fh = opendir( $start_dir );
|
174 |
+
while ( ( $file = readdir( $fh ) ) !== false ) {
|
175 |
+
# loop through the files, skipping . and .., and recursing if necessary
|
176 |
+
if ( strcmp( $file, '.' )==0 || strcmp( $file, '..' )==0 ) continue;
|
177 |
+
$filepath = $start_dir . '/' . $file;
|
178 |
+
if ( is_dir( $filepath ) )
|
179 |
+
$files = array_merge( $files, listdir( $filepath ) );
|
180 |
+
else
|
181 |
+
array_push( $files, $filepath );
|
182 |
+
}
|
183 |
+
closedir( $fh );
|
184 |
+
|
185 |
+
} else {
|
186 |
+
|
187 |
+
# false if the function was called with an invalid non-directory argument
|
188 |
+
$files = false;
|
189 |
+
}
|
190 |
+
return $files;
|
191 |
+
}
|
192 |
+
|
193 |
+
function tc_print_r( $data ) {
|
194 |
+
$out = "\n<pre class='html-print-r'";
|
195 |
+
$out .= " style='border: 1px solid #ccc; padding: 7px;'>\n";
|
196 |
+
$out .= esc_html( print_r( $data, TRUE ) );
|
197 |
+
$out .= "\n</pre>\n";
|
198 |
+
echo $out;
|
199 |
+
}
|
200 |
+
|
201 |
+
function get_theme_data_from_contents( $theme_data ) {
|
202 |
+
$themes_allowed_tags = array(
|
203 |
+
'a' => array(
|
204 |
+
'href' => array(),'title' => array()
|
205 |
+
),
|
206 |
+
'abbr' => array(
|
207 |
+
'title' => array()
|
208 |
+
),
|
209 |
+
'acronym' => array(
|
210 |
+
'title' => array()
|
211 |
+
),
|
212 |
+
'code' => array(),
|
213 |
+
'em' => array(),
|
214 |
+
'strong' => array()
|
215 |
+
);
|
216 |
+
|
217 |
+
$theme_data = str_replace ( '\r', '\n', $theme_data );
|
218 |
+
preg_match( '|^[ \t\/*#@]*Theme Name:(.*)$|mi', $theme_data, $theme_name );
|
219 |
+
preg_match( '|^[ \t\/*#@]*Theme URI:(.*)$|mi', $theme_data, $theme_uri );
|
220 |
+
preg_match( '|^[ \t\/*#@]*Description:(.*)$|mi', $theme_data, $description );
|
221 |
+
|
222 |
+
if ( preg_match( '|^[ \t\/*#@]*Author URI:(.*)$|mi', $theme_data, $author_uri ) )
|
223 |
+
$author_uri = esc_url( trim( $author_uri[1]) );
|
224 |
+
else
|
225 |
+
$author_uri = '';
|
226 |
+
|
227 |
+
if ( preg_match( '|^[ \t\/*#@]*Template:(.*)$|mi', $theme_data, $template ) )
|
228 |
+
$template = wp_kses( trim( $template[1] ), $themes_allowed_tags );
|
229 |
+
else
|
230 |
+
$template = '';
|
231 |
+
|
232 |
+
if ( preg_match( '|^[ \t\/*#@]*Version:(.*)|mi', $theme_data, $version ) )
|
233 |
+
$version = wp_kses( trim( $version[1] ), $themes_allowed_tags );
|
234 |
+
else
|
235 |
+
$version = '';
|
236 |
+
|
237 |
+
if ( preg_match('|^[ \t\/*#@]*Status:(.*)|mi', $theme_data, $status) )
|
238 |
+
$status = wp_kses( trim( $status[1] ), $themes_allowed_tags );
|
239 |
+
else
|
240 |
+
$status = 'publish';
|
241 |
+
|
242 |
+
if ( preg_match('|^[ \t\/*#@]*Tags:(.*)|mi', $theme_data, $tags) )
|
243 |
+
$tags = array_map( 'trim', explode( ',', wp_kses( trim( $tags[1] ), array() ) ) );
|
244 |
+
else
|
245 |
+
$tags = array();
|
246 |
+
|
247 |
+
$theme = ( isset( $theme_name[1] ) ) ? wp_kses( trim( $theme_name[1] ), $themes_allowed_tags ) : '';
|
248 |
+
|
249 |
+
$theme_uri = ( isset( $theme_uri[1] ) ) ? esc_url( trim( $theme_uri[1] ) ) : '';
|
250 |
+
|
251 |
+
$description = ( isset( $description[1] ) ) ? wp_kses( trim( $description[1] ), $themes_allowed_tags ) : '';
|
252 |
+
|
253 |
+
if ( preg_match( '|^[ \t\/*#@]*Author:(.*)$|mi', $theme_data, $author_name ) ) {
|
254 |
+
if ( empty( $author_uri ) ) {
|
255 |
+
$author = wp_kses( trim( $author_name[1] ), $themes_allowed_tags );
|
256 |
+
} else {
|
257 |
+
$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 ) );
|
258 |
+
}
|
259 |
+
} else {
|
260 |
+
$author = __('Anonymous');
|
261 |
+
}
|
262 |
+
|
263 |
+
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 );
|
264 |
+
}
|
265 |
+
|
266 |
+
/*
|
267 |
+
* 3.3/3.4 compat
|
268 |
+
*
|
269 |
+
*/
|
270 |
+
function tc_get_themes() {
|
271 |
+
|
272 |
+
if ( ! class_exists( 'WP_Theme' ) )
|
273 |
+
return get_themes();
|
274 |
+
|
275 |
+
global $wp_themes;
|
276 |
+
if ( isset( $wp_themes ) )
|
277 |
+
return $wp_themes;
|
278 |
+
|
279 |
+
$themes = wp_get_themes();
|
280 |
+
$wp_themes = array();
|
281 |
+
|
282 |
+
foreach ( $themes as $theme ) {
|
283 |
+
$name = $theme->get('Name');
|
284 |
+
if ( isset( $wp_themes[ $name ] ) )
|
285 |
+
$wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme;
|
286 |
+
else
|
287 |
+
$wp_themes[ $name ] = $theme;
|
288 |
+
}
|
289 |
+
|
290 |
+
return $wp_themes;
|
291 |
+
}
|
292 |
+
|
293 |
+
function tc_get_theme_data( $theme_file ) {
|
294 |
+
|
295 |
+
if ( ! class_exists( 'WP_Theme' ) )
|
296 |
+
return get_theme_data( $theme_file );
|
297 |
+
|
298 |
+
$theme = new WP_Theme( basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) );
|
299 |
+
|
300 |
+
$theme_data = array(
|
301 |
+
'Name' => $theme->get('Name'),
|
302 |
+
'URI' => $theme->display('ThemeURI', true, false),
|
303 |
+
'Description' => $theme->display('Description', true, false),
|
304 |
+
'Author' => $theme->display('Author', true, false),
|
305 |
+
'AuthorURI' => $theme->display('AuthorURI', true, false),
|
306 |
+
'Version' => $theme->get('Version'),
|
307 |
+
'Template' => $theme->get('Template'),
|
308 |
+
'Status' => $theme->get('Status'),
|
309 |
+
'Tags' => $theme->get('Tags'),
|
310 |
+
'Title' => $theme->get('Name'),
|
311 |
+
'AuthorName' => $theme->display('Author', false, false),
|
312 |
+
'License' => $theme->display( 'License', false, false),
|
313 |
+
'License URI' => $theme->display( 'License URI', false, false),
|
314 |
+
'Template Version' => $theme->display( 'Template Version', false, false)
|
315 |
+
);
|
316 |
+
return $theme_data;
|
317 |
+
}
|
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 <strong>%1$s</strong> in the file <strong>%2$s</strong>. %3$s. %4$s', $error, $filename, $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><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"?></pre>', 'theme-check' ),
|
15 |
+
'wp_footer\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/wp_footer">wp_footer</a><pre> <?php wp_footer(); ?></pre>', 'theme-check' ),
|
16 |
+
'wp_head\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/wp_head">wp_head</a><pre> <?php wp_head(); ?></pre>', 'theme-check' ),
|
17 |
+
'language_attributes' => __( 'See: <a href="https://codex.wordpress.org/Function_Reference/language_attributes">language_attributes</a><pre><html <?php language_attributes(); ?></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> <?php add_theme_support( $feature ); ?></pre>', 'theme-check' ),
|
20 |
+
'comments_template\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/comments_template">comments_template</a><pre> <?php comments_template( $file, $separate_comments ); ?></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> <?php wp_list_comments( $args ); ?></pre>', 'theme-check' ),
|
22 |
+
'comment_form\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/comment_form">comment_form</a><pre> <?php comment_form(); ?></pre>', 'theme-check' ),
|
23 |
+
'body_class\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/body_class">body_class</a><pre> <?php body_class( $class ); ?></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> <?php wp_link_pages( $args ); ?></pre>', 'theme-check' ),
|
25 |
+
'post_class\s*\(' => __( 'See: <a href="https://codex.wordpress.org/Template_Tags/post_class">post_class</a><pre> <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>></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 <strong>%1$s</strong>. %2$s', 'theme-check' ), $key, $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> <?php if ( is_singular() ) wp_enqueue_script( "comment-reply" ); ?></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,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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, 'next_comments_link' ) === false && strpos( $php, 'previous_comments_link' ) === false ) ) {
|
14 |
+
|
15 |
+
$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>next_comments_link()</strong> and <strong>previous_comments_link()</strong> to add comment pagination.', 'theme-check' );
|
16 |
+
$ret = false;
|
17 |
+
}
|
18 |
+
|
19 |
+
return $ret;
|
20 |
+
}
|
21 |
+
|
22 |
+
function getError() { return $this->error; }
|
23 |
+
}
|
24 |
+
$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>: '.__('<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. Use <strong>%3$s</strong> instead.%4$s', 'theme-check'), $error, $filename, $check, $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,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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( 'rich_edit_exists' => '', '3.9'),
|
13 |
+
array( 'default_topic_count_text' => '', '3.9'),
|
14 |
+
array( 'format_to_post' => '', '3.9'),
|
15 |
+
array( 'get_current_site_name' => 'get_current_site()', '3.9'),
|
16 |
+
array( 'wpmu_current_site' => '', '3.9'),
|
17 |
+
array( 'get_all_category_ids' => 'get_terms()', '4.0' ),
|
18 |
+
array( 'like_escape' => 'wpdb::esc_like()', '4.0' ),
|
19 |
+
array( 'url_is_accessable_via_ssl' => '', '4.0' ),
|
20 |
+
);
|
21 |
+
|
22 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
23 |
+
foreach ( $checks as $alt => $check ) {
|
24 |
+
checkcount();
|
25 |
+
$version = $check;
|
26 |
+
$key = key( $check );
|
27 |
+
$alt = $check[ $key ];
|
28 |
+
if ( preg_match( '/[\s?]' . $key . '\(/', $phpfile, $matches ) ) {
|
29 |
+
$filename = tc_filename( $php_key );
|
30 |
+
$error = ltrim( rtrim( $matches[0], '(' ) );
|
31 |
+
$version = $check[0];
|
32 |
+
$grep = tc_grep( $error, $php_key );
|
33 |
+
|
34 |
+
// Point out the deprecated function.
|
35 |
+
$error_msg = sprintf(
|
36 |
+
__( '%1$s found in the file %2$s. Deprecated since version %3$s.', 'theme-check' ),
|
37 |
+
'<strong>' . $error . '()</strong>',
|
38 |
+
'<strong>' . $filename . '</strong>',
|
39 |
+
'<strong>' . $version . '</strong>'
|
40 |
+
);
|
41 |
+
|
42 |
+
// Add alternative function when available.
|
43 |
+
if ( $alt ) {
|
44 |
+
$error_msg .= ' ' . sprintf( __( 'Use %s instead.', 'theme-check' ), '<strong>' . $alt . '</strong>' );
|
45 |
+
}
|
46 |
+
|
47 |
+
// Add the precise code match that was found.
|
48 |
+
$error_msg .= $grep;
|
49 |
+
|
50 |
+
// Add the finalized error message.
|
51 |
+
$this->error[] = '<span class="tc-lead tc-recommended">' . __('RECOMMENDED','theme-check') . '</span>: ' . $error_msg;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
55 |
+
return $ret;
|
56 |
+
}
|
57 |
+
|
58 |
+
function getError() { return $this->error; }
|
59 |
+
}
|
60 |
+
$themechecks[] = new Deprecated_Recommended;
|
checks/deprecated.php
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
array('_search_terms_tidy' => '', '3.7' ),
|
158 |
+
array( 'get_blogaddress_by_domain' => '', '3.7' ),
|
159 |
+
array( 'rich_edit_exists' => '', '3.9' ),
|
160 |
+
array( 'default_topic_count_text' => '', '3.9' ),
|
161 |
+
array( 'format_to_post' => 'wpdb::prepare()', '3.9' ),
|
162 |
+
array( 'get_current_site_name' => 'get_current_site()', '3.9' ),
|
163 |
+
array( 'wpmu_current_site' => '', '3.9' ),
|
164 |
+
array( 'get_all_category_ids' => 'get_terms()', '4.0' ),
|
165 |
+
array( 'like_escape' => 'wpdb::esc_like()', '4.0' ),
|
166 |
+
array( 'url_is_accessable_via_ssl' => '', '4.0' ),
|
167 |
+
array( 'prepare_control' => '', '4.1' ),
|
168 |
+
array( 'add_tab' => '', '4.1' ),
|
169 |
+
array( 'remove_tab' => '', '4.1' ),
|
170 |
+
array( 'print_tab_image' => '', '4.1' ),
|
171 |
+
array( 'setup_widget_addition_previews' => 'customize_dynamic_setting_args', '4.2' ),
|
172 |
+
array( 'prepreview_added_sidebars_widgets' => 'customize_dynamic_setting_args', '4.2' ),
|
173 |
+
array( 'prepreview_added_widget_instance' => 'customize_dynamic_setting_args', '4.2' ),
|
174 |
+
array( 'remove_prepreview_filters' => 'customize_dynamic_setting_args', '4.2' ),
|
175 |
+
array( 'preview_theme' => '', '4.3' ),
|
176 |
+
array( '_preview_theme_template_filter' => '', '4.3' ),
|
177 |
+
array( '_preview_theme_stylesheet_filter' => '', '4.3' ),
|
178 |
+
array( 'preview_theme_ob_filter' => '', '4.3' ),
|
179 |
+
array( 'preview_theme_ob_filter_callback' => '', '4.3' ),
|
180 |
+
array( 'wp_richedit_pre' => '', '4.3' ),
|
181 |
+
array( 'wp_htmledit_pre' => '', '4.3' ),
|
182 |
+
// end wp-includes deprecated
|
183 |
+
|
184 |
+
// start wp-admin deprecated
|
185 |
+
array( 'tinymce_include' => 'wp_tiny_mce()', '2.1' ),
|
186 |
+
array( 'documentation_link' => '', '2.5' ),
|
187 |
+
array( 'wp_shrink_dimensions' => 'wp_constrain_dimensions()','3.0' ),
|
188 |
+
array( 'dropdown_categories' => 'wp_category_checklist()','2.6' ),
|
189 |
+
array( 'dropdown_link_categories' => 'wp_link_category_checklist()','2.6' ),
|
190 |
+
array( 'wp_dropdown_cats' => 'wp_dropdown_categories()','3.0' ),
|
191 |
+
array( 'add_option_update_handler' => 'register_setting()','3.0' ),
|
192 |
+
array( 'remove_option_update_handler' => 'unregister_setting()','3.0' ),
|
193 |
+
array( 'codepress_get_lang' => '','3.0' ),
|
194 |
+
array( 'codepress_footer_js' => '','3.0' ),
|
195 |
+
array( 'use_codepress' => '','3.0' ),
|
196 |
+
array( 'get_author_user_ids' => '','3.1' ),
|
197 |
+
array( 'get_editable_authors' => '','3.1' ),
|
198 |
+
array( 'get_editable_user_ids' => '','3.1' ),
|
199 |
+
array( 'get_nonauthor_user_ids' => '','3.1' ),
|
200 |
+
array( 'WP_User_Search' => 'WP_User_Query','3.1' ),
|
201 |
+
array( 'get_others_unpublished_posts' => '','3.1' ),
|
202 |
+
array( 'get_others_drafts' => '','3.1' ),
|
203 |
+
array( 'get_others_pending' => '', '3.1' ),
|
204 |
+
array( 'wp_dashboard_quick_press()' => '', '3.2' ),
|
205 |
+
array( 'wp_tiny_mce' => 'wp_editor', '3.2' ),
|
206 |
+
array( 'wp_preload_dialogs' => 'wp_editor()', '3.2' ),
|
207 |
+
array( 'wp_print_editor_js' => 'wp_editor()', '3.2' ),
|
208 |
+
array( 'wp_quicktags' => 'wp_editor()', '3.2' ),
|
209 |
+
array( 'favorite_actions' => 'WP_Admin_Bar', '3.2' ),
|
210 |
+
array( 'screen_layout' => '$current_screen->render_screen_layout()', '3.3' ),
|
211 |
+
array( 'screen_options' => '$current_screen->render_per_page_options()', '3.3' ),
|
212 |
+
array( 'screen_meta' => ' $current_screen->render_screen_meta()', '3.3' ),
|
213 |
+
array( 'media_upload_image' => 'wp_media_upload_handler()', '3.3' ),
|
214 |
+
array( 'media_upload_audio' => 'wp_media_upload_handler()', '3.3' ),
|
215 |
+
array( 'media_upload_video' => 'wp_media_upload_handler()', '3.3' ),
|
216 |
+
array( 'media_upload_file' => 'wp_media_upload_handler()', '3.3' ),
|
217 |
+
array( 'type_url_form_image' => 'wp_media_insert_url_form( \'image\' )', '3.3' ),
|
218 |
+
array( 'type_url_form_audio' => 'wp_media_insert_url_form( \'audio\' )', '3.3' ),
|
219 |
+
array( 'type_url_form_video' => 'wp_media_insert_url_form( \'video\' )', '3.3' ),
|
220 |
+
array( 'type_url_form_file' => 'wp_media_insert_url_form( \'file\' )', '3.3' ),
|
221 |
+
array( 'add_contextual_help' => 'get_current_screen()->add_help_tab()', '3.3' ),
|
222 |
+
array( 'get_allowed_themes' => 'wp_get_themes( array( \'allowed\' => true ) )', '3.4' ),
|
223 |
+
array( 'get_broken_themes' => 'wp_get_themes( array( \'errors\' => true )', '3.4' ),
|
224 |
+
array( 'current_theme_info' => 'wp_get_theme()', '3.4' ),
|
225 |
+
array( '_insert_into_post_button' => '', '3.5' ),
|
226 |
+
array( '_media_button' => '', '3.5' ),
|
227 |
+
array( 'get_post_to_edit' => 'get_post()', '3.5' ),
|
228 |
+
array( 'get_default_page_to_edit' => 'get_default_post_to_edit()', '3.5' ),
|
229 |
+
array( 'wp_create_thumbnail' => 'image_resize()', '3.5' ),
|
230 |
+
array( 'wp_nav_menu_locations_meta_box' => '', '3.6' ),
|
231 |
+
array( 'the_attachment_links' => '', '3.7'),
|
232 |
+
array( 'wp_update_core' => 'new Core_Upgrader()', '3.7'),
|
233 |
+
array( 'wp_update_plugin' => 'new Plugin_Upgrader()', '3.7'),
|
234 |
+
array( 'wp_update_theme' => 'new Theme_Upgrader()', '3.7'),
|
235 |
+
array( 'get_screen_icon' => '', '3.8' ),
|
236 |
+
array( 'screen_icon' => '', '3.8' ),
|
237 |
+
array( 'wp_dashboard_incoming_links' => '', '3.8' ),
|
238 |
+
array( 'wp_dashboard_incoming_links_control' => '', '3.8' ),
|
239 |
+
array( 'wp_dashboard_incoming_links_output' => '', '3.8' ),
|
240 |
+
array( 'wp_dashboard_plugins' => '', '3.8' ),
|
241 |
+
array( 'wp_dashboard_primary_control' => '', '3.8' ),
|
242 |
+
array( 'wp_dashboard_recent_comments_control' => '', '3.8' ),
|
243 |
+
array( 'wp_dashboard_secondary' => '', '3.8' ),
|
244 |
+
array( 'wp_dashboard_secondary_control' => '', '3.8' ),
|
245 |
+
array( 'wp_dashboard_secondary_output' => '', '3.8' ),
|
246 |
+
array( '_relocate_children' => '', '3.9' ),
|
247 |
+
array( 'wp_ajax_wp_fullscreen_save_post' => '', '4.3' ),
|
248 |
+
|
249 |
+
// end wp-admin
|
250 |
+
);
|
251 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
252 |
+
foreach ( $checks as $alt => $check ) {
|
253 |
+
checkcount();
|
254 |
+
$key = key( $check );
|
255 |
+
$alt = $check[ $key ];
|
256 |
+
if ( preg_match( '/(?<!function)[\s?]' . $key . '\s?\(/', $phpfile, $matches ) ) {
|
257 |
+
$filename = tc_filename( $php_key );
|
258 |
+
$error = ltrim( rtrim( $matches[0], '(' ) );
|
259 |
+
$version = $check[0];
|
260 |
+
$grep = tc_grep( $error, $php_key );
|
261 |
+
|
262 |
+
// Point out the deprecated function.
|
263 |
+
$error_msg = sprintf(
|
264 |
+
__( '%1$s found in the file %2$s. Deprecated since version %3$s.', 'theme-check' ),
|
265 |
+
'<strong>' . $error . '()</strong>',
|
266 |
+
'<strong>' . $filename . '</strong>',
|
267 |
+
'<strong>' . $version . '</strong>'
|
268 |
+
);
|
269 |
+
|
270 |
+
// Add alternative function when available.
|
271 |
+
if ( $alt ) {
|
272 |
+
$error_msg .= ' ' . sprintf( __( 'Use %s instead.', 'theme-check' ), '<strong>' . $alt . '</strong>' );
|
273 |
+
}
|
274 |
+
|
275 |
+
// Add the precise code match that was found.
|
276 |
+
$error_msg .= $grep;
|
277 |
+
|
278 |
+
// Add the finalized error message.
|
279 |
+
$this->error[] = '<span class="tc-lead tc-required">' . __('REQUIRED','theme-check') . '</span>: ' . $error_msg;
|
280 |
+
|
281 |
+
$ret = false;
|
282 |
+
}
|
283 |
+
}
|
284 |
+
}
|
285 |
+
return $ret;
|
286 |
+
}
|
287 |
+
|
288 |
+
function getError() { return $this->error; }
|
289 |
+
}
|
290 |
+
$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 |
+
<?php
|
2 |
+
|
3 |
+
class EditorStyleCheck implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
checkcount();
|
8 |
+
$ret = true;
|
9 |
+
|
10 |
+
$php = implode( ' ', $php_files );
|
11 |
+
|
12 |
+
if ( strpos( $php, 'add_editor_style' ) === false ) {
|
13 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to <strong>add_editor_style()</strong> was found in the theme. It is recommended that the theme implement editor styling, so as to make the editor content match the resulting post output in the theme, for a better user experience.', 'theme-check' );
|
14 |
+
}
|
15 |
+
|
16 |
+
return $ret;
|
17 |
+
}
|
18 |
+
|
19 |
+
function getError() { return $this->error; }
|
20 |
+
}
|
21 |
+
$themechecks[] = new EditorStyleCheck;
|
checks/filenames.php
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class File_Checks implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
|
9 |
+
$filenames = array();
|
10 |
+
|
11 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
12 |
+
array_push( $filenames, strtolower( basename( $php_key ) ) );
|
13 |
+
}
|
14 |
+
foreach ( $other_files as $php_key => $phpfile ) {
|
15 |
+
array_push( $filenames, strtolower( basename( $php_key ) ) );
|
16 |
+
}
|
17 |
+
foreach ( $css_files as $php_key => $phpfile ) {
|
18 |
+
array_push( $filenames, strtolower( basename( $php_key ) ) );
|
19 |
+
}
|
20 |
+
$blacklist = array(
|
21 |
+
'thumbs.db' => __( 'Windows thumbnail store', 'theme-check' ),
|
22 |
+
'desktop.ini' => __( 'windows system file', 'theme-check' ),
|
23 |
+
'project.properties' => __( 'NetBeans Project File', 'theme-check' ),
|
24 |
+
'project.xml' => __( 'NetBeans Project File', 'theme-check' ),
|
25 |
+
'\.kpf' => __( 'Komodo Project File', 'theme-check' ),
|
26 |
+
'^\.+[a-zA-Z0-9]' => __( 'Hidden Files or Folders', 'theme-check' ),
|
27 |
+
'php.ini' => __( 'PHP server settings file', 'theme-check' ),
|
28 |
+
'dwsync.xml' => __( 'Dreamweaver project file', 'theme-check' ),
|
29 |
+
'error_log' => __( 'PHP error log', 'theme-check' ),
|
30 |
+
'web.config' => __( 'Server settings file', 'theme-check' ),
|
31 |
+
'\.sql' => __( 'SQL dump file', 'theme-check' ),
|
32 |
+
'__MACOSX' => __( 'OSX system file', 'theme-check' )
|
33 |
+
);
|
34 |
+
|
35 |
+
$musthave = array( 'index.php', 'style.css' );
|
36 |
+
$rechave = array( 'readme.txt' => __( 'Please see <a href="https://codex.wordpress.org/Theme_Review#Theme_Documentation">Theme_Documentation</a> for more information.', 'theme-check' ) );
|
37 |
+
|
38 |
+
checkcount();
|
39 |
+
|
40 |
+
foreach( $blacklist as $file => $reason ) {
|
41 |
+
if ( $filename = preg_grep( '/' . $file . '/', $filenames ) ) {
|
42 |
+
$error = implode( array_unique( $filename ), ' ' );
|
43 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('<strong>%1$s</strong> %2$s found.', 'theme-check'), $error, $reason) ;
|
44 |
+
$ret = false;
|
45 |
+
}
|
46 |
+
}
|
47 |
+
|
48 |
+
foreach( $musthave as $file ) {
|
49 |
+
if ( !in_array( $file, $filenames ) ) {
|
50 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('could not find the file <strong>%1$s</strong> in the theme.', 'theme-check'), $file);
|
51 |
+
$ret = false;
|
52 |
+
}
|
53 |
+
}
|
54 |
+
|
55 |
+
foreach( $rechave as $file => $reason ) {
|
56 |
+
if ( !in_array( $file, $filenames ) ) {
|
57 |
+
$this->error[] = sprintf('<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('could not find the file <strong>%1$s</strong> in the theme. %2$s', 'theme-check'), $file, $reason );
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
return $ret;
|
62 |
+
}
|
63 |
+
|
64 |
+
function getError() { return $this->error; }
|
65 |
+
}
|
66 |
+
$themechecks[] = new File_Checks;
|
checks/gravatar.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class GravatarCheck implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
|
8 |
+
$php = implode( ' ', $php_files );
|
9 |
+
|
10 |
+
checkcount();
|
11 |
+
|
12 |
+
$ret = true;
|
13 |
+
|
14 |
+
if ( ( strpos( $php, 'get_avatar' ) === false ) && ( strpos( $php, 'wp_list_comments' ) === false ) ) {
|
15 |
+
$this->error[] = '<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__("This theme doesn't seem to support the standard avatar functions. Use <strong>get_avatar</strong> or <strong>wp_list_comments</strong> to add this support.", 'theme-check' );
|
16 |
+
$ret = false;
|
17 |
+
}
|
18 |
+
|
19 |
+
return $ret;
|
20 |
+
}
|
21 |
+
|
22 |
+
function getError() { return $this->error; }
|
23 |
+
}
|
24 |
+
$themechecks[] = new GravatarCheck;
|
checks/i18n.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
// check for various I18N errors
|
4 |
+
|
5 |
+
class I18NCheck implements themecheck {
|
6 |
+
protected $error = array();
|
7 |
+
|
8 |
+
function check( $php_files, $css_files, $other_files ) {
|
9 |
+
$ret = true;
|
10 |
+
$error = '';
|
11 |
+
checkcount();
|
12 |
+
|
13 |
+
// make sure the tokenizer is available
|
14 |
+
if ( !function_exists( 'token_get_all' ) ) return true;
|
15 |
+
|
16 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
17 |
+
$error='';
|
18 |
+
|
19 |
+
$stmts = array();
|
20 |
+
foreach ( array('_e(', '__(', '_e (', '__ (') as $finder) {
|
21 |
+
$search = $phpfile;
|
22 |
+
while ( ( $pos = strpos($search, $finder) ) !== false ) {
|
23 |
+
$search = substr($search,$pos);
|
24 |
+
$open=1;
|
25 |
+
$i=strpos($search,'(')+1;
|
26 |
+
while( $open>0 ) {
|
27 |
+
switch($search[$i]) {
|
28 |
+
case '(':
|
29 |
+
$open++; break;
|
30 |
+
case ')':
|
31 |
+
$open--; break;
|
32 |
+
}
|
33 |
+
$i++;
|
34 |
+
}
|
35 |
+
$stmts[] = substr($search,0,$i);
|
36 |
+
$search = substr($search,$i);
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
foreach ( $stmts as $match ) {
|
41 |
+
$tokens = @token_get_all('<?php '.$match.';');
|
42 |
+
if (!empty($tokens)) {
|
43 |
+
foreach ($tokens as $token) {
|
44 |
+
if (is_array($token) && in_array( $token[0], array( T_VARIABLE ) ) ) {
|
45 |
+
$filename = tc_filename( $php_key );
|
46 |
+
$grep = tc_grep( ltrim( $match ), $php_key );
|
47 |
+
preg_match( '/[^\s]*\s[0-9]+/', $grep, $line);
|
48 |
+
$error = ( !strpos( $error, $line[0] ) ) ? $grep : '';
|
49 |
+
$this->error[] = sprintf('<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('Possible variable <strong>%1$s</strong> found in translation function in <strong>%2$s</strong>. Translation function calls must NOT contain PHP variables. %3$s','theme-check'),
|
50 |
+
$token[1], $filename, $error);
|
51 |
+
break; // stop looking at the tokens on this line once a variable is found
|
52 |
+
}
|
53 |
+
}
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
|
58 |
+
}
|
59 |
+
return $ret;
|
60 |
+
}
|
61 |
+
|
62 |
+
function getError() { return $this->error; }
|
63 |
+
}
|
64 |
+
$themechecks[] = new I18NCheck;
|
checks/iframes.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class IframeCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
$ret = true;
|
7 |
+
|
8 |
+
$checks = array(
|
9 |
+
'/<(iframe)[^>]*>/' => __( 'iframes are sometimes used to load unwanted adverts and code on your site', 'theme-check' )
|
10 |
+
);
|
11 |
+
|
12 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
13 |
+
foreach ( $checks as $key => $check ) {
|
14 |
+
checkcount();
|
15 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
16 |
+
$filename = tc_filename( $php_key );
|
17 |
+
$error = ltrim( $matches[1], '(' );
|
18 |
+
$error = rtrim( $error, '(' );
|
19 |
+
$grep = tc_grep( $error, $php_key );
|
20 |
+
$this->error[] = sprintf('<span class="tc-lead tc-info">'.__('INFO','theme-check').'</span>: '.__('<strong>%1$s</strong> was found in the file <strong>%2$s</strong> %3$s.%4$s', 'theme-check'), $error, $filename, $check, $grep ) ;
|
21 |
+
}
|
22 |
+
}
|
23 |
+
}
|
24 |
+
return $ret;
|
25 |
+
}
|
26 |
+
|
27 |
+
function getError() { return $this->error; }
|
28 |
+
}
|
29 |
+
$themechecks[] = new IframeCheck;
|
checks/include.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class IncludeCheck implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
|
8 |
+
$ret = true;
|
9 |
+
|
10 |
+
$checks = array( '/(?<![a-z0-9_])(?:requir|includ)e(?:_once)?\s/' => __( 'The theme appears to use include or require. If these are being used to include separate sections of a template from independent files, then <strong>get_template_part()</strong> should be used instead.', 'theme-check' ) );
|
11 |
+
|
12 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
13 |
+
foreach ( $checks as $key => $check ) {
|
14 |
+
checkcount();
|
15 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
16 |
+
$filename = tc_filename( $php_key );
|
17 |
+
$error = '/(?<![a-z0-9_])(?:requir|includ)e(?:_once)?\s?\(/';
|
18 |
+
$grep = tc_preg( $error, $php_key );
|
19 |
+
if ( basename($filename) !== 'functions.php' ) $this->error[] = sprintf ( '<span class="tc-lead tc-info">'.__('INFO','theme-check').'</span>: '.__('<strong>%1$s</strong> %2$s %3$s', 'theme-check' ), $filename, $check, $grep );
|
20 |
+
}
|
21 |
+
}
|
22 |
+
|
23 |
+
}
|
24 |
+
return $ret;
|
25 |
+
}
|
26 |
+
|
27 |
+
function getError() { return $this->error; }
|
28 |
+
}
|
29 |
+
$themechecks[] = new IncludeCheck;
|
checks/lineendings.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class LineEndingsCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
$ret = true;
|
7 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
8 |
+
if (preg_match("/\r\n/",$phpfile)) {
|
9 |
+
if (preg_match("/[^\r]\n/",$phpfile)) {
|
10 |
+
$filename = tc_filename( $php_key );
|
11 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('Both DOS and UNIX style line endings were found in the file <strong>%1$s</strong>. This causes a problem with SVN repositories and must be corrected before the theme can be accepted. Please change the file to use only one style of line endings.', 'theme-check'), $filename);
|
12 |
+
$ret = false;
|
13 |
+
}
|
14 |
+
}
|
15 |
+
}
|
16 |
+
foreach ( $css_files as $css_key => $cssfile ) {
|
17 |
+
if (preg_match("/\r\n/",$cssfile)) {
|
18 |
+
if (preg_match("/[^\r]\n/",$cssfile)) {
|
19 |
+
$filename = tc_filename( $css_key );
|
20 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('Both DOS and UNIX style line endings were found in the file <strong>%1$s</strong>. This causes a problem with SVN repositories and must be corrected before the theme can be accepted. Please change the file to use only one style of line endings.', 'theme-check'), $filename);
|
21 |
+
$ret = false;
|
22 |
+
}
|
23 |
+
}
|
24 |
+
}
|
25 |
+
foreach ( $other_files as $oth_key => $othfile ) {
|
26 |
+
$e = pathinfo($oth_key);
|
27 |
+
if ( isset( $e['extension'] ) && in_array( $e['extension'], array( 'txt','js' ) ) ) {
|
28 |
+
if (preg_match("/\r\n/",$othfile)) {
|
29 |
+
if (preg_match("/[^\r]\n/",$othfile)) {
|
30 |
+
$filename = tc_filename( $oth_key );
|
31 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('Both DOS and UNIX style line endings were found in the file <strong>%1$s</strong>. This causes a problem with SVN repositories and must be corrected before the theme can be accepted. Please change the file to use only one style of line endings.', 'theme-check'), $filename);
|
32 |
+
$ret = false;
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}
|
36 |
+
}
|
37 |
+
return $ret;
|
38 |
+
}
|
39 |
+
|
40 |
+
function getError() { return $this->error; }
|
41 |
+
}
|
42 |
+
|
43 |
+
$themechecks[] = new LineEndingsCheck;
|
checks/links.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Check_Links implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
global $data;
|
9 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
10 |
+
checkcount();
|
11 |
+
$grep = '';
|
12 |
+
// regex borrowed from TAC
|
13 |
+
$url_re = '([[:alnum:]\-\.])+(\\.)([[:alnum:]]){2,4}([[:blank:][:alnum:]\/\+\=\%\&\_\\\.\~\?\-]*)';
|
14 |
+
$title_re = '[[:blank:][:alnum:][:punct:]]*'; // 0 or more: any num, letter(upper/lower) or any punc symbol
|
15 |
+
$space_re = '(\\s*)';
|
16 |
+
if ( preg_match_all( "/(<a)(\\s+)(href" . $space_re . "=" . $space_re . "\"" . $space_re . "((http|https|ftp):\\/\\/)?)" . $url_re . "(\"" . $space_re . $title_re . $space_re . ">)" . $title_re . "(<\\/a>)/is", $phpfile, $out, PREG_SET_ORDER ) ) {
|
17 |
+
$filename = tc_filename( $php_key );
|
18 |
+
foreach( $out as $key ) {
|
19 |
+
if ( preg_match( '/\<a\s?href\s?=\s?["|\'](.*?)[\'|"](.*?)\>(.*?)\<\/a\>/is', $key[0], $stripped ) ) {
|
20 |
+
if ( !empty( $data['AuthorURI'] ) && !empty( $data['URI'] ) && $stripped[1] && !strpos( $stripped[1], $data['URI'] ) && !strpos( $stripped[1], $data['AuthorURI'] ) && !strpos( $stripped[1], 'wordpress.' ) ) {
|
21 |
+
$grep .= tc_grep( $stripped[1], $php_key );
|
22 |
+
}
|
23 |
+
}
|
24 |
+
if ( $grep ) {
|
25 |
+
$this->error[] = sprintf('<span class="tc-lead tc-info">'.__('INFO','theme-check').'</span>: '.__('Possible hard-coded links were found in the file <strong>%1$s</strong>.%2$s', 'theme-check'), $filename, $grep);
|
26 |
+
}
|
27 |
+
}
|
28 |
+
}
|
29 |
+
}
|
30 |
+
return $ret;
|
31 |
+
}
|
32 |
+
function getError() { return $this->error; }
|
33 |
+
}
|
34 |
+
$themechecks[] = new Check_Links;
|
checks/malware.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class MalwareCheck 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](?<!_)(file_get_contents|curl_exec|curl_init|readfile|fopen|fsockopen|pfsockopen|fclose|fread|fwrite|file_put_contents)\s?\(/' => __( 'File operations should use the WP_Filesystem methods instead of direct PHP filesystem calls', 'theme-check' ),
|
10 |
+
);
|
11 |
+
|
12 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
13 |
+
foreach ( $checks as $key => $check ) {
|
14 |
+
checkcount();
|
15 |
+
|
16 |
+
if ( preg_match_all( $key, $phpfile, $matches ) ) {
|
17 |
+
$filename = tc_filename( $php_key );
|
18 |
+
|
19 |
+
foreach ($matches[1] as $match ) {
|
20 |
+
$error = ltrim( $match, '(' );
|
21 |
+
$error = rtrim( $error, '(' );
|
22 |
+
$grep = tc_grep( $error, $php_key );
|
23 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('<strong>%1$s</strong> was found in the file <strong>%2$s</strong> %3$s.%4$s', 'theme-check'), $error, $filename, $check, $grep );
|
24 |
+
$ret = false;
|
25 |
+
}
|
26 |
+
}
|
27 |
+
}
|
28 |
+
}
|
29 |
+
return $ret;
|
30 |
+
}
|
31 |
+
|
32 |
+
function getError() { return $this->error; }
|
33 |
+
}
|
34 |
+
$themechecks[] = new MalwareCheck;
|
checks/more_deprecated.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Checks for the use of deprecated function parameters.
|
5 |
+
*/
|
6 |
+
|
7 |
+
class More_Deprecated implements themecheck {
|
8 |
+
protected $error = array();
|
9 |
+
|
10 |
+
function check( $php_files, $css_files, $other_files ) {
|
11 |
+
|
12 |
+
$ret = true;
|
13 |
+
|
14 |
+
$checks = array(
|
15 |
+
'get_bloginfo' => array(
|
16 |
+
'home' => 'home_url()',
|
17 |
+
'url' => 'home_url()',
|
18 |
+
'wpurl' => 'site_url()',
|
19 |
+
'stylesheet_directory' => 'get_stylesheet_directory_uri()',
|
20 |
+
'template_directory' => 'get_template_directory_uri()',
|
21 |
+
'template_url' => 'get_template_directory_uri()',
|
22 |
+
'text_direction' => 'is_rtl()',
|
23 |
+
'feed_url' => "get_feed_link( 'feed' ), where feed is rss, rss2 or atom",
|
24 |
+
),
|
25 |
+
'bloginfo' => array(
|
26 |
+
'home' => 'echo esc_url( home_url() )',
|
27 |
+
'url' => 'echo esc_url( home_url() )',
|
28 |
+
'wpurl' => 'echo esc_url( site_url() )',
|
29 |
+
'stylesheet_directory' => 'echo esc_url( get_stylesheet_directory_uri() )',
|
30 |
+
'template_directory' => 'echo esc_url( get_template_directory_uri() )',
|
31 |
+
'template_url' => 'echo esc_url( get_template_directory_uri() )',
|
32 |
+
'text_direction' => 'is_rtl()',
|
33 |
+
'feed_url' => "echo esc_url( get_feed_link( 'feed' ) ), where feed is rss, rss2 or atom",
|
34 |
+
),
|
35 |
+
'get_option' => array(
|
36 |
+
'home' => 'home_url()',
|
37 |
+
'site_url' => 'site_url()',
|
38 |
+
)
|
39 |
+
);
|
40 |
+
|
41 |
+
foreach ( $php_files as $php_key => $php_file ) {
|
42 |
+
// Loop through all functions.
|
43 |
+
foreach ( $checks as $function => $data ) {
|
44 |
+
checkcount();
|
45 |
+
|
46 |
+
// Loop through the parameters and look for all function/parameter combinations.
|
47 |
+
foreach ( $data as $parameter => $replacement ) {
|
48 |
+
if ( preg_match( '/' . $function . '\(\s*("|\')' . $parameter . '("|\')\s*\)/', $php_file, $matches ) ) {
|
49 |
+
$filename = tc_filename( $php_key );
|
50 |
+
$error = ltrim( rtrim( $matches[0], '(' ) );
|
51 |
+
$grep = tc_grep( $error, $php_key );
|
52 |
+
$this->error[] = sprintf( '<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check' ) . '</span>: ' . __( '<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. Use <strong>%3$s</strong> instead.%4$s', 'theme-check' ), $error, $filename, $replacement, $grep );
|
53 |
+
$ret = false;
|
54 |
+
}
|
55 |
+
}
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
return $ret;
|
60 |
+
}
|
61 |
+
|
62 |
+
function getError() { return $this->error; }
|
63 |
+
}
|
64 |
+
$themechecks[] = new More_Deprecated;
|
checks/navmenu.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class NavMenuCheck 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, 'nav_menu' ) === false ) {
|
14 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__("No reference to nav_menu's was found in the theme. Note that if your theme has a menu bar, it is required to use the WordPress nav_menu functionality for it.", 'theme-check' );
|
15 |
+
}
|
16 |
+
|
17 |
+
return $ret;
|
18 |
+
}
|
19 |
+
|
20 |
+
function getError() { return $this->error; }
|
21 |
+
}
|
22 |
+
|
23 |
+
$themechecks[] = new NavMenuCheck;
|
checks/nonprintable.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class NonPrintableCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
$ret = true;
|
7 |
+
|
8 |
+
foreach ( $php_files as $name => $content ) {
|
9 |
+
checkcount();
|
10 |
+
// 09 = tab
|
11 |
+
// 0A = line feed
|
12 |
+
// 0D = new line
|
13 |
+
if ( preg_match('/[\x00-\x08\x0B-\x0C\x0E-\x1F\x80-\xFF]/', $content, $matches ) ) {
|
14 |
+
$filename = tc_filename( $name );
|
15 |
+
$non_print = tc_preg( '/[\x00-\x08\x0B-\x0C\x0E-\x1F\x80-\xFF]/', $name );
|
16 |
+
$this->error[] = sprintf('<span class="tc-lead tc-info">'.__('INFO','theme-check').'</span>: '.__('Non-printable characters were found in the <strong>%1$s</strong> file. You may want to check this file for errors.%2$s', 'theme-check'), $filename, $non_print);
|
17 |
+
}
|
18 |
+
}
|
19 |
+
|
20 |
+
// return the pass/fail
|
21 |
+
return $ret;
|
22 |
+
}
|
23 |
+
|
24 |
+
function getError() { return $this->error; }
|
25 |
+
}
|
26 |
+
|
27 |
+
$themechecks[] = new NonPrintableCheck;
|
checks/phpshort.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class PHPShortTagsCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
|
9 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
10 |
+
checkcount();
|
11 |
+
if ( preg_match( '/<\?(\=?)(?!php|xml)/i', $phpfile ) ) {
|
12 |
+
$filename = tc_filename( $php_key );
|
13 |
+
$grep = tc_preg( '/<\?(\=?)(?!php|xml)/', $php_key );
|
14 |
+
$this->error[] = sprintf('<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('Found PHP short tags in file <strong>%1$s</strong>.%2$s', 'theme-check'), $filename, $grep);
|
15 |
+
$ret = false;
|
16 |
+
}
|
17 |
+
}
|
18 |
+
|
19 |
+
return $ret;
|
20 |
+
}
|
21 |
+
|
22 |
+
function getError() { return $this->error; }
|
23 |
+
}
|
24 |
+
|
25 |
+
$themechecks[] = new PHPShortTagsCheck;
|
checks/plugin-territory.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Checks for Plugin Territory Guidelines.
|
4 |
+
*
|
5 |
+
* See http://make.wordpress.org/themes/guidelines/guidelines-plugin-territory/
|
6 |
+
*/
|
7 |
+
|
8 |
+
class Plugin_Territory implements themecheck {
|
9 |
+
protected $error = array();
|
10 |
+
|
11 |
+
function check( $php_files, $css_files, $other_files ) {
|
12 |
+
$ret = true;
|
13 |
+
$php = implode( ' ', $php_files );
|
14 |
+
|
15 |
+
// Functions that are required to be removed from the theme.
|
16 |
+
$forbidden_functions = array(
|
17 |
+
'register_post_type',
|
18 |
+
'register_taxonomy',
|
19 |
+
);
|
20 |
+
|
21 |
+
foreach ( $forbidden_functions as $function ) {
|
22 |
+
checkcount();
|
23 |
+
if ( preg_match( '/[\s?]' . $function . '\(/', $php ) ) {
|
24 |
+
$this->error[] = '<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check').'</span>: ' . sprintf( __( 'The theme uses the %s function, which is plugin-territory functionality.', 'theme-check' ), '<strong>' . esc_html( $function ) . '()</strong>' ) ;
|
25 |
+
$ret = false;
|
26 |
+
}
|
27 |
+
}
|
28 |
+
|
29 |
+
// Shortcodes can't be used in the post content, so warn about them.
|
30 |
+
if ( false !== strpos( $php, 'add_shortcode' ) ) {
|
31 |
+
checkcount();
|
32 |
+
$this->error[] = '<span class="tc-lead tc-warning">' . __( 'WARNING', 'theme-check').'</span>: ' . sprintf( __( 'The theme uses the %s function. Custom post-content shortcodes are plugin-territory functionality.', 'theme-check' ), '<strong>add_shortcode()</strong>' ) ;
|
33 |
+
$ret = false;
|
34 |
+
}
|
35 |
+
|
36 |
+
return $ret;
|
37 |
+
}
|
38 |
+
|
39 |
+
function getError() { return $this->error; }
|
40 |
+
}
|
41 |
+
$themechecks[] = new Plugin_Territory;
|
checks/post-formats.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class PostFormatCheck implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
$ret = true;
|
8 |
+
|
9 |
+
$php = implode( ' ', $php_files );
|
10 |
+
$css = implode( ' ', $css_files );
|
11 |
+
|
12 |
+
checkcount();
|
13 |
+
|
14 |
+
$checks = array(
|
15 |
+
'/add_theme_support\(\s?("|\')post-formats("|\')/m'
|
16 |
+
);
|
17 |
+
|
18 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
19 |
+
foreach ( $checks as $check ) {
|
20 |
+
checkcount();
|
21 |
+
if ( preg_match( $check, $phpfile, $matches ) ) {
|
22 |
+
if ( !strpos( $php, 'get_post_format' ) && !strpos( $php, 'has_post_format' ) && !strpos( $css, '.format' ) ) {
|
23 |
+
$filename = tc_filename( $php_key );
|
24 |
+
$matches[0] = str_replace(array('"',"'"),'', $matches[0]);
|
25 |
+
$error = esc_html( rtrim($matches[0], '(' ) );
|
26 |
+
$grep = tc_grep( rtrim($matches[0], '(' ), $php_key);
|
27 |
+
$this->error[] = sprintf('<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. However get_post_format and/or has_post_format were not found, and no use of formats in the CSS was detected.', 'theme-check'), $error, $filename);
|
28 |
+
$ret = false;
|
29 |
+
}
|
30 |
+
}
|
31 |
+
}
|
32 |
+
}
|
33 |
+
return $ret;
|
34 |
+
}
|
35 |
+
|
36 |
+
function getError() { return $this->error; }
|
37 |
+
}
|
38 |
+
$themechecks[] = new PostFormatCheck;
|
checks/postsnav.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class PostPaginationCheck 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, 'posts_nav_link' ) === false &&
|
14 |
+
strpos( $php, 'paginate_links' ) === false &&
|
15 |
+
strpos( $php, 'the_posts_pagination' ) === false &&
|
16 |
+
strpos( $php, 'the_posts_navigation' ) === false &&
|
17 |
+
( strpos( $php, 'previous_posts_link' ) === false && strpos( $php, 'next_posts_link' ) === false )
|
18 |
+
) {
|
19 |
+
$this->error[] = '<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__("The theme doesn't have post pagination code in it. Use <strong>posts_nav_link()</strong> or <strong>paginate_links()</strong> or <strong>the_posts_pagination()</strong> or <strong>the_posts_navigation()</strong> or <strong>next_posts_link()</strong> and <strong>previous_posts_link()</strong> to add post pagination.", 'theme-check' );
|
20 |
+
$ret = false;
|
21 |
+
}
|
22 |
+
|
23 |
+
return $ret;
|
24 |
+
}
|
25 |
+
|
26 |
+
function getError() { return $this->error; }
|
27 |
+
}
|
28 |
+
$themechecks[] = new PostPaginationCheck;
|
checks/postthumb.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class PostThumbnailCheck 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 |
+
|
14 |
+
if ( strpos( $php, 'the_post_thumbnail' ) === false ) {
|
15 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to <strong>the_post_thumbnail()</strong> was found in the theme. It is recommended that the theme implement this functionality instead of using custom fields for thumbnails.', 'theme-check' );
|
16 |
+
}
|
17 |
+
|
18 |
+
if ( strpos( $php, 'post-thumbnails' ) === false ) {
|
19 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to post-thumbnails was found in the theme. If the theme has a thumbnail like functionality, it should be implemented with <strong>add_theme_support( "post-thumbnails" )</strong>in the functions.php file.', 'theme-check' );
|
20 |
+
}
|
21 |
+
|
22 |
+
return $ret;
|
23 |
+
}
|
24 |
+
|
25 |
+
function getError() { return $this->error; }
|
26 |
+
}
|
27 |
+
$themechecks[] = new PostThumbnailCheck;
|
checks/required.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Required implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
|
8 |
+
$ret = true;
|
9 |
+
$checks = array(
|
10 |
+
'/\s?get_option\(\s?("|\')home("|\')\s?\)/' => 'home_url()',
|
11 |
+
'/\s?get_option\(\s?("|\')site_url("|\')\s?\)/' => 'site_url()',
|
12 |
+
);
|
13 |
+
|
14 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
15 |
+
foreach ( $checks as $key => $check ) {
|
16 |
+
checkcount();
|
17 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
18 |
+
$filename = tc_filename( $php_key );
|
19 |
+
$matches[0] = str_replace(array('"',"'"),'', $matches[0]);
|
20 |
+
$error = esc_html( rtrim($matches[0], '(' ) );
|
21 |
+
$grep = tc_grep( rtrim($matches[0], '(' ), $php_key );
|
22 |
+
$this->error[] = sprintf('<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. Use <strong>%3$s</strong> instead.%4$s', 'theme-check'), $error, $filename, $check, $grep);
|
23 |
+
$ret = false;
|
24 |
+
}
|
25 |
+
}
|
26 |
+
}
|
27 |
+
return $ret;
|
28 |
+
}
|
29 |
+
function getError() { return $this->error; }
|
30 |
+
}
|
31 |
+
$themechecks[] = new Required;
|
checks/screenshot.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Screenshot_Checks implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
$filenames = array();
|
9 |
+
|
10 |
+
foreach ( $other_files as $other_key => $otherfile ) {
|
11 |
+
array_push( $filenames, strtolower( basename( $other_key ) ) );
|
12 |
+
}
|
13 |
+
|
14 |
+
checkcount();
|
15 |
+
|
16 |
+
if ( in_array( 'screenshot.png', $filenames ) || in_array( 'screenshot.jpg', $filenames ) ) {
|
17 |
+
|
18 |
+
foreach ( $other_files as $other_key => $otherfile ) {
|
19 |
+
|
20 |
+
if ( ( basename( $other_key ) === 'screenshot.png' || basename( $other_key ) === 'screenshot.jpg' ) && preg_match( '/.*themes\/[^\/]*\/screenshot\.(png|jpg)/', $other_key ) ) {
|
21 |
+
// we have or screenshot!
|
22 |
+
$image = getimagesize( $other_key );
|
23 |
+
if ( $image[0] > 1200 || $image[1] > 900 ) {
|
24 |
+
$this->error[] = sprintf('<span class="tc-lead tc-recommended">'. __( 'RECOMMENDED','theme-check' ) . '</span>: ' . __( 'Screenshot is wrong size! Detected: <strong>%1$sx%2$spx</strong>. Maximum allowed size is 1200x800px.', 'theme-check' ), $image[0], $image[1]);
|
25 |
+
}
|
26 |
+
if ( $image[1] / $image[0] != 0.75 ) {
|
27 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('Screenshot dimensions are wrong! Ratio of width to height should be 4:3.', 'theme-check');
|
28 |
+
}
|
29 |
+
if ( $image[0] != 1200 || $image[1] != 900 ) {
|
30 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('Screenshot size should be 880x660, to account for HiDPI displays. Any 4:3 image size is acceptable, but 1200x900 is preferred.', 'theme-check');
|
31 |
+
}
|
32 |
+
}
|
33 |
+
}
|
34 |
+
} else {
|
35 |
+
$this->error[] = '<span class="tc-lead tc-warning">'.__('WARNING','theme-check').'</span>: '.__('No screenshot detected! Please include a screenshot.png or screenshot.jpg.', 'theme-check' );
|
36 |
+
$ret = false;
|
37 |
+
}
|
38 |
+
return $ret;
|
39 |
+
}
|
40 |
+
|
41 |
+
function getError() { return $this->error; }
|
42 |
+
}
|
43 |
+
$themechecks[] = new Screenshot_Checks;
|
checks/searchform.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class SearchFormCheck implements themecheck {
|
4 |
+
protected $error = array();
|
5 |
+
|
6 |
+
function check( $php_files, $css_files, $other_files ) {
|
7 |
+
|
8 |
+
$ret = true;
|
9 |
+
$checks = array( '/(include\s?\(\s?TEMPLATEPATH\s?\.?\s?["|\']\/searchform.php["|\']\s?\))/' => __( 'Please use <strong>get_search_form()</strong> instead of including searchform.php directly.', 'theme-check' ) );
|
10 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
11 |
+
foreach ($checks as $key => $check) {
|
12 |
+
checkcount();
|
13 |
+
if ( preg_match( $key, $phpfile, $out ) ) {
|
14 |
+
$grep = tc_preg( $key, $php_key );
|
15 |
+
$filename = tc_filename( $php_key );
|
16 |
+
$this->error[] = sprintf('<span class="tc-lead tc-required">'.__('REQUIRED','theme-check').'</span>: '.__('<strong>%1$s</strong> %2$s%3$s', 'theme-check'), $filename, $check, $grep);
|
17 |
+
$ret = false;
|
18 |
+
}
|
19 |
+
}
|
20 |
+
}
|
21 |
+
return $ret;
|
22 |
+
}
|
23 |
+
|
24 |
+
function getError() { return $this->error; }
|
25 |
+
}
|
26 |
+
$themechecks[] = new SearchFormCheck;
|
checks/style_needed.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Style_Needed implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$css = implode( ' ', $css_files );
|
8 |
+
$ret = true;
|
9 |
+
|
10 |
+
$checks = array(
|
11 |
+
'[ \t\/*#]*Theme Name:' => __( '<strong>Theme name:</strong> is missing from your style.css header.', 'theme-check' ),
|
12 |
+
'[ \t\/*#]*Description:' => __( '<strong>Description:</strong> is missing from your style.css header.', 'theme-check' ),
|
13 |
+
'[ \t\/*#]*Author:' => __( '<strong>Author:</strong> is missing from your style.css header.', 'theme-check' ),
|
14 |
+
'[ \t\/*#]*Version' => __( '<strong>Version:</strong> is missing from your style.css header.', 'theme-check' ),
|
15 |
+
'[ \t\/*#]*License:' => __( '<strong>License:</strong> is missing from your style.css header.', 'theme-check' ),
|
16 |
+
'[ \t\/*#]*License URI:' => __( '<strong>License URI:</strong> is missing from your style.css header.', 'theme-check' ),
|
17 |
+
'\.sticky' => __( '<strong>.sticky</strong> css class is needed in your theme css.', 'theme-check' ),
|
18 |
+
'\.bypostauthor' => __( '<strong>.bypostauthor</strong> css class is needed in your theme css.', 'theme-check' ),
|
19 |
+
'\.alignleft' => __( '<strong>.alignleft</strong> css class is needed in your theme css.', 'theme-check' ),
|
20 |
+
'\.alignright' => __( '<strong>.alignright</strong> css class is needed in your theme css.', 'theme-check' ),
|
21 |
+
'\.aligncenter' => __( '<strong>.aligncenter</strong> css class is needed in your theme css.', 'theme-check' ),
|
22 |
+
'\.wp-caption' => __( '<strong>.wp-caption</strong> css class is needed in your theme css.', 'theme-check' ),
|
23 |
+
'\.wp-caption-text' => __( '<strong>.wp-caption-text</strong> css class is needed in your theme css.', 'theme-check' ),
|
24 |
+
'\.gallery-caption' => __( '<strong>.gallery-caption</strong> css class is needed in your theme css.', 'theme-check' ),
|
25 |
+
'\.screen-reader-text' => __( '<strong>.screen-reader-text</strong> css class is needed in your theme css. See See: <a href="http://codex.wordpress.org/CSS#WordPress_Generated_Classes">the Codex</a> for an example implementation.', 'theme-check' )
|
26 |
+
);
|
27 |
+
|
28 |
+
foreach ($checks as $key => $check) {
|
29 |
+
checkcount();
|
30 |
+
if ( !preg_match( '/' . $key . '/i', $css, $matches ) ) {
|
31 |
+
$this->error[] = "<span class='tc-lead tc-required'>" . __('REQUIRED', 'theme-check' ) . "</span>:" . $check;
|
32 |
+
$ret = false;
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
return $ret;
|
37 |
+
}
|
38 |
+
function getError() { return $this->error; }
|
39 |
+
}
|
40 |
+
$themechecks[] = new Style_Needed;
|
checks/style_suggested.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Style_Suggested implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
// combine all the css files into one string to make it easier to search
|
8 |
+
$css = implode( ' ', $css_files );
|
9 |
+
|
10 |
+
checkcount();
|
11 |
+
$ret = true;
|
12 |
+
|
13 |
+
$checks = array(
|
14 |
+
'[ \t\/*#]*Theme URI:' => 'Theme URI:',
|
15 |
+
'[ \t\/*#]*Author URI:' => 'Author URI:',
|
16 |
+
);
|
17 |
+
|
18 |
+
foreach ($checks as $key => $check) {
|
19 |
+
if ( !preg_match( '/' . $key . '/i', $css, $matches ) ) {
|
20 |
+
$this->error[] = sprintf('<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('<strong>%1$s</strong> is missing from your style.css header.', 'theme-check'), $check);
|
21 |
+
}
|
22 |
+
}
|
23 |
+
|
24 |
+
return $ret;
|
25 |
+
}
|
26 |
+
|
27 |
+
function getError() { return $this->error; }
|
28 |
+
}
|
29 |
+
$themechecks[] = new Style_Suggested;
|
checks/style_tags.php
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Style_Tags implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
checkcount();
|
8 |
+
$ret = true;
|
9 |
+
$filenames = array();
|
10 |
+
|
11 |
+
foreach( $css_files as $cssfile => $content ) {
|
12 |
+
if ( basename( $cssfile ) === 'style.css' ) $data = get_theme_data_from_contents( $content );
|
13 |
+
}
|
14 |
+
|
15 |
+
if ( !$data[ 'Tags' ] ) {
|
16 |
+
$this->error[] = '<span class="tc-lead tc-recommended">' . __('RECOMMENDED','theme-check') . '</span>: ' . __( '<strong>Tags:</strong> is either empty or missing in style.css header.', 'theme-check' );
|
17 |
+
return $ret;
|
18 |
+
}
|
19 |
+
|
20 |
+
$allowed_tags = array("black","blue","brown","gray","green","orange","pink","purple","red","silver","tan","white","yellow","dark","light","one-column","two-columns","three-columns","four-columns","left-sidebar","right-sidebar","fixed-layout","fluid-layout","responsive-layout","flexible-header","accessibility-ready","blavatar","buddypress","custom-background","custom-colors","custom-header","custom-menu","editor-style","featured-image-header","featured-images","front-page-post-form","full-width-template","microformats","post-formats","rtl-language-support","sticky-post","theme-options","threaded-comments","translation-ready","holiday","photoblogging","seasonal");
|
21 |
+
|
22 |
+
foreach( $data[ 'Tags' ] as $tag ) {
|
23 |
+
if ( !in_array( strtolower( $tag ), $allowed_tags ) ) {
|
24 |
+
if ( in_array( strtolower( $tag ), array("flexible-width","fixed-width") ) ) {
|
25 |
+
$this->error[] = '<span class="tc-lead tc-warning">'. __('WARNING','theme-check'). '</span>: ' . __( 'The flexible-width and fixed-width tags changed to fluid-layout and fixed-layout tags in WordPress 3.8. Additionally, the responsive-layout tag was added. Please change to using one of the new tags.', 'theme-check' );
|
26 |
+
} else {
|
27 |
+
$this->error[] = '<span class="tc-lead tc-warning">'. __('WARNING','theme-check'). '</span>: ' . sprintf(__('Found wrong tag, remove <strong>%1$s</strong> from your style.css header.', 'theme-check'), $tag);
|
28 |
+
$ret = false;
|
29 |
+
}
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
return $ret;
|
34 |
+
}
|
35 |
+
|
36 |
+
function getError() { return $this->error; }
|
37 |
+
}
|
38 |
+
$themechecks[] = new Style_Tags;
|
checks/suggested.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Suggested implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
|
9 |
+
$checks = array(
|
10 |
+
'/[\s|]get_bloginfo\(\s?("|\')url("|\')\s?\)/' => 'home_url()',
|
11 |
+
'/[\s|]get_bloginfo\(\s?("|\')wpurl("|\')\s?\)/' => 'site_url()',
|
12 |
+
'/[\s|]get_bloginfo\(\s?("|\')stylesheet_directory("|\')\s?\)/' => 'get_stylesheet_directory_uri()',
|
13 |
+
'/[\s|]get_bloginfo\(\s?("|\')template_directory("|\')\s?\)/' => 'get_template_directory_uri()',
|
14 |
+
'/[\s|]get_bloginfo\(\s?("|\')template_url("|\')\s?\)/' => 'get_template_directory_uri()',
|
15 |
+
'/[\s|]get_bloginfo\(\s?("|\')text_direction("|\')\s?\)/' => 'is_rtl()',
|
16 |
+
'/[\s|]get_bloginfo\(\s?("|\')feed_url("|\')\s?\)/' => 'get_feed_link( \'feed\' ) (feed = rss, rss2, atom)',
|
17 |
+
'/[\s|]bloginfo\(\s?("|\')url("|\')\s?\)/' => 'echo home_url()',
|
18 |
+
'/[\s|]bloginfo\(\s?("|\')wpurl("|\')\s?\)/' => 'echo site_url()',
|
19 |
+
'/[\s|]bloginfo\(\s?("|\')stylesheet_directory("|\')\s?\)/' => 'get_stylesheet_directory_uri()',
|
20 |
+
'/[\s|]bloginfo\(\s?("|\')template_directory("|\')\s?\)/' => 'get_template_directory_uri()',
|
21 |
+
'/[\s|]bloginfo\(\s?("|\')template_url("|\')\s?\)/' => 'get_template_directory_uri()',
|
22 |
+
'/[\s|]bloginfo\(\s?("|\')text_direction("|\')\s?\)/' => 'is_rtl()',
|
23 |
+
'/[\s|]bloginfo\(\s?("|\')feed_url("|\')\s?\)/' => 'get_feed_link( \'feed\' ) (feed = rss, rss2, atom)',
|
24 |
+
);
|
25 |
+
|
26 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
27 |
+
foreach ( $checks as $key => $check ) {
|
28 |
+
checkcount();
|
29 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
30 |
+
$filename = tc_filename( $php_key );
|
31 |
+
$matches[0] = str_replace(array('"',"'"),'', $matches[0]);
|
32 |
+
$error = trim( esc_html( rtrim($matches[0], '(' ) ) );
|
33 |
+
$grep = tc_grep( rtrim( $matches[0], '(' ), $php_key );
|
34 |
+
$this->error[] = sprintf('<span class="tc-lead tc-recommended">' . __( 'RECOMMENDED', 'theme-check' ) . '</span>: '. __( '<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. Use <strong>%3$s</strong> instead.%4$s', 'theme-check'), $error, $filename, $check, $grep);
|
35 |
+
}
|
36 |
+
}
|
37 |
+
}
|
38 |
+
return $ret;
|
39 |
+
}
|
40 |
+
|
41 |
+
function getError() { return $this->error; }
|
42 |
+
}
|
43 |
+
$themechecks[] = new Suggested;
|
checks/tags.php
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class TagCheck 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 |
+
checkcount();
|
11 |
+
$ret = true;
|
12 |
+
if ( strpos( $php, 'the_tags' ) === false && strpos( $php, 'get_the_tag_list' ) === false && strpos( $php, 'get_the_term_list' ) === false ) {
|
13 |
+
$this->error[] = "<span class='tc-lead tc-required'>" . __( 'REQUIRED', 'theme-check' ) . '</span>: '. __( "This theme doesn't seem to display tags. Modify it to display tags in appropriate locations.", "theme-check" );
|
14 |
+
$ret = false;
|
15 |
+
}
|
16 |
+
|
17 |
+
return $ret;
|
18 |
+
}
|
19 |
+
|
20 |
+
function getError() { return $this->error; }
|
21 |
+
}
|
22 |
+
$themechecks[] = new TagCheck;
|
checks/textdomain.php
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class TextDomainCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
// rules come from WordPress core tool makepot.php, modified by me to have domain info
|
6 |
+
var $rules = array(
|
7 |
+
'_' => array('string', 'domain'),
|
8 |
+
'__' => array('string', 'domain'),
|
9 |
+
'_e' => array('string', 'domain'),
|
10 |
+
'_c' => array('string', 'domain'),
|
11 |
+
'_n' => array('singular', 'plural', 'domain'),
|
12 |
+
'_n_noop' => array('singular', 'plural', 'domain'),
|
13 |
+
'_nc' => array('singular', 'plural', 'domain'),
|
14 |
+
'__ngettext' => array('singular', 'plural', 'domain'),
|
15 |
+
'__ngettext_noop' => array('singular', 'plural', 'domain'),
|
16 |
+
'_x' => array('string', 'context', 'domain'),
|
17 |
+
'_ex' => array('string', 'context', 'domain'),
|
18 |
+
'_nx' => array('singular', 'plural', 'context', 'domain'),
|
19 |
+
'_nx_noop' => array('singular', 'plural', 'context', 'domain'),
|
20 |
+
'_n_js' => array('singular', 'plural', 'domain'),
|
21 |
+
'_nx_js' => array('singular', 'plural', 'context', 'domain'),
|
22 |
+
'esc_attr__' => array('string', 'domain'),
|
23 |
+
'esc_html__' => array('string', 'domain'),
|
24 |
+
'esc_attr_e' => array('string', 'domain'),
|
25 |
+
'esc_html_e' => array('string', 'domain'),
|
26 |
+
'esc_attr_x' => array('string', 'context', 'domain'),
|
27 |
+
'esc_html_x' => array('string', 'context', 'domain'),
|
28 |
+
'comments_number_link' => array('string', 'singular', 'plural', 'domain'),
|
29 |
+
);
|
30 |
+
|
31 |
+
// core names their themes differently
|
32 |
+
var $exceptions = array( 'twentyten', 'twentyeleven', 'twentytwelve', 'twentythirteen', 'twentyfourteen', 'twentyfifteen', 'twentysixteen', 'twentyseventeen', 'twentyeighteen', 'twentynineteen', 'twentytwenty' );
|
33 |
+
|
34 |
+
function check( $php_files, $css_files, $other_files ) {
|
35 |
+
global $data, $themename;
|
36 |
+
|
37 |
+
// ignore core themes for this one check
|
38 |
+
if ( !in_array($themename, $this->exceptions) ) {
|
39 |
+
$correct_domain = sanitize_title_with_dashes($data['Name']);
|
40 |
+
if ( $themename != $correct_domain ) {
|
41 |
+
$this->error[] = '<span class="tc-lead tc-warning">' . __( 'WARNING', 'theme-check' ) . '</span>: '
|
42 |
+
. sprintf ( __( "Your theme appears to be in the wrong directory for the theme name. The directory name must match the slug of the theme. This theme's correct slug and text-domain is <strong>%s</strong>.", 'theme-check' ), $correct_domain );
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
|
47 |
+
$ret = true;
|
48 |
+
$error = '';
|
49 |
+
checkcount();
|
50 |
+
|
51 |
+
// make sure the tokenizer is available
|
52 |
+
if ( !function_exists( 'token_get_all' ) ) {
|
53 |
+
return true;
|
54 |
+
}
|
55 |
+
|
56 |
+
$funcs = array_keys($this->rules);
|
57 |
+
|
58 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
59 |
+
$error='';
|
60 |
+
|
61 |
+
// tokenize the file
|
62 |
+
$tokens = token_get_all($phpfile);
|
63 |
+
|
64 |
+
$in_func = false;
|
65 |
+
$args_started = false;
|
66 |
+
$parens_balance = 0;
|
67 |
+
$found_domain = false;
|
68 |
+
|
69 |
+
foreach($tokens as $token) {
|
70 |
+
$string_success = false;
|
71 |
+
|
72 |
+
if (is_array($token)) {
|
73 |
+
list($id, $text) = $token;
|
74 |
+
if (T_STRING == $id && in_array($text, $funcs)) {
|
75 |
+
$in_func = true;
|
76 |
+
$func = $text;
|
77 |
+
$parens_balance = 0;
|
78 |
+
$args_started = false;
|
79 |
+
$found_domain = false;
|
80 |
+
} elseif (T_CONSTANT_ENCAPSED_STRING == $id) {
|
81 |
+
if ($in_func && $args_started) {
|
82 |
+
if ($this->rules[$func][$args_count] == 'domain') {
|
83 |
+
// strip quotes from the domain, avoids 'domain' and "domain" not being recognized as the same
|
84 |
+
$text = str_replace(array('"', "'"), '', $text);
|
85 |
+
$domains[] = $text;
|
86 |
+
$found_domain=true;
|
87 |
+
}
|
88 |
+
if ($parens_balance == 1) {
|
89 |
+
$args_count++;
|
90 |
+
$args[] = $text;
|
91 |
+
}
|
92 |
+
}
|
93 |
+
}
|
94 |
+
$token = $text;
|
95 |
+
} elseif ('(' == $token){
|
96 |
+
if ($parens_balance == 0) {
|
97 |
+
$args=array();
|
98 |
+
$args_started = true;
|
99 |
+
$args_count = 0;
|
100 |
+
}
|
101 |
+
++$parens_balance;
|
102 |
+
} elseif (')' == $token) {
|
103 |
+
--$parens_balance;
|
104 |
+
if ($in_func && 0 == $parens_balance) {
|
105 |
+
if (!$found_domain) {
|
106 |
+
$this->error[] = '<span class="tc-lead tc-warning">' . __( 'WARNING', 'theme-check' ) . '</span>: '
|
107 |
+
. sprintf ( __( 'Found a translation function that is missing a text-domain. Function <strong>%1$s</strong>, with the arguments <strong>%2$s</strong>', 'theme-check' ),
|
108 |
+
$func, implode(',',$args) );
|
109 |
+
}
|
110 |
+
$in_func = false;
|
111 |
+
$func='';
|
112 |
+
$args_started = false;
|
113 |
+
$found_domain = false;
|
114 |
+
}
|
115 |
+
}
|
116 |
+
}
|
117 |
+
}
|
118 |
+
|
119 |
+
$domains = array_unique($domains);
|
120 |
+
$domainlist = implode( ',', $domains );
|
121 |
+
$domainscount = count($domains);
|
122 |
+
|
123 |
+
if ( $domainscount > 1 ) {
|
124 |
+
$this->error[] = '<span class="tc-lead tc-info">' . __( 'INFO', 'theme-check' ) . '</span>: '
|
125 |
+
. __( 'More than one text-domain is being used in this theme. This means the theme will not be compatible with WordPress.org language packs.', 'theme-check' )
|
126 |
+
. '<br>'
|
127 |
+
. sprintf( __( "The domains found are <strong>%s</strong>", 'theme-check'), $domainlist );
|
128 |
+
} else {
|
129 |
+
$this->error[] = '<span class="tc-lead tc-info">' . __( 'INFO', 'theme-check' ) . '</span>: '
|
130 |
+
. __( "Only one text-domain is being used in this theme. Make sure it matches the theme's slug correctly so that the theme will be compatible with WordPress.org language packs.", 'theme-check' )
|
131 |
+
. '<br>'
|
132 |
+
. sprintf( __( "The domain found is <strong>%s</strong>", 'theme-check'), $domainlist );
|
133 |
+
|
134 |
+
}
|
135 |
+
|
136 |
+
return $ret;
|
137 |
+
}
|
138 |
+
|
139 |
+
function getError() { return $this->error; }
|
140 |
+
}
|
141 |
+
$themechecks[] = new TextDomainCheck;
|
checks/time_date.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Time_Date implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
|
7 |
+
$ret = true;
|
8 |
+
|
9 |
+
$checks = array(
|
10 |
+
'/\sdate_i18n\(\s?["|\'][A-Za-z\s]+\s?["|\']\)/' => 'date_i18n( get_option( \'date_format\' ) )',
|
11 |
+
'/[^get_]the_date\(\s?["|\'][A-Za-z\s]+\s?["|\']\)/' => 'the_date( get_option( \'date_format\' ) )',
|
12 |
+
'/[^get_]the_time\(\s?["|\'][A-Za-z\s]+\s?["|\']\)/' => 'the_time( get_option( \'date_format\' ) )'
|
13 |
+
);
|
14 |
+
|
15 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
16 |
+
foreach ( $checks as $key => $check ) {
|
17 |
+
checkcount();
|
18 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
19 |
+
$filename = tc_filename( $php_key );
|
20 |
+
$matches[0] = str_replace(array('"',"'"),'', $matches[0]);
|
21 |
+
$error = trim( esc_html( rtrim( $matches[0], '(' ) ) );
|
22 |
+
$this->error[] = sprintf( '<span class="tc-lead tc-info">' . __( 'INFO', 'theme-check' ) . '</span>: ' . __( "At least one hard coded date was found in the file <strong>%s</strong>. Consider get_option( 'date_format' ) instead.", 'theme-check' ), $filename );
|
23 |
+
}
|
24 |
+
}
|
25 |
+
}
|
26 |
+
return $ret;
|
27 |
+
}
|
28 |
+
|
29 |
+
function getError() { return $this->error; }
|
30 |
+
}
|
31 |
+
$themechecks[] = new Time_Date;
|
checks/title.php
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Checks for the title:
|
4 |
+
* Are there <title> and </title> tags?
|
5 |
+
* Is there a call to wp_title()?
|
6 |
+
* There can't be any hardcoded text in the <title> tag.
|
7 |
+
*
|
8 |
+
* See: http://make.wordpress.org/themes/guidelines/guidelines-theme-check/
|
9 |
+
*/
|
10 |
+
class Title_Checks implements themecheck {
|
11 |
+
protected $error = array();
|
12 |
+
|
13 |
+
function check( $php_files, $css_files, $other_files ) {
|
14 |
+
$ret = true;
|
15 |
+
$php = implode( ' ', $php_files );
|
16 |
+
|
17 |
+
// Look for add_theme_support( 'title-tag' ) first
|
18 |
+
$titletag = true;
|
19 |
+
if ( ! preg_match( '#add_theme_support\s?\(\s?[\'|"]title-tag#', $php ) ) {
|
20 |
+
$this->error[] = '<span class="tc-lead tc-recommended">'.__('RECOMMENDED','theme-check').'</span>: '.__('No reference to <strong>add_theme_support( "title-tag" )</strong> was found in the theme. It is recommended that the theme implement this functionality for WordPress 4.1 and above.', 'theme-check' );
|
21 |
+
$titletag = false;
|
22 |
+
}
|
23 |
+
|
24 |
+
// Look for <title> and </title> tags.
|
25 |
+
checkcount();
|
26 |
+
if ( ( false === strpos( $php, '<title>' ) || false === strpos( $php, '</title>' ) ) && !$titletag ) {
|
27 |
+
$this->error[] = '<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check').'</span>: ' . __( 'The theme needs to have <strong><title></strong> tags, ideally in the <strong>header.php</strong> file.', 'theme-check' );
|
28 |
+
$ret = false;
|
29 |
+
}
|
30 |
+
|
31 |
+
// Check whether there is a call to wp_title()
|
32 |
+
checkcount();
|
33 |
+
if ( false === strpos( $php, 'wp_title(' ) && !$titletag ) {
|
34 |
+
$this->error[] = '<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check').'</span>: ' . __( 'The theme needs to have a call to <strong>wp_title()</strong>, ideally in the <strong>header.php</strong> file.', 'theme-check' );
|
35 |
+
$ret = false;
|
36 |
+
}
|
37 |
+
|
38 |
+
//Check whether the the <title> tag contains something besides a call to wp_title()
|
39 |
+
checkcount();
|
40 |
+
|
41 |
+
foreach ( $php_files as $file_path => $file_content ) {
|
42 |
+
// Look for anything that looks like <svg>...</svg> and exclude it (inline svg's have titles too)
|
43 |
+
$file_content = preg_replace('/<svg>.*<\/svg>/s', '', $file_content);
|
44 |
+
|
45 |
+
// First looks ahead to see of there's <title>...</title>
|
46 |
+
// Then performs a negative look ahead for <title> wp_title(...); </title>
|
47 |
+
if ( preg_match( '/(?=<title>(.*)<\/title>)(?!<title>\s*<\?php\s*wp_title\([^\)]*\);\s*\?>\s*<\/title>)/s', $file_content ) ) {
|
48 |
+
$this->error[] = '<span class="tc-lead tc-required">' . __( 'REQUIRED', 'theme-check').'</span>: ' . __( 'The <strong><title></strong> tags can only contain a call to <strong>wp_title()</strong>. Use the <strong>wp_title filter</strong> to modify the output', 'theme-check' );
|
49 |
+
$ret = false;
|
50 |
+
}
|
51 |
+
}
|
52 |
+
|
53 |
+
return $ret;
|
54 |
+
}
|
55 |
+
|
56 |
+
function getError() { return $this->error; }
|
57 |
+
}
|
58 |
+
|
59 |
+
$themechecks[] = new Title_Checks;
|
checks/widgets.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class WidgetsCheck 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 |
+
|
14 |
+
// no widgets registered or used...
|
15 |
+
if ( strpos( $php, 'register_sidebar' ) === false && strpos( $php, 'dynamic_sidebar' ) === false ) {
|
16 |
+
$this->error[] = "<span class='tc-lead tc-recommended'>" . __( "RECOMMENDED", 'theme-check') . '</span>: '. __( "This theme contains no sidebars/widget areas. See <a href='https://codex.wordpress.org/Widgets_API'>Widgets API</a>", "theme-check" );
|
17 |
+
$ret = true;
|
18 |
+
}
|
19 |
+
|
20 |
+
if ( strpos( $php, 'register_sidebar' ) !== false && strpos( $php, 'dynamic_sidebar' ) === false ) {
|
21 |
+
$this->error[] = "<span class='tc-lead tc-required'>" . __( "REQUIRED", 'theme-check') . '</span>: '. __( "The theme appears to use <strong>register_sidebar()</strong> but no <strong>dynamic_sidebar()</strong> was found. See: <a href='https://codex.wordpress.org/Function_Reference/dynamic_sidebar'>dynamic_sidebar</a><pre> <?php dynamic_sidebar( \$index ); ?></pre>", "theme-check" );
|
22 |
+
$ret = false;
|
23 |
+
}
|
24 |
+
|
25 |
+
if ( strpos( $php, 'register_sidebar' ) === false && strpos( $php, 'dynamic_sidebar' ) !== false ) {
|
26 |
+
$this->error[] = "<span class='tc-lead tc-required'>" . __( "REQUIRED", 'theme-check') . '</span>: '. __( "The theme appears to use <strong>dynamic_sidebars()</strong> but no <strong>register_sidebar()</strong> was found. See: <a href='https://codex.wordpress.org/Function_Reference/register_sidebar'>register_sidebar</a><pre> <?php register_sidebar( \$args ); ?></pre>", "theme-check" );
|
27 |
+
$ret = false;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* There are widgets registered, is the widgets_init action present?
|
32 |
+
*/
|
33 |
+
if ( strpos( $php, 'register_sidebar' ) !== false && preg_match( '/add_action\(\s*("|\')widgets_init("|\')\s*,/', $php ) == false ) {
|
34 |
+
$this->error[] = "<span class='tc-lead tc-required'>" . __( "REQUIRED", 'theme-check') . '</span>: '. sprintf( __( "Sidebars need to be registered in a custom function hooked to the <strong>widgets_init</strong> action. See: %s.", "theme-check" ), '<a href="https://codex.wordpress.org/Function_Reference/register_sidebar">register_sidebar()</a>' );
|
35 |
+
$ret = false;
|
36 |
+
}
|
37 |
+
return $ret;
|
38 |
+
}
|
39 |
+
|
40 |
+
function getError() { return $this->error; }
|
41 |
+
}
|
42 |
+
$themechecks[] = new WidgetsCheck;
|
checks/worms.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class WormCheck implements themecheck {
|
3 |
+
protected $error = array();
|
4 |
+
|
5 |
+
function check( $php_files, $css_files, $other_files ) {
|
6 |
+
$ret = true;
|
7 |
+
$php_files = array_merge( $php_files, $other_files );
|
8 |
+
$checks = array(
|
9 |
+
'/wshell\.php/'=> __( 'This may be a script used by hackers to get control of your server!', 'theme-check' ),
|
10 |
+
'/ShellBOT/' => __( 'This may be a script used by hackers to get control of your server', 'theme-check' ),
|
11 |
+
'/uname -a/' => __( 'Tells a hacker what operating system your server is running', 'theme-check' ),
|
12 |
+
'/php \$[a-zA-Z]*=\'as\';/' => __( 'Symptom of the "Pharma Hack" <a href="http://blog.sucuri.net/2010/07/understanding-and-cleaning-the-pharma-hack-on-wordpress.html">[1]</a>', 'theme-check' ),
|
13 |
+
'/defined?\(\'wp_class_support/' => __( 'Symptom of the "Pharma Hack" <a href="http://blog.sucuri.net/2010/07/understanding-and-cleaning-the-pharma-hack-on-wordpress.html">[1]</a>', 'theme-check' ),
|
14 |
+
);
|
15 |
+
|
16 |
+
foreach ( $php_files as $php_key => $phpfile ) {
|
17 |
+
foreach ( $checks as $key => $check ) {
|
18 |
+
checkcount();
|
19 |
+
if ( preg_match( $key, $phpfile, $matches ) ) {
|
20 |
+
$filename = tc_filename( $php_key );
|
21 |
+
$error = $matches[0];
|
22 |
+
$grep = tc_grep( $error, $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 |
+
return $ret;
|
29 |
+
}
|
30 |
+
|
31 |
+
function getError() { return $this->error; }
|
32 |
+
}
|
33 |
+
$themechecks[] = new WormCheck;
|
lang/theme-check.pot
ADDED
@@ -0,0 +1,947 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Copyright (C) 2014 Theme Check
|
2 |
+
# This file is distributed under the same license as the Theme Check package.
|
3 |
+
msgid ""
|
4 |
+
msgstr ""
|
5 |
+
"Project-Id-Version: Theme Check 20141222.1\n"
|
6 |
+
"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/theme-check\n"
|
7 |
+
"POT-Creation-Date: 2014-12-22 20:18:06+00:00\n"
|
8 |
+
"MIME-Version: 1.0\n"
|
9 |
+
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
+
"Content-Transfer-Encoding: 8bit\n"
|
11 |
+
"PO-Revision-Date: 2014-MO-DA HO:MI+ZONE\n"
|
12 |
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
13 |
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
14 |
+
|
15 |
+
#: checkbase.php:91 checkbase.php:110
|
16 |
+
msgid "Line "
|
17 |
+
msgstr ""
|
18 |
+
|
19 |
+
#: checkbase.php:251
|
20 |
+
msgid "Visit author homepage"
|
21 |
+
msgstr ""
|
22 |
+
|
23 |
+
#: checkbase.php:254
|
24 |
+
msgid "Anonymous"
|
25 |
+
msgstr ""
|
26 |
+
|
27 |
+
#: checks/admin_menu.php:13 checks/admin_menu.php:14
|
28 |
+
msgid ""
|
29 |
+
"User levels were deprecated in <strong>2.0</strong>. Please see <a href="
|
30 |
+
"\"https://codex.wordpress.org/Roles_and_Capabilities"
|
31 |
+
"\">Roles_and_Capabilities</a>"
|
32 |
+
msgstr ""
|
33 |
+
|
34 |
+
#: checks/admin_menu.php:23 checks/artisteer.php:24 checks/badthings.php:29
|
35 |
+
#: checks/filenames.php:43 checks/filenames.php:50 checks/lineendings.php:11
|
36 |
+
#: checks/lineendings.php:20 checks/lineendings.php:31 checks/malware.php:23
|
37 |
+
#: checks/phpshort.php:14 checks/plugin-territory.php:32
|
38 |
+
#: checks/screenshot.php:35 checks/style_tags.php:25 checks/style_tags.php:27
|
39 |
+
#: checks/worms.php:28 main.php:80
|
40 |
+
msgid "WARNING"
|
41 |
+
msgstr ""
|
42 |
+
|
43 |
+
#: checks/admin_menu.php:33
|
44 |
+
msgid ""
|
45 |
+
"Themes should use <strong>add_theme_page()</strong> for adding admin pages."
|
46 |
+
msgstr ""
|
47 |
+
|
48 |
+
#: checks/admin_menu.php:44 checks/basic.php:36 checks/comment_reply.php:15
|
49 |
+
#: checks/commpage.php:15 checks/content-width.php:14 checks/customizer.php:26
|
50 |
+
#: checks/customizer.php:31 checks/deprecated.php:253
|
51 |
+
#: checks/directories.php:27 checks/gravatar.php:15
|
52 |
+
#: checks/more_deprecated.php:52 checks/plugin-territory.php:24
|
53 |
+
#: checks/post-formats.php:27 checks/postsnav.php:19 checks/required.php:22
|
54 |
+
#: checks/searchform.php:16 checks/style_needed.php:30 checks/tags.php:13
|
55 |
+
#: checks/title.php:29 checks/title.php:38 checks/title.php:53
|
56 |
+
#: checks/widgets.php:21 checks/widgets.php:26 checks/widgets.php:34
|
57 |
+
msgid "REQUIRED"
|
58 |
+
msgstr ""
|
59 |
+
|
60 |
+
#: checks/artisteer.php:24
|
61 |
+
msgid ""
|
62 |
+
"This theme appears to have been auto-generated. Generated themes are not "
|
63 |
+
"allowed in the themes directory."
|
64 |
+
msgstr ""
|
65 |
+
|
66 |
+
#: checks/badthings.php:9
|
67 |
+
msgid "eval() is not allowed."
|
68 |
+
msgstr ""
|
69 |
+
|
70 |
+
#: checks/badthings.php:10
|
71 |
+
msgid ""
|
72 |
+
"PHP system calls are often disabled by server admins and should not be in "
|
73 |
+
"themes"
|
74 |
+
msgstr ""
|
75 |
+
|
76 |
+
#: checks/badthings.php:11
|
77 |
+
msgid "Themes should not change server PHP settings"
|
78 |
+
msgstr ""
|
79 |
+
|
80 |
+
#: checks/badthings.php:12
|
81 |
+
msgid "base64_decode() is not allowed"
|
82 |
+
msgstr ""
|
83 |
+
|
84 |
+
#: checks/badthings.php:13
|
85 |
+
msgid "base64_encode() is not allowed"
|
86 |
+
msgstr ""
|
87 |
+
|
88 |
+
#: checks/badthings.php:14
|
89 |
+
msgid "uudecode() is not allowed"
|
90 |
+
msgstr ""
|
91 |
+
|
92 |
+
#: checks/badthings.php:15
|
93 |
+
msgid "str_rot13() is not allowed"
|
94 |
+
msgstr ""
|
95 |
+
|
96 |
+
#: checks/badthings.php:16 checks/badthings.php:37
|
97 |
+
msgid "Google search code detected"
|
98 |
+
msgstr ""
|
99 |
+
|
100 |
+
#: checks/badthings.php:17 checks/badthings.php:38
|
101 |
+
msgid "Google advertising code detected"
|
102 |
+
msgstr ""
|
103 |
+
|
104 |
+
#: checks/badthings.php:48
|
105 |
+
msgid ""
|
106 |
+
"<span class=\"tc-lead tc-warning\">WARNING</span>: Found <strong>%1$s</"
|
107 |
+
"strong> in the file <strong>%2$s</strong>. %3$s.%4$s"
|
108 |
+
msgstr ""
|
109 |
+
|
110 |
+
#: checks/basic.php:14
|
111 |
+
msgid ""
|
112 |
+
"See: <a href=\"https://codex.wordpress.org/HTML_to_XHTML\">https://codex."
|
113 |
+
"wordpress.org/HTML_to_XHTML</a><pre><!DOCTYPE html PUBLIC \"-//W3C//DTD "
|
114 |
+
"XHTML 1.0 Strict//EN\"<br />\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict."
|
115 |
+
"dtd\"?></pre>"
|
116 |
+
msgstr ""
|
117 |
+
|
118 |
+
#: checks/basic.php:15
|
119 |
+
msgid ""
|
120 |
+
"See: <a href=\"https://codex.wordpress.org/Function_Reference/wp_footer"
|
121 |
+
"\">wp_footer</a><pre> <?php wp_footer(); ?></pre>"
|
122 |
+
msgstr ""
|
123 |
+
|
124 |
+
#: checks/basic.php:16
|
125 |
+
msgid ""
|
126 |
+
"See: <a href=\"https://codex.wordpress.org/Function_Reference/wp_head"
|
127 |
+
"\">wp_head</a><pre> <?php wp_head(); ?></pre>"
|
128 |
+
msgstr ""
|
129 |
+
|
130 |
+
#: checks/basic.php:17
|
131 |
+
msgid ""
|
132 |
+
"See: <a href=\"https://codex.wordpress.org/Function_Reference/"
|
133 |
+
"language_attributes\">language_attributes</a><pre><html <?php "
|
134 |
+
"language_attributes(); ?></pre>"
|
135 |
+
msgstr ""
|
136 |
+
|
137 |
+
#: checks/basic.php:18
|
138 |
+
msgid ""
|
139 |
+
"There must be a charset defined in the Content-Type or the meta charset tag "
|
140 |
+
"in the head."
|
141 |
+
msgstr ""
|
142 |
+
|
143 |
+
#: checks/basic.php:19
|
144 |
+
msgid ""
|
145 |
+
"See: <a href=\"https://codex.wordpress.org/Function_Reference/"
|
146 |
+
"add_theme_support\">add_theme_support</a><pre> <?php add_theme_support"
|
147 |
+
"( $feature ); ?></pre>"
|
148 |
+
msgstr ""
|
149 |
+
|
150 |
+
#: checks/basic.php:20
|
151 |
+
msgid ""
|
152 |
+
"See: <a href=\"https://codex.wordpress.org/Template_Tags/comments_template"
|
153 |
+
"\">comments_template</a><pre> <?php comments_template( $file, "
|
154 |
+
"$separate_comments ); ?></pre>"
|
155 |
+
msgstr ""
|
156 |
+
|
157 |
+
#: checks/basic.php:21
|
158 |
+
msgid ""
|
159 |
+
"See: <a href=\"https://codex.wordpress.org/Template_Tags/wp_list_comments"
|
160 |
+
"\">wp_list_comments</a><pre> <?php wp_list_comments( $args ); ?></pre>"
|
161 |
+
msgstr ""
|
162 |
+
|
163 |
+
#: checks/basic.php:22
|
164 |
+
msgid ""
|
165 |
+
"See: <a href=\"https://codex.wordpress.org/Template_Tags/comment_form"
|
166 |
+
"\">comment_form</a><pre> <?php comment_form(); ?></pre>"
|
167 |
+
msgstr ""
|
168 |
+
|
169 |
+
#: checks/basic.php:23
|
170 |
+
msgid ""
|
171 |
+
"See: <a href=\"https://codex.wordpress.org/Template_Tags/body_class"
|
172 |
+
"\">body_class</a><pre> <?php body_class( $class ); ?></pre>"
|
173 |
+
msgstr ""
|
174 |
+
|
175 |
+
#: checks/basic.php:24
|
176 |
+
msgid ""
|
177 |
+
"See: <a href=\"https://codex.wordpress.org/Function_Reference/wp_link_pages"
|
178 |
+
"\">wp_link_pages</a><pre> <?php wp_link_pages( $args ); ?></pre>"
|
179 |
+
msgstr ""
|
180 |
+
|
181 |
+
#: checks/basic.php:25
|
182 |
+
msgid ""
|
183 |
+
"See: <a href=\"https://codex.wordpress.org/Template_Tags/post_class"
|
184 |
+
"\">post_class</a><pre> <div id=\"post-<?php the_ID(); ?>\" <?php "
|
185 |
+
"post_class(); ?>></pre>"
|
186 |
+
msgstr ""
|
187 |
+
|
188 |
+
#: checks/basic.php:31
|
189 |
+
msgid "add_theme_support( 'automatic-feed-links' )"
|
190 |
+
msgstr ""
|
191 |
+
|
192 |
+
#: checks/basic.php:32
|
193 |
+
msgid "wp_enqueue_script( 'comment-reply' )"
|
194 |
+
msgstr ""
|
195 |
+
|
196 |
+
#: checks/basic.php:33
|
197 |
+
msgid "body_class call in body tag"
|
198 |
+
msgstr ""
|
199 |
+
|
200 |
+
#: checks/basic.php:34
|
201 |
+
msgid "register_sidebar() or register_sidebars()"
|
202 |
+
msgstr ""
|
203 |
+
|
204 |
+
#: checks/basic.php:36
|
205 |
+
msgid "Could not find <strong>%1$s</strong>. %2$s"
|
206 |
+
msgstr ""
|
207 |
+
|
208 |
+
#: checks/cdn.php:32 checks/constants.php:24 checks/customs.php:14
|
209 |
+
#: checks/customs.php:18 checks/dep_recommend.php:51 checks/editorstyle.php:13
|
210 |
+
#: checks/filenames.php:57 checks/i18n.php:49 checks/navmenu.php:14
|
211 |
+
#: checks/postthumb.php:15 checks/postthumb.php:19 checks/screenshot.php:24
|
212 |
+
#: checks/screenshot.php:27 checks/screenshot.php:30
|
213 |
+
#: checks/style_suggested.php:20 checks/style_tags.php:16
|
214 |
+
#: checks/suggested.php:34 checks/textdomain.php:30 checks/textdomain.php:55
|
215 |
+
#: checks/textdomain.php:59 checks/title.php:20 checks/widgets.php:16
|
216 |
+
msgid "RECOMMENDED"
|
217 |
+
msgstr ""
|
218 |
+
|
219 |
+
#: checks/cdn.php:32
|
220 |
+
msgid ""
|
221 |
+
"Found the URL of a CDN in the code: %s. You should not load CSS or "
|
222 |
+
"Javascript resources from a CDN, please bundle them with the theme."
|
223 |
+
msgstr ""
|
224 |
+
|
225 |
+
#: checks/comment_reply.php:14
|
226 |
+
msgid ""
|
227 |
+
"See: <a href=\"https://codex.wordpress.org/"
|
228 |
+
"Migrating_Plugins_and_Themes_to_2.7/Enhanced_Comment_Display\">Migrating "
|
229 |
+
"Plugins and Themes to 2.7/Enhanced Comment Display</a><pre> <?php if "
|
230 |
+
"( is_singular() ) wp_enqueue_script( \"comment-reply\" ); ?></pre>"
|
231 |
+
msgstr ""
|
232 |
+
|
233 |
+
#: checks/comment_reply.php:15
|
234 |
+
msgid "Could not find the <strong>comment-reply</strong> script enqueued. %1$s"
|
235 |
+
msgstr ""
|
236 |
+
|
237 |
+
#: checks/comment_reply.php:18 checks/iframes.php:20 checks/include.php:19
|
238 |
+
#: checks/links.php:25 checks/nonprintable.php:16 checks/time_date.php:22
|
239 |
+
msgid "INFO"
|
240 |
+
msgstr ""
|
241 |
+
|
242 |
+
#: checks/comment_reply.php:18
|
243 |
+
msgid ""
|
244 |
+
"Could not find the <strong>comment-reply</strong> script enqueued, however a "
|
245 |
+
"reference to 'comment-reply' was found. Make sure that the comment-reply "
|
246 |
+
"script is being enqueued properly on singular pages."
|
247 |
+
msgstr ""
|
248 |
+
|
249 |
+
#: checks/commpage.php:15
|
250 |
+
msgid ""
|
251 |
+
"The theme doesn't have comment pagination code in it. Use "
|
252 |
+
"<strong>paginate_comments_links()</strong> or <strong>next_comments_link()</"
|
253 |
+
"strong> and <strong>previous_comments_link()</strong> to add comment "
|
254 |
+
"pagination."
|
255 |
+
msgstr ""
|
256 |
+
|
257 |
+
#: checks/constants.php:24 checks/more_deprecated.php:52
|
258 |
+
#: checks/required.php:22 checks/suggested.php:34
|
259 |
+
msgid ""
|
260 |
+
"<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. Use "
|
261 |
+
"<strong>%3$s</strong> instead.%4$s"
|
262 |
+
msgstr ""
|
263 |
+
|
264 |
+
#: checks/content-width.php:14
|
265 |
+
msgid ""
|
266 |
+
"No content width has been defined. Example: <pre>if ( ! isset"
|
267 |
+
"( $content_width ) ) $content_width = 900;</pre>"
|
268 |
+
msgstr ""
|
269 |
+
|
270 |
+
#: checks/customizer.php:26
|
271 |
+
msgid ""
|
272 |
+
"Found a Customizer setting that did not have a sanitization callback "
|
273 |
+
"function. Every call to the <strong>add_setting()</strong> method needs to "
|
274 |
+
"have a sanitization callback function passed."
|
275 |
+
msgstr ""
|
276 |
+
|
277 |
+
#: checks/customizer.php:31
|
278 |
+
msgid ""
|
279 |
+
"Found a Customizer setting that had an empty value passed as sanitization "
|
280 |
+
"callback. You need to pass a function name as sanitization callback."
|
281 |
+
msgstr ""
|
282 |
+
|
283 |
+
#: checks/customs.php:14
|
284 |
+
msgid ""
|
285 |
+
"No reference to <strong>add_theme_support( \"custom-header\", $args )</"
|
286 |
+
"strong> was found in the theme. It is recommended that the theme implement "
|
287 |
+
"this functionality if using an image for the header."
|
288 |
+
msgstr ""
|
289 |
+
|
290 |
+
#: checks/customs.php:18
|
291 |
+
msgid ""
|
292 |
+
"No reference to <strong>add_theme_support( \"custom-background\", $args )</"
|
293 |
+
"strong> was found in the theme. If the theme uses background images or solid "
|
294 |
+
"colors for the background, then it is recommended that the theme implement "
|
295 |
+
"this functionality."
|
296 |
+
msgstr ""
|
297 |
+
|
298 |
+
#: checks/dep_recommend.php:36 checks/deprecated.php:238
|
299 |
+
msgid "%1$s found in the file %2$s. Deprecated since version %3$s."
|
300 |
+
msgstr ""
|
301 |
+
|
302 |
+
#: checks/dep_recommend.php:44 checks/deprecated.php:246
|
303 |
+
msgid "Use %s instead."
|
304 |
+
msgstr ""
|
305 |
+
|
306 |
+
#: checks/directories.php:27
|
307 |
+
msgid ""
|
308 |
+
"Please remove any extraneous directories like .git or .svn from the ZIP file "
|
309 |
+
"before uploading it."
|
310 |
+
msgstr ""
|
311 |
+
|
312 |
+
#: checks/editorstyle.php:13
|
313 |
+
msgid ""
|
314 |
+
"No reference to <strong>add_editor_style()</strong> was found in the theme. "
|
315 |
+
"It is recommended that the theme implement editor styling, so as to make the "
|
316 |
+
"editor content match the resulting post output in the theme, for a better "
|
317 |
+
"user experience."
|
318 |
+
msgstr ""
|
319 |
+
|
320 |
+
#: checks/filenames.php:21
|
321 |
+
msgid "Windows thumbnail store"
|
322 |
+
msgstr ""
|
323 |
+
|
324 |
+
#: checks/filenames.php:22
|
325 |
+
msgid "windows system file"
|
326 |
+
msgstr ""
|
327 |
+
|
328 |
+
#: checks/filenames.php:23 checks/filenames.php:24
|
329 |
+
msgid "NetBeans Project File"
|
330 |
+
msgstr ""
|
331 |
+
|
332 |
+
#: checks/filenames.php:25
|
333 |
+
msgid "Komodo Project File"
|
334 |
+
msgstr ""
|
335 |
+
|
336 |
+
#: checks/filenames.php:26
|
337 |
+
msgid "Hidden Files or Folders"
|
338 |
+
msgstr ""
|
339 |
+
|
340 |
+
#: checks/filenames.php:27
|
341 |
+
msgid "PHP server settings file"
|
342 |
+
msgstr ""
|
343 |
+
|
344 |
+
#: checks/filenames.php:28
|
345 |
+
msgid "Dreamweaver project file"
|
346 |
+
msgstr ""
|
347 |
+
|
348 |
+
#: checks/filenames.php:29
|
349 |
+
msgid "PHP error log"
|
350 |
+
msgstr ""
|
351 |
+
|
352 |
+
#: checks/filenames.php:30
|
353 |
+
msgid "Server settings file"
|
354 |
+
msgstr ""
|
355 |
+
|
356 |
+
#: checks/filenames.php:31
|
357 |
+
msgid "SQL dump file"
|
358 |
+
msgstr ""
|
359 |
+
|
360 |
+
#: checks/filenames.php:32
|
361 |
+
msgid "OSX system file"
|
362 |
+
msgstr ""
|
363 |
+
|
364 |
+
#: checks/filenames.php:36
|
365 |
+
msgid ""
|
366 |
+
"Please see <a href=\"https://codex.wordpress.org/"
|
367 |
+
"Theme_Review#Theme_Documentation\">Theme_Documentation</a> for more "
|
368 |
+
"information."
|
369 |
+
msgstr ""
|
370 |
+
|
371 |
+
#: checks/filenames.php:43
|
372 |
+
msgid "<strong>%1$s</strong> %2$s found."
|
373 |
+
msgstr ""
|
374 |
+
|
375 |
+
#: checks/filenames.php:50
|
376 |
+
msgid "could not find the file <strong>%1$s</strong> in the theme."
|
377 |
+
msgstr ""
|
378 |
+
|
379 |
+
#: checks/filenames.php:57
|
380 |
+
msgid "could not find the file <strong>%1$s</strong> in the theme. %2$s"
|
381 |
+
msgstr ""
|
382 |
+
|
383 |
+
#: checks/gravatar.php:15
|
384 |
+
msgid ""
|
385 |
+
"This theme doesn't seem to support the standard avatar functions. Use "
|
386 |
+
"<strong>get_avatar</strong> or <strong>wp_list_comments</strong> to add this "
|
387 |
+
"support."
|
388 |
+
msgstr ""
|
389 |
+
|
390 |
+
#: checks/i18n.php:49
|
391 |
+
msgid ""
|
392 |
+
"Possible variable <strong>%1$s</strong> found in translation function in "
|
393 |
+
"<strong>%2$s</strong>. Translation function calls must NOT contain PHP "
|
394 |
+
"variables. %3$s"
|
395 |
+
msgstr ""
|
396 |
+
|
397 |
+
#: checks/iframes.php:9
|
398 |
+
msgid ""
|
399 |
+
"iframes are sometimes used to load unwanted adverts and code on your site"
|
400 |
+
msgstr ""
|
401 |
+
|
402 |
+
#: checks/iframes.php:20 checks/malware.php:23
|
403 |
+
msgid ""
|
404 |
+
"<strong>%1$s</strong> was found in the file <strong>%2$s</strong> %3$s.%4$s"
|
405 |
+
msgstr ""
|
406 |
+
|
407 |
+
#: checks/include.php:10
|
408 |
+
msgid ""
|
409 |
+
"The theme appears to use include or require. If these are being used to "
|
410 |
+
"include separate sections of a template from independent files, then "
|
411 |
+
"<strong>get_template_part()</strong> should be used instead."
|
412 |
+
msgstr ""
|
413 |
+
|
414 |
+
#: checks/include.php:19
|
415 |
+
msgid "<strong>%1$s</strong> %2$s %3$s"
|
416 |
+
msgstr ""
|
417 |
+
|
418 |
+
#: checks/lineendings.php:11 checks/lineendings.php:20
|
419 |
+
#: checks/lineendings.php:31
|
420 |
+
msgid ""
|
421 |
+
"Both DOS and UNIX style line endings were found in the file <strong>%1$s</"
|
422 |
+
"strong>. This causes a problem with SVN repositories and must be corrected "
|
423 |
+
"before the theme can be accepted. Please change the file to use only one "
|
424 |
+
"style of line endings."
|
425 |
+
msgstr ""
|
426 |
+
|
427 |
+
#: checks/links.php:25
|
428 |
+
msgid ""
|
429 |
+
"Possible hard-coded links were found in the file <strong>%1$s</strong>.%2$s"
|
430 |
+
msgstr ""
|
431 |
+
|
432 |
+
#: checks/malware.php:9
|
433 |
+
msgid ""
|
434 |
+
"File operations should use the WP_Filesystem methods instead of direct PHP "
|
435 |
+
"filesystem calls"
|
436 |
+
msgstr ""
|
437 |
+
|
438 |
+
#: checks/navmenu.php:14
|
439 |
+
msgid ""
|
440 |
+
"No reference to nav_menu's was found in the theme. Note that if your theme "
|
441 |
+
"has a menu bar, it is required to use the WordPress nav_menu functionality "
|
442 |
+
"for it."
|
443 |
+
msgstr ""
|
444 |
+
|
445 |
+
#: checks/nonprintable.php:16
|
446 |
+
msgid ""
|
447 |
+
"Non-printable characters were found in the <strong>%1$s</strong> file. You "
|
448 |
+
"may want to check this file for errors.%2$s"
|
449 |
+
msgstr ""
|
450 |
+
|
451 |
+
#: checks/phpshort.php:14
|
452 |
+
msgid "Found PHP short tags in file <strong>%1$s</strong>.%2$s"
|
453 |
+
msgstr ""
|
454 |
+
|
455 |
+
#: checks/plugin-territory.php:24
|
456 |
+
msgid ""
|
457 |
+
"The theme uses the %s function, which is plugin-territory functionality."
|
458 |
+
msgstr ""
|
459 |
+
|
460 |
+
#: checks/plugin-territory.php:32
|
461 |
+
msgid ""
|
462 |
+
"The theme uses the %s function. Custom post-content shortcodes are plugin-"
|
463 |
+
"territory functionality."
|
464 |
+
msgstr ""
|
465 |
+
|
466 |
+
#: checks/post-formats.php:27
|
467 |
+
msgid ""
|
468 |
+
"<strong>%1$s</strong> was found in the file <strong>%2$s</strong>. However "
|
469 |
+
"get_post_format and/or has_post_format were not found, and no use of formats "
|
470 |
+
"in the CSS was detected."
|
471 |
+
msgstr ""
|
472 |
+
|
473 |
+
#: checks/postsnav.php:19
|
474 |
+
msgid ""
|
475 |
+
"The theme doesn't have post pagination code in it. Use <strong>posts_nav_link"
|
476 |
+
"()</strong> or <strong>paginate_links()</strong> or "
|
477 |
+
"<strong>the_posts_pagination()</strong> or or <strong>the_posts_navigation()"
|
478 |
+
"</strong> or <strong>next_posts_link()</strong> and "
|
479 |
+
"<strong>previous_posts_link()</strong> to add post pagination."
|
480 |
+
msgstr ""
|
481 |
+
|
482 |
+
#: checks/postthumb.php:15
|
483 |
+
msgid ""
|
484 |
+
"No reference to <strong>the_post_thumbnail()</strong> was found in the "
|
485 |
+
"theme. It is recommended that the theme implement this functionality instead "
|
486 |
+
"of using custom fields for thumbnails."
|
487 |
+
msgstr ""
|
488 |
+
|
489 |
+
#: checks/postthumb.php:19
|
490 |
+
msgid ""
|
491 |
+
"No reference to post-thumbnails was found in the theme. If the theme has a "
|
492 |
+
"thumbnail like functionality, it should be implemented with "
|
493 |
+
"<strong>add_theme_support( \"post-thumbnails\" )</strong>in the functions."
|
494 |
+
"php file."
|
495 |
+
msgstr ""
|
496 |
+
|
497 |
+
#: checks/screenshot.php:24
|
498 |
+
msgid ""
|
499 |
+
"Screenshot is wrong size! Detected: <strong>%1$sx%2$spx</strong>. Maximum "
|
500 |
+
"allowed size is 880x660px."
|
501 |
+
msgstr ""
|
502 |
+
|
503 |
+
#: checks/screenshot.php:27
|
504 |
+
msgid ""
|
505 |
+
"Screenshot dimensions are wrong! Ratio of width to height should be 4:3."
|
506 |
+
msgstr ""
|
507 |
+
|
508 |
+
#: checks/screenshot.php:30
|
509 |
+
msgid ""
|
510 |
+
"Screenshot size should be 880x660, to account for HiDPI displays. Any 4:3 "
|
511 |
+
"image size is acceptable, but 880x660 is preferred."
|
512 |
+
msgstr ""
|
513 |
+
|
514 |
+
#: checks/screenshot.php:35
|
515 |
+
msgid ""
|
516 |
+
"No screenshot detected! Please include a screenshot.png or screenshot.jpg."
|
517 |
+
msgstr ""
|
518 |
+
|
519 |
+
#: checks/searchform.php:9
|
520 |
+
msgid ""
|
521 |
+
"Please use <strong>get_search_form()</strong> instead of including "
|
522 |
+
"searchform.php directly."
|
523 |
+
msgstr ""
|
524 |
+
|
525 |
+
#: checks/searchform.php:16
|
526 |
+
msgid "<strong>%1$s</strong> %2$s%3$s"
|
527 |
+
msgstr ""
|
528 |
+
|
529 |
+
#: checks/style_needed.php:11
|
530 |
+
msgid "<strong>Theme name:</strong> is missing from your style.css header."
|
531 |
+
msgstr ""
|
532 |
+
|
533 |
+
#: checks/style_needed.php:12
|
534 |
+
msgid "<strong>Description:</strong> is missing from your style.css header."
|
535 |
+
msgstr ""
|
536 |
+
|
537 |
+
#: checks/style_needed.php:13
|
538 |
+
msgid "<strong>Author:</strong> is missing from your style.css header."
|
539 |
+
msgstr ""
|
540 |
+
|
541 |
+
#: checks/style_needed.php:14
|
542 |
+
msgid "<strong>Version:</strong> is missing from your style.css header."
|
543 |
+
msgstr ""
|
544 |
+
|
545 |
+
#: checks/style_needed.php:15
|
546 |
+
msgid "<strong>License:</strong> is missing from your style.css header."
|
547 |
+
msgstr ""
|
548 |
+
|
549 |
+
#: checks/style_needed.php:16
|
550 |
+
msgid "<strong>License URI:</strong> is missing from your style.css header."
|
551 |
+
msgstr ""
|
552 |
+
|
553 |
+
#: checks/style_needed.php:17
|
554 |
+
msgid "<strong>.sticky</strong> css class is needed in your theme css."
|
555 |
+
msgstr ""
|
556 |
+
|
557 |
+
#: checks/style_needed.php:18
|
558 |
+
msgid "<strong>.bypostauthor</strong> css class is needed in your theme css."
|
559 |
+
msgstr ""
|
560 |
+
|
561 |
+
#: checks/style_needed.php:19
|
562 |
+
msgid "<strong>.alignleft</strong> css class is needed in your theme css."
|
563 |
+
msgstr ""
|
564 |
+
|
565 |
+
#: checks/style_needed.php:20
|
566 |
+
msgid "<strong>.alignright</strong> css class is needed in your theme css."
|
567 |
+
msgstr ""
|
568 |
+
|
569 |
+
#: checks/style_needed.php:21
|
570 |
+
msgid "<strong>.aligncenter</strong> css class is needed in your theme css."
|
571 |
+
msgstr ""
|
572 |
+
|
573 |
+
#: checks/style_needed.php:22
|
574 |
+
msgid "<strong>.wp-caption</strong> css class is needed in your theme css."
|
575 |
+
msgstr ""
|
576 |
+
|
577 |
+
#: checks/style_needed.php:23
|
578 |
+
msgid ""
|
579 |
+
"<strong>.wp-caption-text</strong> css class is needed in your theme css."
|
580 |
+
msgstr ""
|
581 |
+
|
582 |
+
#: checks/style_needed.php:24
|
583 |
+
msgid ""
|
584 |
+
"<strong>.gallery-caption</strong> css class is needed in your theme css."
|
585 |
+
msgstr ""
|
586 |
+
|
587 |
+
#: checks/style_suggested.php:20
|
588 |
+
msgid "<strong>%1$s</strong> is missing from your style.css header."
|
589 |
+
msgstr ""
|
590 |
+
|
591 |
+
#: checks/style_tags.php:16
|
592 |
+
msgid "<strong>Tags:</strong> is either empty or missing in style.css header."
|
593 |
+
msgstr ""
|
594 |
+
|
595 |
+
#: checks/style_tags.php:25
|
596 |
+
msgid ""
|
597 |
+
"The flexible-width and fixed-width tags changed to fluid-layout and fixed-"
|
598 |
+
"layout tags in WordPress 3.8. Additionally, the responsive-layout tag was "
|
599 |
+
"added. Please change to using one of the new tags."
|
600 |
+
msgstr ""
|
601 |
+
|
602 |
+
#: checks/style_tags.php:27
|
603 |
+
msgid ""
|
604 |
+
"Found wrong tag, remove <strong>%1$s</strong> from your style.css header."
|
605 |
+
msgstr ""
|
606 |
+
|
607 |
+
#: checks/tags.php:13
|
608 |
+
msgid ""
|
609 |
+
"This theme doesn't seem to display tags. Modify it to display tags in "
|
610 |
+
"appropriate locations."
|
611 |
+
msgstr ""
|
612 |
+
|
613 |
+
#: checks/textdomain.php:15
|
614 |
+
msgid "You have not included a text domain!"
|
615 |
+
msgstr ""
|
616 |
+
|
617 |
+
#. translators: 1: filename 2: error message 3: grep results
|
618 |
+
#: checks/textdomain.php:32
|
619 |
+
msgid "Text domain problems in <strong>%1$s</strong>. %2$s %3$s "
|
620 |
+
msgstr ""
|
621 |
+
|
622 |
+
#: checks/textdomain.php:38 checks/textdomain.php:39
|
623 |
+
msgid "Text domain should match theme slug: <strong>%1$s</strong>"
|
624 |
+
msgstr ""
|
625 |
+
|
626 |
+
#: checks/textdomain.php:55
|
627 |
+
msgid ""
|
628 |
+
"Text domain problems in <strong>%1$s</strong>. The %2s text domain is being "
|
629 |
+
"used!%3$s"
|
630 |
+
msgstr ""
|
631 |
+
|
632 |
+
#: checks/textdomain.php:59
|
633 |
+
msgid ""
|
634 |
+
"Text domain problems in <strong>%1$s</strong>. %2$s You are using: <strong>%"
|
635 |
+
"3s</strong>%4$s"
|
636 |
+
msgstr ""
|
637 |
+
|
638 |
+
#: checks/time_date.php:22
|
639 |
+
msgid ""
|
640 |
+
"At least one hard coded date was found in the file <strong>%s</strong>. "
|
641 |
+
"Consider get_option( 'date_format' ) instead."
|
642 |
+
msgstr ""
|
643 |
+
|
644 |
+
#: checks/title.php:20
|
645 |
+
msgid ""
|
646 |
+
"No reference to <strong>add_theme_support( \"title-tag\" )</strong> was "
|
647 |
+
"found in the theme. It is recommended that the theme implement this "
|
648 |
+
"functionality for WordPress 4.1 and above."
|
649 |
+
msgstr ""
|
650 |
+
|
651 |
+
#: checks/title.php:29
|
652 |
+
msgid ""
|
653 |
+
"The theme needs to have <strong><title></strong> tags, ideally in the "
|
654 |
+
"<strong>header.php</strong> file."
|
655 |
+
msgstr ""
|
656 |
+
|
657 |
+
#: checks/title.php:38
|
658 |
+
msgid ""
|
659 |
+
"The theme needs to have a call to <strong>wp_title()</strong>, ideally in "
|
660 |
+
"the <strong>header.php</strong> file."
|
661 |
+
msgstr ""
|
662 |
+
|
663 |
+
#: checks/title.php:53
|
664 |
+
msgid ""
|
665 |
+
"The <strong><title></strong> tags can only contain a call to "
|
666 |
+
"<strong>wp_title()</strong>. Use the <strong>wp_title filter</strong> to "
|
667 |
+
"modify the output"
|
668 |
+
msgstr ""
|
669 |
+
|
670 |
+
#: checks/widgets.php:16
|
671 |
+
msgid ""
|
672 |
+
"This theme contains no sidebars/widget areas. See <a href='https://codex."
|
673 |
+
"wordpress.org/Widgets_API'>Widgets API</a>"
|
674 |
+
msgstr ""
|
675 |
+
|
676 |
+
#: checks/widgets.php:21
|
677 |
+
msgid ""
|
678 |
+
"The theme appears to use <strong>register_sidebar()</strong> but no "
|
679 |
+
"<strong>dynamic_sidebar()</strong> was found. See: <a href='https://codex."
|
680 |
+
"wordpress.org/Function_Reference/dynamic_sidebar'>dynamic_sidebar</a><pre> "
|
681 |
+
"<?php dynamic_sidebar( $index ); ?></pre>"
|
682 |
+
msgstr ""
|
683 |
+
|
684 |
+
#: checks/widgets.php:26
|
685 |
+
msgid ""
|
686 |
+
"The theme appears to use <strong>dynamic_sidebars()</strong> but no "
|
687 |
+
"<strong>register_sidebar()</strong> was found. See: <a href='https://codex."
|
688 |
+
"wordpress.org/Function_Reference/register_sidebar'>register_sidebar</a><pre> "
|
689 |
+
"<?php register_sidebar( $args ); ?></pre>"
|
690 |
+
msgstr ""
|
691 |
+
|
692 |
+
#: checks/widgets.php:34
|
693 |
+
msgid ""
|
694 |
+
"Sidebars need to be registered in a custom function hooked to the "
|
695 |
+
"<strong>widgets_init</strong> action. See: %s."
|
696 |
+
msgstr ""
|
697 |
+
|
698 |
+
#: checks/worms.php:9
|
699 |
+
msgid "This may be a script used by hackers to get control of your server!"
|
700 |
+
msgstr ""
|
701 |
+
|
702 |
+
#: checks/worms.php:10
|
703 |
+
msgid "This may be a script used by hackers to get control of your server"
|
704 |
+
msgstr ""
|
705 |
+
|
706 |
+
#: checks/worms.php:11
|
707 |
+
msgid "Tells a hacker what operating system your server is running"
|
708 |
+
msgstr ""
|
709 |
+
|
710 |
+
#: checks/worms.php:12
|
711 |
+
msgid ""
|
712 |
+
"base64 encoded text found in Search Engine Redirect hack <a href=\"http://"
|
713 |
+
"blogbuildingu.com/wordpress/wordpress-search-engine-redirect-hack\">[1]</a>"
|
714 |
+
msgstr ""
|
715 |
+
|
716 |
+
#: checks/worms.php:13
|
717 |
+
msgid ""
|
718 |
+
"YAHG Googlerank.info exploit code <a href=\"http://creativebriefing.com/"
|
719 |
+
"wordpress-hacked-googlerankinfo/\">[1]</a>"
|
720 |
+
msgstr ""
|
721 |
+
|
722 |
+
#: checks/worms.php:14
|
723 |
+
msgid ""
|
724 |
+
"Possible Ekibastos attack <a href=\"http://ocaoimh.ie/did-your-wordpress-"
|
725 |
+
"site-get-hacked/\">[1]</a>"
|
726 |
+
msgstr ""
|
727 |
+
|
728 |
+
#: checks/worms.php:15
|
729 |
+
msgid ""
|
730 |
+
"Possible \"Gumblar\" JavaScript attack <a href=\"http://threatinfo."
|
731 |
+
"trendmicro.com/vinfo/articles/securityarticles.asp?xmlfile=042710-GUMBLAR.xml"
|
732 |
+
"\">[1]</a> <a href=\"http://justcoded.com/article/gumblar-family-virus-"
|
733 |
+
"removal-tool/\">[2]</a>"
|
734 |
+
msgstr ""
|
735 |
+
|
736 |
+
#: checks/worms.php:16 checks/worms.php:17
|
737 |
+
msgid ""
|
738 |
+
"Symptom of the \"Pharma Hack\" <a href=\"http://blog.sucuri.net/2010/07/"
|
739 |
+
"understanding-and-cleaning-the-pharma-hack-on-wordpress.html\">[1]</a>"
|
740 |
+
msgstr ""
|
741 |
+
|
742 |
+
#: checks/worms.php:18
|
743 |
+
msgid "Malicious footer code injection detected!"
|
744 |
+
msgstr ""
|
745 |
+
|
746 |
+
#: main.php:12
|
747 |
+
msgid ""
|
748 |
+
"Parent theme <strong>%1$s</strong> not found! You have to have parent AND "
|
749 |
+
"child-theme installed!"
|
750 |
+
msgstr ""
|
751 |
+
|
752 |
+
#: main.php:39
|
753 |
+
msgid "Theme Info"
|
754 |
+
msgstr ""
|
755 |
+
|
756 |
+
#: main.php:47
|
757 |
+
msgid "Title"
|
758 |
+
msgstr ""
|
759 |
+
|
760 |
+
#: main.php:48
|
761 |
+
msgid "Version"
|
762 |
+
msgstr ""
|
763 |
+
|
764 |
+
#: main.php:49
|
765 |
+
msgid "Author"
|
766 |
+
msgstr ""
|
767 |
+
|
768 |
+
#: main.php:50
|
769 |
+
msgid "Author URI"
|
770 |
+
msgstr ""
|
771 |
+
|
772 |
+
#: main.php:51
|
773 |
+
msgid "Theme URI"
|
774 |
+
msgstr ""
|
775 |
+
|
776 |
+
#: main.php:52
|
777 |
+
msgid "License"
|
778 |
+
msgstr ""
|
779 |
+
|
780 |
+
#: main.php:53
|
781 |
+
msgid "License URI"
|
782 |
+
msgstr ""
|
783 |
+
|
784 |
+
#: main.php:54
|
785 |
+
msgid "Tags"
|
786 |
+
msgstr ""
|
787 |
+
|
788 |
+
#: main.php:55
|
789 |
+
msgid "Description"
|
790 |
+
msgstr ""
|
791 |
+
|
792 |
+
#: main.php:59
|
793 |
+
msgid ""
|
794 |
+
"This child theme requires at least version <strong>%1$s</strong> of theme "
|
795 |
+
"<strong>%2$s</strong> to be installed. You only have <strong>%3$s</strong> "
|
796 |
+
"please update the parent theme."
|
797 |
+
msgstr ""
|
798 |
+
|
799 |
+
#: main.php:61
|
800 |
+
msgid ""
|
801 |
+
"This is a child theme. The parent theme is: <strong>%1$s</strong>. These "
|
802 |
+
"files have been included automatically!"
|
803 |
+
msgstr ""
|
804 |
+
|
805 |
+
#: main.php:63
|
806 |
+
msgid ""
|
807 |
+
"Child theme does not have the <strong>Template Version</strong> tag in style."
|
808 |
+
"css."
|
809 |
+
msgstr ""
|
810 |
+
|
811 |
+
#: main.php:65
|
812 |
+
msgid ""
|
813 |
+
"Child theme is only tested up to version %1$s of %2$s breakage may occur! %3"
|
814 |
+
"$s installed version is %4$s"
|
815 |
+
msgstr ""
|
816 |
+
|
817 |
+
#: main.php:72
|
818 |
+
msgid ""
|
819 |
+
" Running <strong>%1$s</strong> tests against <strong>%2$s</strong> using "
|
820 |
+
"Guidelines Version: <strong>%3$s</strong> Plugin revision: <strong>%4$s</"
|
821 |
+
"strong>"
|
822 |
+
msgstr ""
|
823 |
+
|
824 |
+
#: main.php:75
|
825 |
+
msgid "One or more errors were found for %1$s."
|
826 |
+
msgstr ""
|
827 |
+
|
828 |
+
#: main.php:77
|
829 |
+
msgid "%1$s passed the tests"
|
830 |
+
msgstr ""
|
831 |
+
|
832 |
+
#: main.php:80
|
833 |
+
msgid ""
|
834 |
+
"<strong>WP_DEBUG is not enabled!</strong> Please test your theme with <a "
|
835 |
+
"href=\"http://codex.wordpress.org/Editing_wp-config.php\">debug enabled</a> "
|
836 |
+
"before you upload!"
|
837 |
+
msgstr ""
|
838 |
+
|
839 |
+
#: main.php:91
|
840 |
+
msgid "About"
|
841 |
+
msgstr ""
|
842 |
+
|
843 |
+
#: main.php:92
|
844 |
+
msgid ""
|
845 |
+
"The theme check plugin is an easy way to test your theme and make sure it's "
|
846 |
+
"up to spec with the latest theme review standards. With it, you can run all "
|
847 |
+
"the same automated testing tools on your theme that WordPress.org uses for "
|
848 |
+
"theme submissions."
|
849 |
+
msgstr ""
|
850 |
+
|
851 |
+
#: main.php:93
|
852 |
+
msgid "Contact"
|
853 |
+
msgstr ""
|
854 |
+
|
855 |
+
#: main.php:94
|
856 |
+
msgid "Theme-Check is maintained by %1s and %2s."
|
857 |
+
msgstr ""
|
858 |
+
|
859 |
+
#: main.php:98
|
860 |
+
msgid ""
|
861 |
+
"If you have found a bug or would like to make a suggestion or contribution "
|
862 |
+
"why not join the <a href=\"http://wordpress.org/extend/themes/contact/"
|
863 |
+
"\">theme-reviewers mailing list</a> or leave a post on the <a href=\"http://"
|
864 |
+
"wordpress.org/tags/theme-check?forum_id=10\">WordPress forums</a>."
|
865 |
+
msgstr ""
|
866 |
+
|
867 |
+
#: main.php:99
|
868 |
+
msgid "Contributors"
|
869 |
+
msgstr ""
|
870 |
+
|
871 |
+
#: main.php:100
|
872 |
+
msgid "Localization"
|
873 |
+
msgstr ""
|
874 |
+
|
875 |
+
#: main.php:105
|
876 |
+
msgid "Testers"
|
877 |
+
msgstr ""
|
878 |
+
|
879 |
+
#: main.php:106
|
880 |
+
msgid "The WordPress Theme Review Team"
|
881 |
+
msgstr ""
|
882 |
+
|
883 |
+
#: main.php:112
|
884 |
+
msgid ""
|
885 |
+
"Now your theme has passed the basic tests you need to check it properly "
|
886 |
+
"using the test data before you upload to the WordPress Themes Directory."
|
887 |
+
msgstr ""
|
888 |
+
|
889 |
+
#: main.php:113
|
890 |
+
msgid ""
|
891 |
+
"Make sure to review the guidelines at <a href=\"http://codex.wordpress.org/"
|
892 |
+
"Theme_Review\">Theme Review</a> before uploading a Theme."
|
893 |
+
msgstr ""
|
894 |
+
|
895 |
+
#: main.php:114
|
896 |
+
msgid "Codex Links"
|
897 |
+
msgstr ""
|
898 |
+
|
899 |
+
#: main.php:116
|
900 |
+
msgid "Theme Development"
|
901 |
+
msgstr ""
|
902 |
+
|
903 |
+
#: main.php:117
|
904 |
+
msgid "Themes and Templates forum"
|
905 |
+
msgstr ""
|
906 |
+
|
907 |
+
#: main.php:118
|
908 |
+
msgid "Theme Unit Tests"
|
909 |
+
msgstr ""
|
910 |
+
|
911 |
+
#: main.php:137
|
912 |
+
msgid "Check it!"
|
913 |
+
msgstr ""
|
914 |
+
|
915 |
+
#: main.php:138
|
916 |
+
msgid "Output in Trac format."
|
917 |
+
msgstr ""
|
918 |
+
|
919 |
+
#: main.php:139
|
920 |
+
msgid "Suppress INFO."
|
921 |
+
msgstr ""
|
922 |
+
|
923 |
+
#: theme-check.php:38
|
924 |
+
msgid "You do not have sufficient permissions to access this page."
|
925 |
+
msgstr ""
|
926 |
+
|
927 |
+
#. Plugin Name of the plugin/theme
|
928 |
+
msgid "Theme Check"
|
929 |
+
msgstr ""
|
930 |
+
|
931 |
+
#. Plugin URI of the plugin/theme
|
932 |
+
msgid "http://ottopress.com/wordpress-plugins/theme-check/"
|
933 |
+
msgstr ""
|
934 |
+
|
935 |
+
#. Description of the plugin/theme
|
936 |
+
msgid ""
|
937 |
+
"A simple and easy way to test your theme for all the latest WordPress "
|
938 |
+
"standards and practices. A great theme development tool!"
|
939 |
+
msgstr ""
|
940 |
+
|
941 |
+
#. Author of the plugin/theme
|
942 |
+
msgid "Pross, Otto42"
|
943 |
+
msgstr ""
|
944 |
+
|
945 |
+
#. Author URI of the plugin/theme
|
946 |
+
msgid "http://ottopress.com"
|
947 |
+
msgstr ""
|
main.php
ADDED
@@ -0,0 +1,136 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
function check_main( $theme ) {
|
3 |
+
global $themechecks, $data, $themename;
|
4 |
+
$themename = $theme;
|
5 |
+
$theme = get_theme_root( $theme ) . "/$theme";
|
6 |
+
$files = listdir( $theme );
|
7 |
+
$data = tc_get_theme_data( $theme . '/style.css' );
|
8 |
+
if ( $data[ 'Template' ] ) {
|
9 |
+
// This is a child theme, so we need to pull files from the parent, which HAS to be installed.
|
10 |
+
$parent = get_theme_root( $data[ 'Template' ] ) . '/' . $data['Template'];
|
11 |
+
if ( ! tc_get_theme_data( $parent . '/style.css' ) ) { // This should never happen but we will check while were here!
|
12 |
+
echo '<h2>' . sprintf(__('Parent theme <strong>%1$s</strong> not found! You have to have parent AND child-theme installed!', 'theme-check'), $data[ 'Template' ] ) . '</h2>';
|
13 |
+
return;
|
14 |
+
}
|
15 |
+
$parent_data = tc_get_theme_data( $parent . '/style.css' );
|
16 |
+
$themename = basename( $parent );
|
17 |
+
$files = array_merge( listdir( $parent ), $files );
|
18 |
+
}
|
19 |
+
|
20 |
+
if ( $files ) {
|
21 |
+
foreach( $files as $key => $filename ) {
|
22 |
+
if ( substr( $filename, -4 ) == '.php' ) {
|
23 |
+
$php[$filename] = php_strip_whitespace( $filename );
|
24 |
+
}
|
25 |
+
else if ( substr( $filename, -4 ) == '.css' ) {
|
26 |
+
$css[$filename] = file_get_contents( $filename );
|
27 |
+
}
|
28 |
+
else {
|
29 |
+
$other[$filename] = ( ! is_dir($filename) ) ? file_get_contents( $filename ) : '';
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
// run the checks
|
34 |
+
$success = run_themechecks($php, $css, $other);
|
35 |
+
|
36 |
+
global $checkcount;
|
37 |
+
|
38 |
+
// second loop, to display the errors
|
39 |
+
echo '<h2>' . __( 'Theme Info', 'theme-check' ) . ': </h2>';
|
40 |
+
echo '<div class="theme-info">';
|
41 |
+
if (file_exists( trailingslashit( WP_CONTENT_DIR . '/themes' ) . trailingslashit( basename( $theme ) ) . 'screenshot.png' ) ) {
|
42 |
+
$image = getimagesize( $theme . '/screenshot.png' );
|
43 |
+
echo '<div style="float:right" class="theme-info"><img style="max-height:180px;" src="' . trailingslashit( WP_CONTENT_URL . '/themes' ) . trailingslashit( basename( $theme ) ) . 'screenshot.png" />';
|
44 |
+
echo '<br /><div style="text-align:center">' . $image[0] . 'x' . $image[1] . ' ' . round( filesize( $theme . '/screenshot.png' )/1024 ) . 'k</div></div>';
|
45 |
+
}
|
46 |
+
|
47 |
+
echo ( !empty( $data[ 'Title' ] ) ) ? '<p><label>' . __( 'Title', 'theme-check' ) . '</label><span class="info">' . $data[ 'Title' ] . '</span></p>' : '';
|
48 |
+
echo ( !empty( $data[ 'Version' ] ) ) ? '<p><label>' . __( 'Version', 'theme-check' ) . '</label><span class="info">' . $data[ 'Version' ] . '</span></p>' : '';
|
49 |
+
echo ( !empty( $data[ 'AuthorName' ] ) ) ? '<p><label>' . __( 'Author', 'theme-check' ) . '</label><span class="info">' . $data[ 'AuthorName' ] . '</span></p>' : '';
|
50 |
+
echo ( !empty( $data[ 'AuthorURI' ] ) ) ? '<p><label>' . __( 'Author URI', 'theme-check' ) . '</label><span class="info"><a href="' . $data[ 'AuthorURI' ] . '">' . $data[ 'AuthorURI' ] . '</a>' . '</span></p>' : '';
|
51 |
+
echo ( !empty( $data[ 'URI' ] ) ) ? '<p><label>' . __( 'Theme URI', 'theme-check' ) . '</label><span class="info"><a href="' . $data[ 'URI' ] . '">' . $data[ 'URI' ] . '</a>' . '</span></p>' : '';
|
52 |
+
echo ( !empty( $data[ 'License' ] ) ) ? '<p><label>' . __( 'License', 'theme-check' ) . '</label><span class="info">' . $data[ 'License' ] . '</span></p>' : '';
|
53 |
+
echo ( !empty( $data[ 'License URI' ] ) ) ? '<p><label>' . __( 'License URI', 'theme-check' ) . '</label><span class="info">' . $data[ 'License URI' ] . '</span></p>' : '';
|
54 |
+
echo ( !empty( $data[ 'Tags' ] ) ) ? '<p><label>' . __( 'Tags', 'theme-check' ) . '</label><span class="info">' . implode( $data[ 'Tags' ], ', ') . '</span></p>' : '';
|
55 |
+
echo ( !empty( $data[ 'Description' ] ) ) ? '<p><label>' . __( 'Description', 'theme-check' ) . '</label><span class="info">' . $data[ 'Description' ] . '</span></p>' : '';
|
56 |
+
|
57 |
+
if ( $data[ 'Template' ] ) {
|
58 |
+
if ( $data['Template Version'] > $parent_data['Version'] ) {
|
59 |
+
echo '<p>' . sprintf(__('This child theme requires at least version <strong>%1$s</strong> of theme <strong>%2$s</strong> to be installed. You only have <strong>%3$s</strong> please update the parent theme.', 'theme-check'), $data['Template Version'], $parent_data['Title'], $parent_data['Version'] ) . '</p>';
|
60 |
+
}
|
61 |
+
echo '<p>' . sprintf(__( 'This is a child theme. The parent theme is: <strong>%1$s</strong>. These files have been included automatically!', 'theme-check'), $data[ 'Template' ] ) . '</p>';
|
62 |
+
if ( empty( $data['Template Version'] ) ) {
|
63 |
+
echo '<p>' . __('Child theme does not have the <strong>Template Version</strong> tag in style.css.', 'theme-check') . '</p>';
|
64 |
+
} else {
|
65 |
+
echo ( $data['Template Version'] < $parent_data['Version'] ) ? '<p>' . sprintf(__('Child theme is only tested up to version %1$s of %2$s breakage may occur! %3$s installed version is %4$s', 'theme-check'), $data['Template Version'], $parent_data['Title'], $parent_data['Title'], $parent_data['Version'] ) . '</p>' : '';
|
66 |
+
}
|
67 |
+
}
|
68 |
+
echo '</div><!-- .theme-info-->';
|
69 |
+
|
70 |
+
$plugins = get_plugins( '/theme-check' );
|
71 |
+
$version = explode( '.', $plugins['theme-check.php']['Version'] );
|
72 |
+
echo '<p>' . sprintf(__(' Running <strong>%1$s</strong> tests against <strong>%2$s</strong> using Guidelines Version: <strong>%3$s</strong> Plugin revision: <strong>%4$s</strong>', 'theme-check'), $checkcount, $data[ 'Title' ], $version[0], $version[1] ) . '</p>';
|
73 |
+
$results = display_themechecks();
|
74 |
+
if ( !$success ) {
|
75 |
+
echo '<h2>' . sprintf(__('One or more errors were found for %1$s.', 'theme-check'), $data[ 'Title' ] ) . '</h2>';
|
76 |
+
} else {
|
77 |
+
echo '<h2>' . sprintf(__('%1$s passed the tests', 'theme-check'), $data[ 'Title' ] ) . '</h2>';
|
78 |
+
tc_success();
|
79 |
+
}
|
80 |
+
if ( !defined( 'WP_DEBUG' ) || WP_DEBUG == false ) echo '<div class="updated"><span class="tc-fail">' . __('WARNING','theme-check') . '</span> ' . __( '<strong>WP_DEBUG is not enabled!</strong> Please test your theme with <a href="https://codex.wordpress.org/Editing_wp-config.php">debug enabled</a> before you upload!', 'theme-check' ) . '</div>';
|
81 |
+
echo '<div class="tc-box">';
|
82 |
+
echo '<ul class="tc-result">';
|
83 |
+
echo $results;
|
84 |
+
echo '</ul></div>';
|
85 |
+
}
|
86 |
+
}
|
87 |
+
|
88 |
+
|
89 |
+
function tc_intro() {
|
90 |
+
?>
|
91 |
+
<h2><?php _e( 'About', 'theme-check' ); ?></h2>
|
92 |
+
<p><?php _e( "The Theme Check plugin is an easy way to test your theme and make sure it's up to date with the latest theme review standards. With it, you can run all the same automated testing tools on your theme that WordPress.org uses for theme submissions.", 'theme-check' ); ?></p>
|
93 |
+
<h2><?php _e( 'Contact', 'theme-check' ); ?></h2>
|
94 |
+
<p><?php printf( __( 'Theme Check is maintained by %1$s and %2$s.', 'theme-check' ),
|
95 |
+
'<a href="https://profiles.wordpress.org/otto42/">Otto42</a>',
|
96 |
+
'<a href="https://profiles.wordpress.org/pross/">Pross</a>'
|
97 |
+
); ?></p>
|
98 |
+
<p><?php printf( __( 'If you have found a bug or would like to make a suggestion or contribution, please leave a post on the <a href="%1$s">WordPress forums</a>, or talk about it with the theme review team on <a href="%2$s">Make WordPress Themes</a> site.', 'theme-check' ), 'https://wordpress.org/tags/theme-check?forum_id=10', 'https://make.wordpress.org/themes/') ; ?></p>
|
99 |
+
<p><?php printf( __( 'The code for Theme Check can be contributed to on <a href="%s">GitHub</a>.', 'theme-check' ), 'https://github.com/Otto42/theme-check'); ?></p>
|
100 |
+
<h3><?php _e( 'Testers', 'theme-check' ); ?></h3>
|
101 |
+
<p><a href="https://make.wordpress.org/themes/"><?php _e( 'The WordPress Theme Review Team', 'theme-check' ); ?></a></p>
|
102 |
+
<?php
|
103 |
+
}
|
104 |
+
|
105 |
+
function tc_success() {
|
106 |
+
?>
|
107 |
+
<div class="tc-success"><p><?php _e( 'Now your theme has passed the basic tests you need to check it properly using the test data before you upload to the WordPress Themes Directory.', 'theme-check' ); ?></p>
|
108 |
+
<p><?php _e( 'Make sure to review the guidelines at <a href="https://codex.wordpress.org/Theme_Review">Theme Review</a> before uploading a Theme.', 'theme-check' ); ?></p>
|
109 |
+
<h3><?php _e( 'Codex Links', 'theme-check' ); ?></h3>
|
110 |
+
<ul>
|
111 |
+
<li><a href="https://codex.wordpress.org/Theme_Development"><?php _e('Theme Development', 'theme-check' ); ?></a></li>
|
112 |
+
<li><a href="https://wordpress.org/support/forum/5"><?php _e('Themes and Templates forum', 'theme-check' ); ?></a></li>
|
113 |
+
<li><a href="https://codex.wordpress.org/Theme_Unit_Test"><?php _e('Theme Unit Tests', 'theme-check' ); ?></a></li>
|
114 |
+
</ul></div>
|
115 |
+
<?php
|
116 |
+
}
|
117 |
+
|
118 |
+
function tc_form() {
|
119 |
+
$themes = tc_get_themes();
|
120 |
+
echo '<form action="themes.php?page=themecheck" method="post">';
|
121 |
+
echo '<select name="themename">';
|
122 |
+
foreach( $themes as $name => $location ) {
|
123 |
+
echo '<option ';
|
124 |
+
if ( isset( $_POST['themename'] ) ) {
|
125 |
+
echo ( $location['Stylesheet'] === $_POST['themename'] ) ? 'selected="selected" ' : '';
|
126 |
+
} else {
|
127 |
+
echo ( basename( STYLESHEETPATH ) === $location['Stylesheet'] ) ? 'selected="selected" ' : '';
|
128 |
+
}
|
129 |
+
echo ( basename( STYLESHEETPATH ) === $location['Stylesheet'] ) ? 'value="' . $location['Stylesheet'] . '" style="font-weight:bold;">' . $name . '</option>' : 'value="' . $location['Stylesheet'] . '">' . $name . '</option>';
|
130 |
+
}
|
131 |
+
echo '</select>';
|
132 |
+
echo '<input class="button" type="submit" value="' . __( 'Check it!', 'theme-check' ) . '" />';
|
133 |
+
if ( defined( 'TC_PRE' ) || defined( 'TC_POST' ) ) echo ' <input name="trac" type="checkbox" /> ' . __( 'Output in Trac format.', 'theme-check' );
|
134 |
+
echo '<input name="s_info" type="checkbox" /> ' . __( 'Suppress INFO.', 'theme-check' );
|
135 |
+
echo '</form>';
|
136 |
+
}
|
readme.txt
ADDED
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== Theme Check ===
|
2 |
+
Contributors: Otto42, pross
|
3 |
+
Author URI: http://ottopress.com/
|
4 |
+
Plugin URL: http://ottopress.com/wordpress-plugins/theme-check/
|
5 |
+
Requires at Least: 3.7
|
6 |
+
Tested Up To: 4.3
|
7 |
+
Tags: template, theme, check, checker, tool, wordpress, wordpress.org, upload, uploader, test, guideline, review
|
8 |
+
Stable tag: 20150818.1
|
9 |
+
|
10 |
+
A simple and easy way to test your theme for all the latest WordPress standards and practices. A great theme development tool!
|
11 |
+
|
12 |
+
== Description ==
|
13 |
+
|
14 |
+
The theme check plugin is an easy way to test your theme and make sure it's up to spec with the latest [theme review](https://codex.wordpress.org/Theme_Review) standards. With it, you can run all the same automated testing tools on your theme that WordPress.org uses for theme submissions.
|
15 |
+
|
16 |
+
The tests are run through a simple admin menu and all results are displayed at once. This is very handy for theme developers, or anybody looking to make sure that their theme supports the latest WordPress theme standards and practices.
|
17 |
+
|
18 |
+
== Frequently Asked Questions ==
|
19 |
+
|
20 |
+
= What's with the version numbers? =
|
21 |
+
|
22 |
+
The version number is the date of the revision of the [guidelines](https://codex.wordpress.org/Theme_Review) used to create it.
|
23 |
+
|
24 |
+
= Why does it flag something as bad? =
|
25 |
+
|
26 |
+
It's not flagging "bad" things, as such. The theme check is designed to be a non-perfect way to test for compliance with the [Theme Review](https://codex.wordpress.org/Theme_Review) guidelines. Not all themes must adhere to these guidelines. The purpose of the checking tool is to ensure that themes uploaded to the central [WordPress.org theme repository](http://wordpress.org/extend/themes/) meet the latest standards of WordPress themes and will work on a wide variety of sites.
|
27 |
+
|
28 |
+
Many sites use customized themes, and that's perfectly okay. But themes that are intended for use on many different kinds of sites by the public need to have a certain minimum level of capabilities, in order to ensure proper functioning in many different environments. The Theme Review guidelines are created with that goal in mind.
|
29 |
+
|
30 |
+
This theme checker is not perfect, and never will be. It is only a tool to help theme authors, or anybody else who wants to make their theme more capable. All themes submitted to WordPress.org are hand-reviewed by a team of experts. The automated theme checker is meant to be a useful tool only, not an absolute system of measurement.
|
31 |
+
|
32 |
+
This plugin does not decide the guidelines used. Any issues with particular theme review guidelines should be discussed on the [Make Themes site](https://make.wordpress.org/themes).
|
33 |
+
|
34 |
+
== Other Notes ==
|
35 |
+
|
36 |
+
= How to enable trac formatting =
|
37 |
+
|
38 |
+
The Theme Review team use this plugin while reviewing themes and copy/paste the output into trac tickets, the trac system has its own markup language.
|
39 |
+
To enable trac formatting in Theme-Check you need to define a couple of variables in wp-config.php:
|
40 |
+
*TC_PRE* and *TC_POST* are used as a ticket header and footer.
|
41 |
+
Examples:
|
42 |
+
`define( 'TC_PRE', 'Theme Review:[[br]]
|
43 |
+
- Themes should be reviewed using "define(\'WP_DEBUG\', true);" in wp-config.php[[br]]
|
44 |
+
- Themes should be reviewed using the test data from the Theme Checklists (TC)
|
45 |
+
-----
|
46 |
+
' );`
|
47 |
+
|
48 |
+
`define( 'TC_POST', 'Feel free to make use of the contact details below if you have any questions,
|
49 |
+
comments, or feedback:[[br]]
|
50 |
+
[[br]]
|
51 |
+
* Leave a comment on this ticket[[br]]
|
52 |
+
* Send an email to the Theme Review email list[[br]]
|
53 |
+
* Use the #wordpress-themes IRC channel on Freenode.' );`
|
54 |
+
If **either** of these two vars are defined a new trac tickbox will appear next to the *Check it!* button.
|
55 |
+
|
56 |
+
== Changelog ==
|
57 |
+
= 20140929.1 =
|
58 |
+
* Added new checks and updates from Frank Klein at Automattic. Thanks Frank!
|
59 |
+
* Updated deprecated function listings
|
60 |
+
* Customizer check: All add_settings must use sanitization callbacks, for security
|
61 |
+
* Plugin territory checks: Themes must not register post types or taxonomies or add shortcodes for post content
|
62 |
+
* Widgets: Calls to register_sidebar must be called from the widgets_init action hook
|
63 |
+
* Title: <title> tags must exist and not have anything in them other than a call to wp_title()
|
64 |
+
* CDN: Checks for use of common CDNs (recommended only)
|
65 |
+
* 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.
|
66 |
+
|
67 |
+
= 20131213.1 =
|
68 |
+
* Corrected errors not being displayed by the plugin and it incorrectly giving a "pass" result to everything.
|
69 |
+
|
70 |
+
= 20131212.1 =
|
71 |
+
* Updated for 3.8
|
72 |
+
* Most files have changed for better I18N support, so the language files were removed temporarily until translation can be redone.
|
73 |
+
|
74 |
+
= 20121211.1 =
|
75 |
+
* Updated for 3.5
|
76 |
+
* Remove Paypal button.
|
77 |
+
|
78 |
+
= 20110805.1 =
|
79 |
+
* TimThumb checks removed.
|
80 |
+
* Proper i18n loading. Fixes http://bit.ly/ouD5Ke.
|
81 |
+
* Screenshot now previewed in results, with filesize and dimensions.
|
82 |
+
|
83 |
+
= 20110602.2 =
|
84 |
+
* New file list functions hidden folders now detectable.
|
85 |
+
* Better fopen checks.
|
86 |
+
* TimThumb version bump
|
87 |
+
|
88 |
+
= 20110602.1 =
|
89 |
+
* DOS/UNIX line ending style checks are now a requirement for proper theme uploading.
|
90 |
+
* Timthumb version bump
|
91 |
+
* Several fixes reported by GaryJ
|
92 |
+
* 3.2 deprecated functions added
|
93 |
+
|
94 |
+
= 20110412.1 =
|
95 |
+
* Fix regex's
|
96 |
+
* Added check for latest footer injection hack.
|
97 |
+
* Fix tags check to use new content function correctly
|
98 |
+
* Sync of all changes made for wporg uploader theme-check.
|
99 |
+
* Updated checks post 3.1. added screenshot check to svn.
|
100 |
+
* Fix links check to not return a false failure in some cases
|
101 |
+
* rm one of the checks that causes problems on wporg uploader (and which is also unnecessary)
|
102 |
+
* Move unneeded functions out of checkbase into main.php.
|
103 |
+
* Minor formatting changes only (spacing and such)
|
104 |
+
* Add check for wp_link_pages() + fix eval() check
|
105 |
+
|
106 |
+
= 20110219.2 =
|
107 |
+
* Merged new UI props Gua Bob [1](http://guabob.com/)
|
108 |
+
* Last tested theme is always pre-selected in the themes list.
|
109 |
+
* Fixed php error in admin_menu.php
|
110 |
+
|
111 |
+
= 20110219.1 =
|
112 |
+
* See [commit log](https://github.com/Pross/theme-check/commits/) for changes.
|
113 |
+
|
114 |
+
= 20110201.2 =
|
115 |
+
* UI bug fixes [forum post](http://bit.ly/ff7amN) props Mamaduka.
|
116 |
+
* Textdomain checks for twentyten and no domain.
|
117 |
+
* Fix div not closing props Mamaduka.
|
118 |
+
|
119 |
+
= 20110201.1 =
|
120 |
+
* i18n working
|
121 |
+
* sr_RS de_DE ro_RO langs props Daniel Tara and Emil Uzelac.
|
122 |
+
* Child theme support added, checks made against parent AND child at runtime.
|
123 |
+
* Trac formatting button added for reviewers.
|
124 |
+
|
125 |
+
= 20101228.3 =
|
126 |
+
* Last revision for 3.1 (hopefully)
|
127 |
+
* Chips suggestion of checking for inclusion of searchform.php ( not
|
128 |
+
perfect yet, need more examples to look for ).
|
129 |
+
* add_theme_page is required, all others flagged and displayed with line
|
130 |
+
numbers.
|
131 |
+
* <?= detected properly, short tags outputted with line umbers.
|
132 |
+
* Mostly internationalized, needs translations now.
|
133 |
+
* Bug fixes.
|
134 |
+
|
135 |
+
= 20101228.2 =
|
136 |
+
* Added menu checking.
|
137 |
+
* ThemeURI AuthourURI added to results.
|
138 |
+
* Lots of small fixes.
|
139 |
+
* Started translation.
|
140 |
+
|
141 |
+
= 20101228.1 =
|
142 |
+
* Fix embed_defaults filter check and stylesheet file data check.
|
143 |
+
|
144 |
+
= 20101226.1 =
|
145 |
+
* Whole system redesign to allow easier synching with WordPress.org uploader. Many other additions/subtractions/changes as well.
|
146 |
+
* WordPress 3.1 guidelines added, to help theme authors ensure compatibility for upcoming release.
|
147 |
+
|
148 |
+
= 20101110.7 =
|
149 |
+
* Re-added malware.php checks for fopen and file_get_contents (INFO)
|
150 |
+
* fixed a couple of undefined index errors.
|
151 |
+
|
152 |
+
= 20101110.4_r2 =
|
153 |
+
* Fixed Warning: Wrong parameter count for stristr()
|
154 |
+
|
155 |
+
= 20101110.4_r1 =
|
156 |
+
* Added `echo` to suggested.php
|
157 |
+
|
158 |
+
= 20101110.4 =
|
159 |
+
* Fixed deprecated function call to get_plugins()
|
160 |
+
|
161 |
+
= 20101110.3 =
|
162 |
+
* Fixed undefined index.
|
163 |
+
|
164 |
+
= 20101110.2 =
|
165 |
+
* Missing `<` in main.php
|
166 |
+
* Added conditional checks for licence.txt OR Licence tags in style.css
|
167 |
+
* UI improvements.
|
168 |
+
|
169 |
+
= 20101110.1 =
|
170 |
+
* Date fix!
|
171 |
+
|
172 |
+
= 10112010_r1 =
|
173 |
+
* Fixed hardcoded links check. Added FAQ
|
174 |
+
|
175 |
+
= 10112010 =
|
176 |
+
* First release.
|
theme-check.php
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
Plugin Name: Theme Check
|
4 |
+
Plugin URI: http://ottopress.com/wordpress-plugins/theme-check/
|
5 |
+
Description: A simple and easy way to test your theme for all the latest WordPress standards and practices. A great theme development tool!
|
6 |
+
Author: Pross, Otto42
|
7 |
+
Author URI: http://ottopress.com
|
8 |
+
Version: 20150818.1
|
9 |
+
Text Domain: theme-check
|
10 |
+
Domain Path: /lang
|
11 |
+
License: GPLv2
|
12 |
+
License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
13 |
+
*/
|
14 |
+
|
15 |
+
class ThemeCheckMain {
|
16 |
+
function __construct() {
|
17 |
+
add_action( 'admin_init', array( $this, 'tc_i18n' ) );
|
18 |
+
add_action( 'admin_menu', array( $this, 'themecheck_add_page' ) );
|
19 |
+
}
|
20 |
+
|
21 |
+
function tc_i18n() {
|
22 |
+
load_plugin_textdomain( 'theme-check', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );
|
23 |
+
}
|
24 |
+
|
25 |
+
function load_styles() {
|
26 |
+
wp_enqueue_style('style', plugins_url( 'assets/style.css', __FILE__ ), null, null, 'screen');
|
27 |
+
}
|
28 |
+
|
29 |
+
function themecheck_add_page() {
|
30 |
+
$page = add_theme_page( 'Theme Check', 'Theme Check', 'manage_options', 'themecheck', array( $this, 'themecheck_do_page' ) );
|
31 |
+
add_action('admin_print_styles-' . $page, array( $this, 'load_styles' ) );
|
32 |
+
}
|
33 |
+
|
34 |
+
function tc_add_headers( $extra_headers ) {
|
35 |
+
$extra_headers = array( 'License', 'License URI', 'Template Version' );
|
36 |
+
return $extra_headers;
|
37 |
+
}
|
38 |
+
|
39 |
+
function themecheck_do_page() {
|
40 |
+
if ( !current_user_can( 'manage_options' ) ) {
|
41 |
+
wp_die( __( 'You do not have sufficient permissions to access this page.', 'theme-check' ) );
|
42 |
+
}
|
43 |
+
|
44 |
+
add_filter( 'extra_theme_headers', array( $this, 'tc_add_headers' ) );
|
45 |
+
|
46 |
+
include 'checkbase.php';
|
47 |
+
include 'main.php';
|
48 |
+
|
49 |
+
?>
|
50 |
+
<div id="theme-check" class="wrap">
|
51 |
+
<h1><?php _ex( 'Theme Check', 'title of the main page', 'theme-check' ); ?></h1>
|
52 |
+
<div class="theme-check">
|
53 |
+
<?php
|
54 |
+
tc_form();
|
55 |
+
if ( !isset( $_POST[ 'themename' ] ) ) {
|
56 |
+
tc_intro();
|
57 |
+
|
58 |
+
}
|
59 |
+
|
60 |
+
if ( isset( $_POST[ 'themename' ] ) ) {
|
61 |
+
if ( isset( $_POST[ 'trac' ] ) ) define( 'TC_TRAC', true );
|
62 |
+
if ( defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
|
63 |
+
@ini_set( 'memory_limit', WP_MAX_MEMORY_LIMIT );
|
64 |
+
}
|
65 |
+
check_main( $_POST[ 'themename' ] );
|
66 |
+
}
|
67 |
+
?>
|
68 |
+
</div> <!-- .theme-check-->
|
69 |
+
</div>
|
70 |
+
<?php
|
71 |
+
}
|
72 |
+
}
|
73 |
+
new ThemeCheckMain;
|