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> |
---|