PluginProbe
Bogo / 2.8
Bogo v2.8
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 2.8, at includes/post.php

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