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