PluginProbe
Bogo / 2.1
Bogo v2.1
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-l10n.php

post-l10n.php in Bogo 2.1, at includes/post-l10n.php

434 lines 10.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /* Posts List Table */
4
5 add_filter( 'manage_pages_columns', 'bogo_pages_columns' );
6
7 function bogo_pages_columns( $posts_columns ) {
8 return bogo_posts_columns( $posts_columns, 'page' );
9 }
10
11 add_filter( 'manage_posts_columns', 'bogo_posts_columns', 10, 2 );
12
13 function bogo_posts_columns( $posts_columns, $post_type ) {
14 if ( ! bogo_is_localizable_post_type( $post_type ) )
15 return $posts_columns;
16
17 if ( ! isset( $posts_columns['locale'] ) ) {
18 $posts_columns = array_merge(
19 array_slice( $posts_columns, 0, 3 ),
20 array( 'locale' => __( 'Locale', 'bogo' ) ),
21 array_slice( $posts_columns, 3 ) );
22 }
23
24 return $posts_columns;
25 }
26
27 add_action( 'manage_pages_custom_column', 'bogo_manage_posts_custom_column', 10, 2 );
28 add_action( 'manage_posts_custom_column', 'bogo_manage_posts_custom_column', 10, 2 );
29
30 function bogo_manage_posts_custom_column( $column_name, $post_id ) {
31 $post_type = get_post_type( $post_id );
32
33 if ( ! bogo_is_localizable_post_type( $post_type ) )
34 return;
35
36 if ( 'locale' != $column_name )
37 return;
38
39 $locale = get_post_meta( $post_id, '_locale', true );
40
41 if ( empty( $locale ) )
42 return;
43
44 $language = bogo_get_language( $locale );
45
46 if ( empty( $language ) )
47 $language = $locale;
48
49 echo sprintf( '<a href="%1$s">%2$s</a>',
50 esc_url( add_query_arg(
51 array( 'post_type' => $post_type, 'lang' => $locale ),
52 'edit.php' ) ),
53 esc_html( $language ) );
54 }
55
56 add_action( 'restrict_manage_posts', 'bogo_restrict_manage_posts' );
57
58 function bogo_restrict_manage_posts() {
59 global $post_type_object;
60
61 $post_type = $post_type_object->name;
62
63 if ( ! bogo_is_localizable_post_type( $post_type ) )
64 return;
65
66 $available_languages = bogo_available_languages();
67 $current_locale = empty( $_GET['lang'] ) ? '' : $_GET['lang'];
68
69 echo '<select name="lang">';
70
71 $selected = ( '' == $current_locale ) ? ' selected="selected"' : '';
72
73 echo '<option value=""' . $selected . '>'
74 . esc_html( __( 'Show all locales', 'bogo' ) ) . '</option>';
75
76 foreach ( $available_languages as $locale => $lang ) {
77 $selected = ( $locale == $current_locale ) ? ' selected="selected"' : '';
78
79 echo '<option value="' . esc_attr( $locale ) . '"' . $selected . '>'
80 . esc_html( $lang ) . '</option>';
81 }
82
83 echo '</select>' . "\n";
84 }
85
86 add_filter( 'post_row_actions', 'bogo_post_row_actions', 10, 2 );
87 add_filter( 'page_row_actions', 'bogo_post_row_actions', 10, 2 );
88
89 function bogo_post_row_actions( $actions, $post ) {
90 if ( ! bogo_is_localizable_post_type( $post->post_type ) )
91 return $actions;
92
93 $post_type_object = get_post_type_object( $post->post_type );
94
95 if ( ! current_user_can( $post_type_object->cap->edit_post, $post->ID )
96 || 'trash' == $post->post_status )
97 return $actions;
98
99 $user_locale = bogo_get_user_locale();
100 $post_locale = bogo_get_post_locale( $post->ID );
101
102 if ( $user_locale == $post_locale )
103 return $actions;
104
105 $translations = bogo_get_post_translations( $post );
106
107 if ( ! empty( $translations[$user_locale] ) ) {
108 $translation = $translations[$user_locale];
109
110 if ( empty( $translation->ID ) || $translation->ID == $post->ID )
111 return $actions;
112
113 $title = __( 'Edit %s translation of this item', 'bogo' );
114 $text = __( 'Edit %s translation', 'bogo' );
115
116 $edit_link = get_edit_post_link( $translation->ID );
117
118 } else {
119 $title = __( 'Translate this item into %s', 'bogo' );
120 $text = __( 'Translate into %s', 'bogo' );
121
122 $edit_link = admin_url( 'post-new.php?post_type=' . $post->post_type
123 . '&locale=' . $user_locale
124 . '&original_post=' . $post->ID );
125 }
126
127 $language = bogo_get_language( $user_locale );
128
129 if ( empty( $language ) )
130 $language = $user_locale;
131
132 $actions['translate'] = '<a title="' . esc_attr( sprintf( $title, $language ) ) . '" href="' . $edit_link . '">' . esc_html( sprintf( $text, $language ) ) . '</a>';
133
134 return $actions;
135 }
136
137 /* Single Post */
138
139 add_action( 'add_meta_boxes', 'bogo_add_l10n_meta_boxes', 10, 2 );
140
141 function bogo_add_l10n_meta_boxes( $post_type, $post ) {
142 if ( ! bogo_is_localizable_post_type( $post_type ) )
143 return;
144
145 if ( in_array( $post_type, array( 'comment', 'link' ) ) )
146 return;
147
148 add_meta_box( 'bogol10ndiv', __( 'Language', 'bogo' ),
149 'bogo_l10n_meta_box', null, 'side', 'high' );
150 }
151
152 function bogo_l10n_meta_box( $post ) {
153 $initial = ( 'auto-draft' == $post->post_status );
154
155 if ( $initial ) {
156 $locale = isset( $_REQUEST['locale'] ) ? $_REQUEST['locale'] : '';
157
158 if ( ! bogo_is_available_locale( $locale ) )
159 $locale = bogo_get_user_locale();
160
161 $original_post = empty( $_REQUEST['original_post'] ) ? '' : $_REQUEST['original_post'];
162 } else {
163 $locale = bogo_get_post_locale( $post->ID );
164 $original_post = get_post_meta( $post->ID, '_original_post', true );
165
166 if ( empty( $original_post ) )
167 $original_post = $post->ID;
168 }
169
170 $lang = bogo_get_language( $locale );
171
172 if ( empty( $lang ) )
173 $lang = $locale;
174
175 ?>
176 <div class="hidden">
177 <input type="hidden" name="locale" value="<?php echo esc_attr( $locale ); ?>" />
178 <input type="hidden" name="original_post" value="<?php echo esc_attr( $original_post ); ?>" />
179 </div>
180
181 <div class="descriptions">
182 <p><strong><?php echo esc_html( __( 'Language', 'bogo' ) ); ?>:</strong>
183 <?php echo esc_html( $lang ); ?></p>
184 </div>
185
186 <?php
187 bogo_metabox_translations( $post );
188 bogo_metabox_add_translation( $post );
189 }
190
191 function bogo_metabox_translations( $post ) {
192 $translations = bogo_get_post_translations( $post->ID );
193
194 if ( empty( $translations ) )
195 return;
196
197 ?>
198 <p><strong><?php echo esc_html( __( 'Translations', 'bogo' ) ); ?>:</strong></p>
199
200 <ul style="list-style: disc inside; margin-left: 1em;">
201 <?php
202 foreach ( $translations as $locale => $translation ) {
203 $edit_link = get_edit_post_link( $translation->ID );
204
205 echo '<li>';
206
207 if ( $edit_link )
208 echo '<a href="' . esc_url( $edit_link ) . '" target="_blank">' . get_the_title( $translation->ID ) . '</a>';
209 else
210 echo get_the_title( $translation->ID );
211
212 $lang = bogo_get_language( $locale );
213
214 if ( empty( $lang ) )
215 $lang = $locale;
216
217 echo ' [' . $lang . ']';
218 echo '</li>';
219 }
220 ?>
221 </ul>
222 <?php
223 }
224
225 function bogo_metabox_add_translation( $post ) {
226 if ( 'auto-draft' == $post->post_status )
227 return;
228
229 $post_locale = bogo_get_post_locale( $post->ID );
230 $user_locale = bogo_get_user_locale();
231
232 if ( $post_locale == $user_locale )
233 return;
234
235 $locale = $user_locale;
236
237 $translations = bogo_get_post_translations( $post->ID );
238
239 if ( isset( $translations[$locale] ) )
240 return;
241
242 $lang = bogo_get_language( $locale );
243
244 if ( empty( $lang ) )
245 $lang = $locale;
246
247 $edit_link = admin_url( 'post-new.php?post_type=' . $post->post_type
248 . '&locale=' . $locale
249 . '&original_post=' . $post->ID );
250
251 ?>
252 <p class="textright"><a href="<?php echo $edit_link; ?>" target="_blank" class="button"><?php echo esc_html( sprintf( __( 'Add %s translation', 'bogo' ), $lang ) ) ?></a></p>
253 <?php
254 }
255
256 add_filter( 'default_content', 'bogo_translation_default_content', 10, 2 );
257
258 function bogo_translation_default_content( $content, $post ) {
259 if ( ! empty( $content ) )
260 return $content;
261
262 if ( ! empty( $_REQUEST['original_post'] ) ) {
263 $original = get_post( $_REQUEST['original_post'] );
264
265 if ( $original && ! empty( $original->post_content ) )
266 $content = $original->post_content;
267 }
268
269 return $content;
270 }
271
272 add_filter( 'default_title', 'bogo_translation_default_title', 10, 2 );
273
274 function bogo_translation_default_title( $title, $post ) {
275 if ( ! empty( $title ) )
276 return $title;
277
278 if ( ! empty( $_REQUEST['original_post'] ) ) {
279 $original = get_post( $_REQUEST['original_post'] );
280
281 if ( $original && ! empty( $original->post_title ) )
282 $title = $original->post_title;
283 }
284
285 return $title;
286 }
287
288 add_filter( 'default_excerpt', 'bogo_translation_default_excerpt', 10, 2 );
289
290 function bogo_translation_default_excerpt( $excerpt, $post ) {
291 if ( ! empty( $excerpt ) )
292 return $excerpt;
293
294 if ( ! empty( $_REQUEST['original_post'] ) ) {
295 $original = get_post( $_REQUEST['original_post'] );
296
297 if ( $original && ! empty( $original->post_excerpt ) )
298 $excerpt = $original->post_excerpt;
299 }
300
301 return $excerpt;
302 }
303
304 add_action( 'save_post', 'bogo_save_post', 10, 2 );
305
306 function bogo_save_post( $post_id, $post ) {
307 if ( did_action( 'import_start' ) && ! did_action( 'import_end' ) ) // Importing
308 return;
309
310 if ( ! bogo_is_localizable_post_type( $post->post_type ) )
311 return;
312
313 $old_locale = get_post_meta( $post_id, '_locale', true );
314
315 if ( empty( $old_locale ) ) {
316 if ( ! empty( $_REQUEST['locale'] ) && bogo_is_available_locale( $_REQUEST['locale'] ) )
317 $locale = $_REQUEST['locale'];
318 elseif ( 'auto-draft' == get_post_status( $post_id ) )
319 $locale = bogo_get_user_locale();
320 else
321 $locale = bogo_get_default_locale();
322 }
323
324 if ( ! empty( $locale ) && $locale != $old_locale )
325 update_post_meta( $post_id, '_locale', $locale );
326 else
327 $locale = $old_locale;
328
329 if ( $original = get_post_meta( $post_id, '_original_post', true ) )
330 return;
331
332 if ( ! empty( $_REQUEST['original_post'] ) ) {
333 $original = get_post_meta( $_REQUEST['original_post'], '_original_post', true );
334
335 if ( empty( $original ) )
336 $original = (int) $_REQUEST['original_post'];
337
338 update_post_meta( $post_id, '_original_post', $original );
339 return;
340 }
341
342 $original = $post_id;
343
344 while ( 1 ) {
345 $q = new WP_Query();
346
347 $posts = $q->query( array(
348 'bogo_suppress_locale_query' => true,
349 'posts_per_page' => 1,
350 'post_status' => 'any',
351 'post_type' => $post->post_type,
352 'meta_key' => '_original_post',
353 'meta_value' => $original ) );
354
355 if ( empty( $posts ) ) {
356 update_post_meta( $post_id, '_original_post', $original );
357 return;
358 }
359
360 $original += 1;
361 }
362 }
363
364 add_filter( 'wp_unique_post_slug', 'bogo_unique_post_slug', 10, 6 );
365
366 function bogo_unique_post_slug( $slug, $post_id, $status, $type, $parent, $original ) {
367 global $wp_rewrite;
368
369 if ( ! bogo_is_localizable_post_type( $type ) )
370 return $slug;
371
372 $feeds = is_array( $wp_rewrite->feeds ) ? $wp_rewrite->feeds : array();
373
374 if ( in_array( $original, $feeds ) )
375 return $slug;
376
377 $locale = get_post_meta( $post_id, '_locale', true );
378
379 if ( empty( $locale ) )
380 return $slug;
381
382 $args = array(
383 'posts_per_page' => 1,
384 'post__not_in' => array( $post_id ),
385 'post_type' => $type,
386 'name' => $original,
387 'lang' => $locale );
388
389 $hierarchical = in_array( $type, get_post_types( array( 'hierarchical' => true ) ) );
390
391 if ( $hierarchical ) {
392 if ( preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $original ) )
393 return $slug;
394
395 $args['post_parent'] = $parent;
396 }
397
398 $q = new WP_Query();
399 $posts = $q->query( $args );
400
401 if ( empty( $posts ) )
402 $slug = $original;
403
404 return $slug;
405 }
406
407 /* Post Template */
408
409 add_filter( 'body_class', 'bogo_body_class', 10, 2 );
410
411 function bogo_body_class( $classes, $class ) {
412 $locale = bogo_language_tag( get_locale() );
413 $locale = esc_attr( $locale );
414
415 if ( $locale && ! in_array( $locale, $classes ) )
416 $classes[] = $locale;
417
418 return $classes;
419 }
420
421 add_filter( 'post_class', 'bogo_post_class', 10, 3 );
422
423 function bogo_post_class( $classes, $class, $post_id ) {
424 $locale = bogo_get_post_locale( $post_id );
425 $locale = bogo_language_tag( $locale );
426 $locale = esc_attr( $locale );
427
428 if ( $locale && ! in_array( $locale, $classes ) )
429 $classes[] = $locale;
430
431 return $classes;
432 }
433
434 ?>