| 1 | Index: plugins/theme-directory/class-themes-api.php |
|---|
| 2 | =================================================================== |
|---|
| 3 | --- plugins/theme-directory/class-themes-api.php (revision 11935) |
|---|
| 4 | +++ plugins/theme-directory/class-themes-api.php (working copy) |
|---|
| 5 | @@ -64,6 +64,7 @@ |
|---|
| 6 | 'requires' => false, |
|---|
| 7 | 'requires_php' => false, |
|---|
| 8 | 'trac_tickets' => false, |
|---|
| 9 | + 'patterns' => false, |
|---|
| 10 | ); |
|---|
| 11 | |
|---|
| 12 | /** |
|---|
| 13 | @@ -894,6 +895,34 @@ |
|---|
| 14 | |
|---|
| 15 | } |
|---|
| 16 | |
|---|
| 17 | + if ( $this->fields['patterns'] ) { |
|---|
| 18 | + $pattern_meta = get_post_meta( $theme->ID, '_patterns', true ); |
|---|
| 19 | + $patterns_data = array(); |
|---|
| 20 | + |
|---|
| 21 | + if ( ! empty( $pattern_meta ) ) { |
|---|
| 22 | + switch_to_blog( 699 ); // Pattern Directory |
|---|
| 23 | + |
|---|
| 24 | + $args = array( |
|---|
| 25 | + 'post_name__in' => $pattern_meta, |
|---|
| 26 | + 'post_type' => 'wporg-pattern', |
|---|
| 27 | + 'post_status' => 'publish', |
|---|
| 28 | + ); |
|---|
| 29 | + |
|---|
| 30 | + foreach ( get_posts( $args ) as $pattern_post ) { |
|---|
| 31 | + $p = array(); |
|---|
| 32 | + $p['name'] = $pattern_post->post_title; |
|---|
| 33 | + $p['link'] = get_permalink( $pattern_post ); |
|---|
| 34 | + |
|---|
| 35 | + $patterns_data[] = $p; |
|---|
| 36 | + } |
|---|
| 37 | + |
|---|
| 38 | + restore_current_blog(); |
|---|
| 39 | + } |
|---|
| 40 | + |
|---|
| 41 | + $phil->patterns = $patterns_data; |
|---|
| 42 | + } |
|---|
| 43 | + |
|---|
| 44 | wp_cache_set( $cache_key, $phil, $this->cache_group, $this->cache_life ); |
|---|
| 45 | |
|---|
| 46 | return $phil; |
|---|
| 47 | Index: plugins/theme-directory/class-wporg-themes-upload.php |
|---|
| 48 | =================================================================== |
|---|
| 49 | --- plugins/theme-directory/class-wporg-themes-upload.php (revision 11935) |
|---|
| 50 | +++ plugins/theme-directory/class-wporg-themes-upload.php (working copy) |
|---|
| 51 | @@ -76,6 +76,13 @@ |
|---|
| 52 | public $theme; |
|---|
| 53 | |
|---|
| 54 | /** |
|---|
| 55 | + * The uploaded theme.json. |
|---|
| 56 | + * |
|---|
| 57 | + * @var WP_Theme_JSON |
|---|
| 58 | + */ |
|---|
| 59 | + public $theme_json = null; |
|---|
| 60 | + |
|---|
| 61 | + /** |
|---|
| 62 | * The theme slug being uploaded. |
|---|
| 63 | * |
|---|
| 64 | * @var string |
|---|
| 65 | @@ -370,6 +377,9 @@ |
|---|
| 66 | // We have a stylesheet, let's set up the theme, theme post, and author. |
|---|
| 67 | $this->theme = new WP_Theme( basename( dirname( $style_css ) ), dirname( dirname( $style_css ) ) ); |
|---|
| 68 | |
|---|
| 69 | + // Get Theme.json data if it exists |
|---|
| 70 | + $this->theme_json = $this->get_theme_json( $theme_files ); |
|---|
| 71 | + |
|---|
| 72 | // We need a screen shot. People love screen shots. |
|---|
| 73 | if ( ! $this->has_screenshot( $theme_files ) ) { |
|---|
| 74 | $style_errors->add( |
|---|
| 75 | @@ -1299,6 +1309,10 @@ |
|---|
| 76 | '_screenshot' => $this->theme->screenshot, |
|---|
| 77 | ); |
|---|
| 78 | |
|---|
| 79 | + if ( ! empty( $this->theme_json ) && $this->theme_json->get_patterns() ) { |
|---|
| 80 | + $post_meta[ '_patterns' ] = $this->theme_json->get_patterns(); |
|---|
| 81 | + } |
|---|
| 82 | + |
|---|
| 83 | // Store readme.txt data if present. |
|---|
| 84 | foreach ( $this->readme as $field => $data ) { |
|---|
| 85 | $post_meta[ "_{$field}" ] = $data; |
|---|
| 86 | @@ -1865,4 +1879,27 @@ |
|---|
| 87 | |
|---|
| 88 | $send->send( '#themereview-firehose' ); |
|---|
| 89 | } |
|---|
| 90 | + |
|---|
| 91 | + /** |
|---|
| 92 | + * Returns WP_THEME_JSON information if it exists. |
|---|
| 93 | + * |
|---|
| 94 | + * @return WP_Theme_JSON|null |
|---|
| 95 | + */ |
|---|
| 96 | + public function get_theme_json( $theme_files ) { |
|---|
| 97 | + $theme_json = preg_grep( '/theme.json/i', $theme_files ); |
|---|
| 98 | + |
|---|
| 99 | + if ( ! $theme_json ) { |
|---|
| 100 | + return null; |
|---|
| 101 | + } |
|---|
| 102 | + |
|---|
| 103 | + $file_path = (string) array_pop( $theme_json ); |
|---|
| 104 | + |
|---|
| 105 | + $decoded_file = wp_json_file_decode( $file_path, array( 'associative' => true ) ); |
|---|
| 106 | + |
|---|
| 107 | + if ( ! is_array( $decoded_file ) ) { |
|---|
| 108 | + return null; |
|---|
| 109 | + } |
|---|
| 110 | + |
|---|
| 111 | + return new WP_Theme_JSON( $decoded_file, 'default' ); |
|---|
| 112 | + } |
|---|
| 113 | } |
|---|
| 114 | Index: plugins/theme-directory/theme-directory.php |
|---|
| 115 | =================================================================== |
|---|
| 116 | --- plugins/theme-directory/theme-directory.php (revision 11935) |
|---|
| 117 | +++ plugins/theme-directory/theme-directory.php (working copy) |
|---|
| 118 | @@ -889,6 +889,7 @@ |
|---|
| 119 | 'active_installs' => true, |
|---|
| 120 | 'requires' => true, |
|---|
| 121 | 'requires_php' => true, |
|---|
| 122 | + 'patterns' => true, |
|---|
| 123 | ); |
|---|
| 124 | |
|---|
| 125 | $api_result = wporg_themes_query_api( 'query_themes', $request ); |
|---|
| 126 | @@ -930,6 +931,7 @@ |
|---|
| 127 | 'active_installs' => true, |
|---|
| 128 | 'requires' => true, |
|---|
| 129 | 'requires_php' => true, |
|---|
| 130 | + 'patterns' => true |
|---|
| 131 | ) |
|---|
| 132 | ) ); |
|---|
| 133 | } |
|---|
| 134 | Index: themes/pub/wporg-themes/css/components/_main.scss |
|---|
| 135 | =================================================================== |
|---|
| 136 | --- themes/pub/wporg-themes/css/components/_main.scss (revision 11935) |
|---|
| 137 | +++ themes/pub/wporg-themes/css/components/_main.scss (working copy) |
|---|
| 138 | @@ -563,6 +563,10 @@ |
|---|
| 139 | font-size: 13px; |
|---|
| 140 | } |
|---|
| 141 | |
|---|
| 142 | +.theme-wrap .theme-patterns { |
|---|
| 143 | + font-size: 13px; |
|---|
| 144 | +} |
|---|
| 145 | + |
|---|
| 146 | .theme-wrap .theme-downloads .total-downloads { |
|---|
| 147 | color: #555; |
|---|
| 148 | font-size: 14px; |
|---|
| 149 | Index: themes/pub/wporg-themes/js/theme.js |
|---|
| 150 | =================================================================== |
|---|
| 151 | --- themes/pub/wporg-themes/js/theme.js (revision 11935) |
|---|
| 152 | +++ themes/pub/wporg-themes/js/theme.js (working copy) |
|---|
| 153 | @@ -355,6 +355,7 @@ |
|---|
| 154 | photon_screenshots: true, |
|---|
| 155 | active_installs: true, |
|---|
| 156 | requires_php: true, |
|---|
| 157 | + patterns: true, |
|---|
| 158 | } |
|---|
| 159 | }, request); |
|---|
| 160 | |
|---|
| 161 | @@ -524,6 +525,11 @@ |
|---|
| 162 | return '<a href="' + themes.data.settings.path + themes.router.baseUrl( 'tags/' + slug ) + '">' + translated_tag + '</a>'; |
|---|
| 163 | }).join( ', ' ); |
|---|
| 164 | |
|---|
| 165 | + // Make patterns click-able and separated by a comma. |
|---|
| 166 | + data.patterns = _.map( data.patterns, function( pattern ) { |
|---|
| 167 | + return '<a href="'+ pattern.link + '">' + pattern.name + '</a>'; |
|---|
| 168 | + }).join( ', ' ); |
|---|
| 169 | + |
|---|
| 170 | data.path = themes.data.settings.path; |
|---|
| 171 | |
|---|
| 172 | // Active Installs text |
|---|
| 173 | Index: themes/pub/wporg-themes/theme-single.php |
|---|
| 174 | =================================================================== |
|---|
| 175 | --- themes/pub/wporg-themes/theme-single.php (revision 11935) |
|---|
| 176 | +++ themes/pub/wporg-themes/theme-single.php (working copy) |
|---|
| 177 | @@ -111,6 +111,24 @@ |
|---|
| 178 | </div><!-- .theme-tags --> |
|---|
| 179 | <?php } ?> |
|---|
| 180 | |
|---|
| 181 | + <?php if ( $theme->patterns ) { ?> |
|---|
| 182 | + <div class="theme-patterns"> |
|---|
| 183 | + <h2><?php _e( 'Patterns:', 'wporg-themes' ); ?></h2> |
|---|
| 184 | + <div><?php |
|---|
| 185 | + $pattern_links = array(); |
|---|
| 186 | + |
|---|
| 187 | + foreach ( $theme->patterns as $pattern ) { |
|---|
| 188 | + $pattern_links[] = sprintf( |
|---|
| 189 | + "<a href='%s'>%s</a>", |
|---|
| 190 | + esc_url( $pattern['link'] ), |
|---|
| 191 | + esc_html( $pattern['name'] ) |
|---|
| 192 | + ); |
|---|
| 193 | + } |
|---|
| 194 | + echo implode( ', ', $pattern_links ); |
|---|
| 195 | + ?> |
|---|
| 196 | + </div> |
|---|
| 197 | + </div><!-- .theme-patterns --> |
|---|
| 198 | + <?php } ?> |
|---|
| 199 | + |
|---|
| 200 | <div class="theme-downloads"> |
|---|
| 201 | </div><!-- .theme-downloads --> |
|---|
| 202 | </div> |
|---|
| 203 | Index: themes/pub/wporg-themes/view-templates/theme-single.php |
|---|
| 204 | =================================================================== |
|---|
| 205 | --- themes/pub/wporg-themes/view-templates/theme-single.php (revision 11935) |
|---|
| 206 | +++ themes/pub/wporg-themes/view-templates/theme-single.php (working copy) |
|---|
| 207 | @@ -79,6 +79,13 @@ |
|---|
| 208 | </div><!-- .theme-tags --> |
|---|
| 209 | <# } #> |
|---|
| 210 | |
|---|
| 211 | + <# if ( data.patterns ) { #> |
|---|
| 212 | + <div class="theme-patterns"> |
|---|
| 213 | + <h3><?php _e( 'Patterns:', 'wporg-themes' ); ?></h3> |
|---|
| 214 | + <div>{{{ data.patterns }}}</div> |
|---|
| 215 | + </div><!-- .theme-patterns --> |
|---|
| 216 | + <# } #> |
|---|
| 217 | + |
|---|
| 218 | <div class="theme-downloads"> |
|---|
| 219 | <h3><?php _e( 'Downloads Per Day', 'wporg-themes' ); ?></h3> |
|---|
| 220 | <div id="theme-download-stats-{{data.id}}" class="chart"></div> |
|---|