<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[35180] trunk/src/wp-admin/theme-editor.php: Theme Editor: Repurpose the `'wp_theme_editor_filetypes'` filter added in [35134] to actually filter file types instead of files.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/35180">35180</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/35180","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>SergeyBiryukov</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-10-15 02:19:45 +0000 (Thu, 15 Oct 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Theme Editor: Repurpose the `'wp_theme_editor_filetypes'` filter added in <a href="https://core.trac.wordpress.org/changeset/35134">[35134]</a> to actually filter file types instead of files.

Default types include 'php' and 'css' and cannot be removed, only new types can be added.

Props DrewAPicture, SergeyBiryukov.
Fixes <a href="https://core.trac.wordpress.org/ticket/22924">#22924</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminthemeeditorphp">trunk/src/wp-admin/theme-editor.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminthemeeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/theme-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/theme-editor.php       2015-10-15 01:42:27 UTC (rev 35179)
+++ trunk/src/wp-admin/theme-editor.php 2015-10-15 02:19:45 UTC (rev 35180)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -61,20 +61,40 @@
</span><span class="cx" style="display: block; padding: 0 10px">        wp_die( __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$allowed_files = $theme->get_files( 'php', 1 );
-$has_templates = ! empty( $allowed_files );
-$style_files = $theme->get_files( 'css' );
-$allowed_files['style.css'] = $style_files['style.css'];
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$allowed_files = $style_files = array();
+$has_templates = false;
+$default_types = array( 'php', 'css' );
+
</ins><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Filter the allowed files.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Filter the list of file types allowed for editing in the Theme editor.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 4.4.0
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * @param array  $style_files List of style files.
- * @param object $theme       The current Theme object.
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @param array    $default_types List of file types. Default types include 'php' and 'css'.
+ * @param WP_Theme $theme         The current Theme object.
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$allowed_files += apply_filters( 'wp_theme_editor_filetypes', $style_files, $theme );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$file_types = apply_filters( 'wp_theme_editor_filetypes', $default_types, $theme );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+// Ensure that default types are still there.
+$file_types = array_unique( array_merge( $file_types, $default_types ) );
+
+foreach ( $file_types as $type ) {
+       switch ( $type ) {
+               case 'php':
+                       $allowed_files += $theme->get_files( 'php', 1 );
+                       $has_templates = ! empty( $allowed_files );
+                       break;
+               case 'css':
+                       $style_files = $theme->get_files( 'css' );
+                       $allowed_files['style.css'] = $style_files['style.css'];
+                       $allowed_files += $style_files;
+                       break;
+               default:
+                       $allowed_files += $theme->get_files( $type );
+                       break;
+       }
+}
+
</ins><span class="cx" style="display: block; padding: 0 10px"> if ( empty( $file ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">        $relative_file = 'style.css';
</span><span class="cx" style="display: block; padding: 0 10px">        $file = $allowed_files['style.css'];
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -174,20 +194,42 @@
</span><span class="cx" style="display: block; padding: 0 10px">        <div id="templateside">
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><span class="cx" style="display: block; padding: 0 10px"> if ( $allowed_files ) :
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        if ( $has_templates || $theme->parent() ) :
-?>
-       <h2><?php _e( 'Templates' ); ?></h2>
-       <?php if ( $theme->parent() ) : ?>
-       <p class="howto"><?php printf( __( 'This child theme inherits templates from a parent theme, %s.' ), '<a href="' . self_admin_url('theme-editor.php?theme=' . urlencode( $theme->get_template() ) ) . '">' . $theme->parent()->display('Name') . '</a>' ); ?></p>
-       <?php endif; ?>
-       <ul>
-<?php
-       endif;
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $previous_file_type = '';
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        foreach ( $allowed_files as $filename => $absolute_filename ) :
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 'style.css' == $filename )
-                       echo "\t</ul>\n\t<h2>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h2>\n\t<ul>\n";
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $file_type = substr( $filename, strrpos( $filename, '.' ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                if ( $file_type !== $previous_file_type ) {
+                       if ( '' !== $previous_file_type ) {
+                               echo "\t</ul>\n";
+                       }
+
+                       switch ( $file_type ) {
+                               case '.php':
+                                       if ( $has_templates || $theme->parent() ) :
+                                               echo "\t<h2>" . __( 'Templates' ) . "</h2>\n";
+                                               if ( $theme->parent() ) {
+                                                       echo '<p class="howto">' . sprintf( __( 'This child theme inherits templates from a parent theme, %s.' ),
+                                                               sprintf( '<a href="%s">%s</a>',
+                                                                       self_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ),
+                                                                       $theme->parent()->display( 'Name' )
+                                                               )
+                                                       ) . "</p>\n";
+                                               }
+                                       endif;
+                                       break;
+                               case '.css':
+                                       echo "\t<h2>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h2>\n";
+                                       break;
+                               default:
+                                       /* translators: %s: file extension */
+                                       echo "\t<h2>" . sprintf( __( '%s files' ), $file_type ) . "</h2>\n";
+                                       break;
+                       }
+
+                       echo "\t<ul>\n";
+               }
+               
</ins><span class="cx" style="display: block; padding: 0 10px">                 $file_description = get_file_description( $filename );
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $filename !== basename( $absolute_filename ) || $file_description !== $filename ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>';
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -196,6 +238,8 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $absolute_filename === $file ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $file_description = '<span class="highlight">' . $file_description . '</span>';
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
+               $previous_file_type = $file_type;
</ins><span class="cx" style="display: block; padding: 0 10px"> ?>
</span><span class="cx" style="display: block; padding: 0 10px">                <li><a href="theme-editor.php?file=<?php echo urlencode( $filename ) ?>&amp;theme=<?php echo urlencode( $stylesheet ) ?>"><?php echo $file_description; ?></a></li>
</span><span class="cx" style="display: block; padding: 0 10px"> <?php
</span></span></pre>
</div>
</div>

</body>
</html>