PluginProbe
Bogo / 3.0.1
Bogo v3.0.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 / admin / includes / post.php

post.php in Bogo 3.0.1, at admin/includes/post.php

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