PluginProbe
Bogo / 3.0
Bogo v3.0
3.9.3 trunk 1.0 1.1 2.0 2.0.1 2.1 2.1.1 2.1.2 2.1.3 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.6 2.6.1 2.7 2.8 2.8.1 2.9 3.0 3.0.1 All 52 releases
bogo / includes / post.php

post.php in Bogo 3.0, at includes/post.php

331 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /* Post Template */
4
5 add_filter( 'body_class', 'bogo_body_class', 10, 2 );
6
7 function bogo_body_class( $classes, $class ) {
8 $locale = bogo_language_tag( get_locale() );
9 $locale = esc_attr( $locale );
10
11 if ( $locale && ! in_array( $locale, $classes ) )
12 $classes[] = $locale;
13
14 return $classes;
15 }
16
17 add_filter( 'post_class', 'bogo_post_class', 10, 3 );
18
19 function bogo_post_class( $classes, $class, $post_id ) {
20 $locale = bogo_get_post_locale( $post_id );
21 $locale = bogo_language_tag( $locale );
22 $locale = esc_attr( $locale );
23
24 if ( $locale && ! in_array( $locale, $classes ) )
25 $classes[] = $locale;
26
27 return $classes;
28 }
29
30 function bogo_get_post_locale( $post_id ) {
31 $locale = get_post_meta( $post_id, '_locale', true );
32
33 if ( empty( $locale ) ) {
34 $locale = bogo_get_default_locale();
35 }
36
37 return $locale;
38 }
39
40 function bogo_localizable_post_types() {
41 $localizable = apply_filters( 'bogo_localizable_post_types',
42 array( 'post', 'page' ) );
43
44 $localizable = array_diff( $localizable,
45 array( 'attachment', 'revision', 'nav_menu_item' ) );
46
47 return $localizable;
48 }
49
50 function bogo_is_localizable_post_type( $post_type ) {
51 return ! empty( $post_type ) && in_array( $post_type, bogo_localizable_post_types() );
52 }
53
54 function bogo_get_post_translations( $post_id = 0 ) {
55 $post = get_post( $post_id );
56
57 if ( ! $post ) {
58 return false;
59 }
60
61 if ( 'auto-draft' == $post->post_status ) {
62 if ( ! empty( $_REQUEST['original_post'] ) ) {
63 $original = get_post_meta( $_REQUEST['original_post'], '_original_post', true );
64
65 if ( empty( $original ) ) {
66 $original = (int) $_REQUEST['original_post'];
67 }
68 } else {
69 return false;
70 }
71 } else {
72 $original = get_post_meta( $post->ID, '_original_post', true );
73 }
74
75 if ( empty( $original ) ) {
76 $original = $post->ID;
77 }
78
79 $args = array(
80 'bogo_suppress_locale_query' => true,
81 'posts_per_page' => -1,
82 'post_status' => 'any',
83 'post_type' => $post->post_type,
84 'meta_key' => '_original_post',
85 'meta_value' => $original );
86
87 $q = new WP_Query();
88 $posts = $q->query( $args );
89
90 $translations = array();
91
92 $original_post_status = get_post_status( $original );
93
94 if ( $original != $post->ID && $original_post_status && 'trash' != $original_post_status ) {
95 $locale = bogo_get_post_locale( $original );
96 $translations[$locale] = get_post( $original );
97 }
98
99 foreach ( $posts as $p ) {
100 if ( $p->ID == $post->ID ) {
101 continue;
102 }
103
104 $locale = bogo_get_post_locale( $p->ID );
105
106 if ( ! bogo_is_available_locale( $locale ) ) {
107 continue;
108 }
109
110 if ( ! isset( $translations[$locale] ) ) {
111 $translations[$locale] = $p;
112 }
113 }
114
115 return array_filter( $translations );
116 }
117
118 function bogo_get_post_translation( $post_id, $locale ) {
119 $translations = bogo_get_post_translations( $post_id );
120
121 if ( isset( $translations[$locale] ) ) {
122 return $translations[$locale];
123 }
124
125 return false;
126 }
127
128 function bogo_get_page_by_path( $page_path, $locale = null, $post_type = 'page' ) {
129 global $wpdb;
130
131 if ( ! bogo_is_available_locale( $locale ) ) {
132 $locale = bogo_get_default_locale();
133 }
134
135 $page_path = rawurlencode( urldecode( $page_path ) );
136 $page_path = str_replace( '%2F', '/', $page_path );
137 $page_path = str_replace( '%20', ' ', $page_path );
138
139 $parts = explode( '/', trim( $page_path, '/' ) );
140 $parts = array_map( 'esc_sql', $parts );
141 $parts = array_map( 'sanitize_title_for_query', $parts );
142
143 $in_string = "'" . implode( "','", $parts ) . "'";
144 $post_type_sql = $post_type;
145 $wpdb->escape_by_ref( $post_type_sql );
146
147 $q = "SELECT ID, post_name, post_parent FROM $wpdb->posts";
148 $q .= " LEFT JOIN $wpdb->postmeta ON ID = $wpdb->postmeta.post_id AND meta_key = '_locale'";
149 $q .= " WHERE 1=1";
150 $q .= " AND post_name IN ($in_string)";
151 $q .= " AND (post_type = '$post_type_sql' OR post_type = 'attachment')";
152 $q .= " AND (1=0";
153 $q .= $wpdb->prepare( " OR meta_value LIKE %s", $locale );
154 $q .= bogo_is_default_locale( $locale ) ? " OR meta_id IS NULL" : "";
155 $q .= ")";
156
157 $pages = $wpdb->get_results( $q, OBJECT_K );
158
159 $revparts = array_reverse( $parts );
160
161 $foundid = 0;
162
163 foreach ( (array) $pages as $page ) {
164 if ( $page->post_name != $revparts[0] ) {
165 continue;
166 }
167
168 $count = 0;
169 $p = $page;
170
171 while ( $p->post_parent != 0 && isset( $pages[$p->post_parent] ) ) {
172 $count++;
173 $parent = $pages[$p->post_parent];
174
175 if ( ! isset( $revparts[$count] )
176 || $parent->post_name != $revparts[$count] ) {
177 break;
178 }
179
180 $p = $parent;
181 }
182
183 if ( $p->post_parent == 0
184 && $count + 1 == count( $revparts )
185 && $p->post_name == $revparts[$count] ) {
186 $foundid = $page->ID;
187 break;
188 }
189 }
190
191 if ( $foundid ) {
192 return get_page( $foundid );
193 }
194
195 return null;
196 }
197
198 function bogo_duplicate_post( $original_post, $locale ) {
199 $original_post = get_post( $original_post );
200
201 if ( ! $original_post
202 || ! bogo_is_localizable_post_type( get_post_type( $original_post ) )
203 || 'auto-draft' == get_post_status( $original_post ) ) {
204 return false;
205 }
206
207 if ( ! bogo_is_available_locale( $locale )
208 || bogo_get_post_locale( $original_post->ID ) == $locale ) {
209 return false;
210 }
211
212 if ( bogo_get_post_translation( $original_post->ID, $locale ) ) {
213 return false;
214 }
215
216 $postarr = array(
217 'post_content' => $original_post->post_content,
218 'post_title' => $original_post->post_title,
219 'post_name' => $original_post->post_name,
220 'post_excerpt' => $original_post->post_excerpt,
221 'post_status' => 'draft',
222 'post_type' => $original_post->post_type,
223 'comment_status' => $original_post->comment_status,
224 'ping_status' => $original_post->ping_status,
225 'post_password' => $original_post->post_password,
226 'post_content_filtered' => $original_post->post_content_filtered,
227 'post_parent' => $original_post->post_parent,
228 'menu_order' => $original_post->menu_order,
229 'post_mime_type' => $original_post->post_mime_type,
230 'tax_input' => array(),
231 'meta_input' => array() );
232
233 if ( ! empty( $original_post->post_parent ) ) {
234 $parent_translation = bogo_get_post_translation(
235 $original_post->post_parent, $locale );
236
237 if ( $parent_translation ) {
238 $postarr['post_parent'] = $parent_translation->ID;
239 }
240 }
241
242 if ( $taxonomies = get_object_taxonomies( $original_post ) ) {
243 foreach ( $taxonomies as $taxonomy ) {
244 $terms = wp_get_post_terms( $original_post->ID,
245 $taxonomy, array( 'fields' => 'ids' ) );
246
247 if ( $terms && ! is_wp_error( $terms ) ) {
248 $postarr['tax_input'][$taxonomy] = $terms;
249 }
250 }
251 }
252
253 if ( $post_metas = get_post_meta( $original_post->ID ) ) {
254 $postarr['meta_input'] = $post_metas;
255 }
256
257 $postarr = apply_filters( 'bogo_duplicate_post',
258 $postarr, $original_post, $locale );
259
260 if ( $taxonomies = $postarr['tax_input'] ) {
261 $postarr['tax_input'] = array();
262 }
263
264 if ( $post_metas = $postarr['meta_input'] ) {
265 $postarr['meta_input'] = array();
266 }
267
268 $new_post_id = wp_insert_post( $postarr );
269
270 if ( $new_post_id ) {
271 if ( $taxonomies ) {
272 foreach ( $taxonomies as $taxonomy => $terms ) {
273 wp_set_post_terms( $new_post_id, $terms, $taxonomy );
274 }
275 }
276
277 if ( $post_metas ) {
278 foreach ( $post_metas as $meta_key => $meta_values ) {
279 if ( in_array( $meta_key, array( '_locale', '_original_post' ) ) ) {
280 continue;
281 }
282
283 foreach ( (array) $meta_values as $meta_value ) {
284 add_post_meta( $new_post_id, $meta_key, $meta_value );
285 }
286 }
287 }
288
289 update_post_meta( $new_post_id, '_locale', $locale );
290
291 $meta_original_post = get_post_meta( $original_post->ID,
292 '_original_post', true );
293
294 if ( $meta_original_post ) {
295 update_post_meta( $new_post_id, '_original_post', $meta_original_post );
296 } else {
297 update_post_meta( $new_post_id, '_original_post', $original_post->ID );
298 }
299 }
300
301 return $new_post_id;
302 }
303
304 add_filter( 'get_pages', 'bogo_get_pages', 10, 2 );
305
306 function bogo_get_pages( $pages, $args ) {
307 if ( is_admin()
308 || ! bogo_is_localizable_post_type( $args['post_type'] )
309 || ! empty( $args['bogo_suppress_locale_query'] ) ) {
310 return $pages;
311 }
312
313 $locale = isset( $args['lang'] ) ? $args['lang'] : get_locale();
314
315 if ( ! bogo_is_available_locale( $locale ) ) {
316 return $pages;
317 }
318
319 $new_pages = array();
320
321 foreach ( (array) $pages as $page ) {
322 $post_locale = bogo_get_post_locale( $page->ID );
323
324 if ( $post_locale == $locale ) {
325 $new_pages[] = $page;
326 }
327 }
328
329 return $new_pages;
330 }
331