PluginProbe
Bogo / 2.2
Bogo v2.2
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 / post.php

post.php in Bogo 2.2, at admin/post.php

381 lines 9.8 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_title', 'bogo_translation_default', 10, 2 );
257 add_filter( 'default_content', 'bogo_translation_default', 10, 2 );
258 add_filter( 'default_excerpt', 'bogo_translation_default', 10, 2 );
259
260 function bogo_translation_default( $value, $post ) {
261 if ( ! empty( $value )
262 || empty( $_REQUEST['original_post'] )
263 || ! $original = get_post( $_REQUEST['original_post'] ) ) {
264 return $value;
265 }
266
267 if ( 'default_title' == current_filter() ) {
268 $value = $original->post_title;
269 } elseif ( 'default_content' == current_filter() ) {
270 $value = $original->post_content;
271 } elseif ( 'default_excerpt' == current_filter() ) {
272 $value = $original->post_excerpt;
273 }
274
275 return $value;
276 }
277
278 add_action( 'save_post', 'bogo_save_post', 10, 2 );
279
280 function bogo_save_post( $post_id, $post ) {
281 if ( did_action( 'import_start' ) && ! did_action( 'import_end' ) ) // Importing
282 return;
283
284 if ( ! bogo_is_localizable_post_type( $post->post_type ) )
285 return;
286
287 $old_locale = get_post_meta( $post_id, '_locale', true );
288
289 if ( empty( $old_locale ) ) {
290 if ( ! empty( $_REQUEST['locale'] ) && bogo_is_available_locale( $_REQUEST['locale'] ) )
291 $locale = $_REQUEST['locale'];
292 elseif ( 'auto-draft' == get_post_status( $post_id ) )
293 $locale = bogo_get_user_locale();
294 else
295 $locale = bogo_get_default_locale();
296 }
297
298 if ( ! empty( $locale ) && $locale != $old_locale )
299 update_post_meta( $post_id, '_locale', $locale );
300 else
301 $locale = $old_locale;
302
303 if ( $original = get_post_meta( $post_id, '_original_post', true ) )
304 return;
305
306 if ( ! empty( $_REQUEST['original_post'] ) ) {
307 $original = get_post_meta( $_REQUEST['original_post'], '_original_post', true );
308
309 if ( empty( $original ) )
310 $original = (int) $_REQUEST['original_post'];
311
312 update_post_meta( $post_id, '_original_post', $original );
313 return;
314 }
315
316 $original = $post_id;
317
318 while ( 1 ) {
319 $q = new WP_Query();
320
321 $posts = $q->query( array(
322 'bogo_suppress_locale_query' => true,
323 'posts_per_page' => 1,
324 'post_status' => 'any',
325 'post_type' => $post->post_type,
326 'meta_key' => '_original_post',
327 'meta_value' => $original ) );
328
329 if ( empty( $posts ) ) {
330 update_post_meta( $post_id, '_original_post', $original );
331 return;
332 }
333
334 $original += 1;
335 }
336 }
337
338 add_filter( 'wp_unique_post_slug', 'bogo_unique_post_slug', 10, 6 );
339
340 function bogo_unique_post_slug( $slug, $post_id, $status, $type, $parent, $original ) {
341 global $wp_rewrite;
342
343 if ( ! bogo_is_localizable_post_type( $type ) )
344 return $slug;
345
346 $feeds = is_array( $wp_rewrite->feeds ) ? $wp_rewrite->feeds : array();
347
348 if ( in_array( $original, $feeds ) )
349 return $slug;
350
351 $locale = get_post_meta( $post_id, '_locale', true );
352
353 if ( empty( $locale ) )
354 return $slug;
355
356 $args = array(
357 'posts_per_page' => 1,
358 'post__not_in' => array( $post_id ),
359 'post_type' => $type,
360 'name' => $original,
361 'lang' => $locale );
362
363 $hierarchical = in_array( $type, get_post_types( array( 'hierarchical' => true ) ) );
364
365 if ( $hierarchical ) {
366 if ( preg_match( "@^($wp_rewrite->pagination_base)?\d+$@", $original ) )
367 return $slug;
368
369 $args['post_parent'] = $parent;
370 }
371
372 $q = new WP_Query();
373 $posts = $q->query( $args );
374
375 if ( empty( $posts ) )
376 $slug = $original;
377
378 return $slug;
379 }
380
381 ?>