PluginProbe
Bogo / 2.9
Bogo v2.9
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 2.9, at admin/includes/post.php

440 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 || ! current_user_can( 'bogo_access_locale', $locale ) ) {
160 return;
161 }
162
163 if ( ! $original_post || ! $original_post = get_post( $original_post ) ) {
164 return;
165 }
166
167 $post_type_object = get_post_type_object( $original_post->post_type );
168
169 if ( $post_type_object
170 && current_user_can( $post_type_object->cap->edit_posts ) ) {
171 $new_post_id = bogo_duplicate_post( $original_post, $locale );
172
173 if ( $new_post_id ) {
174 $redirect_to = get_edit_post_link( $new_post_id, 'raw' );
175 wp_safe_redirect( $redirect_to );
176 exit();
177 }
178 }
179 }
180
181 /* Single Post */
182
183 add_action( 'add_meta_boxes', 'bogo_add_l10n_meta_boxes', 10, 2 );
184
185 function bogo_add_l10n_meta_boxes( $post_type, $post ) {
186 if ( ! bogo_is_localizable_post_type( $post_type ) ) {
187 return;
188 }
189
190 if ( in_array( $post_type, array( 'comment', 'link' ) ) ) {
191 return;
192 }
193
194 add_meta_box( 'bogol10ndiv', __( 'Language', 'bogo' ),
195 'bogo_l10n_meta_box', null, 'side', 'high' );
196 }
197
198 function bogo_l10n_meta_box( $post ) {
199 $initial = ( 'auto-draft' == $post->post_status );
200
201 if ( $initial ) {
202 $post_locale = isset( $_REQUEST['locale'] ) ? $_REQUEST['locale'] : '';
203
204 if ( ! bogo_is_available_locale( $post_locale ) ) {
205 $post_locale = bogo_get_user_locale();
206 }
207
208 $original_post = empty( $_REQUEST['original_post'] )
209 ? '' : $_REQUEST['original_post'];
210 } else {
211 $post_locale = bogo_get_post_locale( $post->ID );
212 $original_post = get_post_meta( $post->ID, '_original_post', true );
213
214 if ( empty( $original_post ) ) {
215 $original_post = $post->ID;
216 }
217 }
218
219 $translations = bogo_get_post_translations( $post->ID );
220 $available_locales = bogo_available_locales( array(
221 'exclude' => array_merge(
222 array( $post_locale ),
223 array_keys( (array) $translations ) ),
224 'exclude_enus_if_inactive' => true,
225 'current_user_can_access' => true ) );
226 ?>
227 <div class="hidden">
228 <input type="hidden" name="locale" value="<?php echo esc_attr( $post_locale ); ?>" />
229 <input type="hidden" name="original_post" value="<?php echo esc_attr( $original_post ); ?>" />
230 </div>
231
232 <div class="descriptions">
233 <?php
234 $lang = bogo_get_language( $post_locale );
235 $lang = empty( $lang ) ? $post_locale : $lang;
236 ?>
237 <p><strong><?php echo esc_html( __( 'Language', 'bogo' ) ); ?>:</strong>
238 <?php echo esc_html( $lang ); ?></p>
239 </div>
240
241 <?php
242 do {
243 if ( ! $translations && ( $initial || empty( $available_locales ) ) ) {
244 break;
245 }
246
247 echo '<div class="descriptions">';
248 echo sprintf( '<p><strong>%s:</strong></p>',
249 esc_html( __( 'Translations', 'bogo' ) ) );
250 echo '<ul id="bogo-translations">';
251
252 if ( $translations ) {
253 foreach ( $translations as $locale => $translation ) {
254 $edit_link = get_edit_post_link( $translation->ID );
255 echo '<li>';
256
257 if ( $edit_link ) {
258 echo sprintf( '<a href="%1$s" target="_blank">%2$s</a>',
259 esc_url( $edit_link ), get_the_title( $translation->ID ) );
260 } else {
261 echo get_the_title( $translation->ID );
262 }
263
264 $lang = bogo_get_language( $locale );
265 $lang = empty( $lang ) ? $locale : $lang;
266 echo ' [' . $lang . ']';
267 echo '</li>';
268 }
269 }
270
271 echo '</ul>';
272 echo '</div>';
273 } while (0);
274
275 do {
276 if ( $initial || empty( $available_locales ) ) {
277 break;
278 }
279
280 echo '<div id="bogo-add-translation-actions" class="descriptions">';
281 echo sprintf( '<p><strong>%s:</strong></p>',
282 esc_html( __( 'Add Translation', 'bogo' ) ) );
283 echo '<select id="bogo-translations-to-add">';
284
285 foreach ( $available_locales as $locale ) {
286 $lang = bogo_get_language( $locale );
287 $lang = empty( $lang ) ? $locale : $lang;
288 echo sprintf( '<option value="%1$s">%2$s</option>',
289 esc_attr( $locale ), esc_html( $lang ) );
290 }
291
292 echo '</select>';
293 echo '<p>';
294 echo sprintf(
295 '<button type="button" class="button" id="%1$s">%2$s</button>',
296 'bogo-add-translation',
297 esc_html( __( 'Add Translation', 'bogo' ) ) );
298 echo '<span class="spinner"></span>';
299 echo '</p>';
300 echo '<div class="clear"></div>';
301 echo '</div>';
302 } while (0);
303 }
304
305 add_action( 'save_post', 'bogo_save_post', 10, 2 );
306
307 function bogo_save_post( $post_id, $post ) {
308 if ( did_action( 'import_start' ) && ! did_action( 'import_end' ) ) {
309 // Importing
310 return;
311 }
312
313 if ( ! bogo_is_localizable_post_type( $post->post_type ) ) {
314 return;
315 }
316
317 $current_locales = get_post_meta( $post_id, '_locale' );
318 $locale = null;
319
320 if ( ! empty( $current_locales ) ) {
321 foreach ( $current_locales as $current_locale ) {
322 if ( bogo_is_available_locale( $current_locale ) ) {
323 $locale = $current_locale;
324 break;
325 }
326 }
327
328 if ( empty( $locale ) || 1 < count( $current_locales ) ) {
329 delete_post_meta( $post_id, '_locale' );
330 $current_locales = array();
331 }
332 }
333
334 if ( empty( $current_locales ) ) {
335 if ( bogo_is_available_locale( $locale ) ) {
336 // $locale = $locale;
337 } elseif ( ! empty( $_REQUEST['locale'] )
338 && bogo_is_available_locale( $_REQUEST['locale'] ) ) {
339 $locale = $_REQUEST['locale'];
340 } elseif ( 'auto-draft' == get_post_status( $post_id ) ) {
341 $locale = bogo_get_user_locale();
342 } else {
343 $locale = bogo_get_default_locale();
344 }
345
346 add_post_meta( $post_id, '_locale', $locale, true );
347 }
348
349 $current_original_posts = get_post_meta( $post_id, '_original_post' );
350
351 if ( ! empty( $current_original_posts ) ) {
352 if ( 1 < count( $current_original_posts ) ) {
353 delete_post_meta( $post_id, '_original_post' );
354 } else {
355 return;
356 }
357 }
358
359 if ( ! empty( $_REQUEST['original_post'] ) ) {
360 $original = get_post_meta( $_REQUEST['original_post'],
361 '_original_post', true );
362
363 if ( empty( $original ) ) {
364 $original = (int) $_REQUEST['original_post'];
365 }
366
367 add_post_meta( $post_id, '_original_post', $original, true );
368 return;
369 }
370
371 $original = $post_id;
372
373 while ( 1 ) {
374 $q = new WP_Query();
375
376 $posts = $q->query( array(
377 'bogo_suppress_locale_query' => true,
378 'posts_per_page' => 1,
379 'post_status' => 'any',
380 'post_type' => $post->post_type,
381 'meta_key' => '_original_post',
382 'meta_value' => $original ) );
383
384 if ( empty( $posts ) ) {
385 add_post_meta( $post_id, '_original_post', $original, true );
386 return;
387 }
388
389 $original += 1;
390 }
391 }
392
393 add_filter( 'wp_unique_post_slug', 'bogo_unique_post_slug', 10, 6 );
394
395 function bogo_unique_post_slug( $slug, $post_id, $status, $type, $parent, $original ) {
396 global $wp_rewrite;
397
398 if ( ! bogo_is_localizable_post_type( $type ) ) {
399 return $slug;
400 }
401
402 $feeds = is_array( $wp_rewrite->feeds ) ? $wp_rewrite->feeds : array();
403
404 if ( in_array( $original, $feeds ) ) {
405 return $slug;
406 }
407
408 $locale = bogo_get_post_locale( $post_id );
409
410 if ( empty( $locale ) ) {
411 return $slug;
412 }
413
414 $args = array(
415 'posts_per_page' => 1,
416 'post__not_in' => array( $post_id ),
417 'post_type' => $type,
418 'name' => $original,
419 'lang' => $locale );
420
421 $hierarchical = in_array( $type, get_post_types( array( 'hierarchical' => true ) ) );
422
423 if ( $hierarchical ) {
424 if ( preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $original ) ) {
425 return $slug;
426 }
427
428 $args['post_parent'] = $parent;
429 }
430
431 $q = new WP_Query();
432 $posts = $q->query( $args );
433
434 if ( empty( $posts ) ) {
435 $slug = $original;
436 }
437
438 return $slug;
439 }
440