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 / admin / includes / post.php

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

421 lines 10.4 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 $old_locale = get_post_meta( $post_id, '_locale', true );
318
319 if ( empty( $old_locale ) ) {
320 if ( ! empty( $_REQUEST['locale'] )
321 && bogo_is_available_locale( $_REQUEST['locale'] ) ) {
322 $locale = $_REQUEST['locale'];
323 } elseif ( 'auto-draft' == get_post_status( $post_id ) ) {
324 $locale = bogo_get_user_locale();
325 } else {
326 $locale = bogo_get_default_locale();
327 }
328 }
329
330 if ( ! empty( $locale ) && $locale != $old_locale ) {
331 update_post_meta( $post_id, '_locale', $locale );
332 } else {
333 $locale = $old_locale;
334 }
335
336 if ( $original = get_post_meta( $post_id, '_original_post', true ) ) {
337 return;
338 }
339
340 if ( ! empty( $_REQUEST['original_post'] ) ) {
341 $original = get_post_meta( $_REQUEST['original_post'],
342 '_original_post', true );
343
344 if ( empty( $original ) ) {
345 $original = (int) $_REQUEST['original_post'];
346 }
347
348 update_post_meta( $post_id, '_original_post', $original );
349 return;
350 }
351
352 $original = $post_id;
353
354 while ( 1 ) {
355 $q = new WP_Query();
356
357 $posts = $q->query( array(
358 'bogo_suppress_locale_query' => true,
359 'posts_per_page' => 1,
360 'post_status' => 'any',
361 'post_type' => $post->post_type,
362 'meta_key' => '_original_post',
363 'meta_value' => $original ) );
364
365 if ( empty( $posts ) ) {
366 update_post_meta( $post_id, '_original_post', $original );
367 return;
368 }
369
370 $original += 1;
371 }
372 }
373
374 add_filter( 'wp_unique_post_slug', 'bogo_unique_post_slug', 10, 6 );
375
376 function bogo_unique_post_slug( $slug, $post_id, $status, $type, $parent, $original ) {
377 global $wp_rewrite;
378
379 if ( ! bogo_is_localizable_post_type( $type ) ) {
380 return $slug;
381 }
382
383 $feeds = is_array( $wp_rewrite->feeds ) ? $wp_rewrite->feeds : array();
384
385 if ( in_array( $original, $feeds ) ) {
386 return $slug;
387 }
388
389 $locale = bogo_get_post_locale( $post_id );
390
391 if ( empty( $locale ) ) {
392 return $slug;
393 }
394
395 $args = array(
396 'posts_per_page' => 1,
397 'post__not_in' => array( $post_id ),
398 'post_type' => $type,
399 'name' => $original,
400 'lang' => $locale );
401
402 $hierarchical = in_array( $type, get_post_types( array( 'hierarchical' => true ) ) );
403
404 if ( $hierarchical ) {
405 if ( preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $original ) ) {
406 return $slug;
407 }
408
409 $args['post_parent'] = $parent;
410 }
411
412 $q = new WP_Query();
413 $posts = $q->query( $args );
414
415 if ( empty( $posts ) ) {
416 $slug = $original;
417 }
418
419 return $slug;
420 }
421