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
← All changes | includes/post.php +143 -12 2.72.9 View file →
@@ -37,11 +37,15 @@
37 37 return $locale;
38 38 }
39 39
40 40 function bogo_localizable_post_types() {
41 - $localizable = array( 'post', 'page' );
41 + $localizable = apply_filters( 'bogo_localizable_post_types',
42 + array( 'post', 'page' ) );
42 43
43 - return apply_filters( 'bogo_localizable_post_types', $localizable );
44 + $localizable = array_diff( $localizable,
45 + array( 'attachment', 'revision', 'nav_menu_item' ) );
46 +
47 + return $localizable;
44 48 }
45 49
46 50 function bogo_is_localizable_post_type( $post_type ) {
47 51 return ! empty( $post_type ) && in_array( $post_type, bogo_localizable_post_types() );
@@ -49,17 +53,19 @@
49 53
50 54 function bogo_get_post_translations( $post_id = 0 ) {
51 55 $post = get_post( $post_id );
52 56
53 - if ( ! $post )
57 + if ( ! $post ) {
54 58 return false;
59 + }
55 60
56 61 if ( 'auto-draft' == $post->post_status ) {
57 62 if ( ! empty( $_REQUEST['original_post'] ) ) {
58 63 $original = get_post_meta( $_REQUEST['original_post'], '_original_post', true );
59 64
60 - if ( empty( $original ) )
65 + if ( empty( $original ) ) {
61 66 $original = (int) $_REQUEST['original_post'];
67 + }
62 68 } else {
63 69 return false;
64 70 }
65 71 } else {
@@ -65,10 +71,11 @@
65 71 } else {
66 72 $original = get_post_meta( $post->ID, '_original_post', true );
67 73 }
68 74
69 - if ( empty( $original ) )
75 + if ( empty( $original ) ) {
70 76 $original = $post->ID;
77 + }
71 78
72 79 $args = array(
73 80 'bogo_suppress_locale_query' => true,
74 81 'posts_per_page' => -1,
@@ -89,28 +96,42 @@
89 96 $translations[$locale] = get_post( $original );
90 97 }
91 98
92 99 foreach ( $posts as $p ) {
93 - if ( $p->ID == $post->ID )
100 + if ( $p->ID == $post->ID ) {
94 101 continue;
102 + }
95 103
96 104 $locale = bogo_get_post_locale( $p->ID );
97 105
98 - if ( ! bogo_is_available_locale( $locale ) )
106 + if ( ! bogo_is_available_locale( $locale ) ) {
99 107 continue;
108 + }
100 109
101 - if ( ! isset( $translations[$locale] ) )
110 + if ( ! isset( $translations[$locale] ) ) {
102 111 $translations[$locale] = $p;
112 + }
103 113 }
104 114
105 115 return array_filter( $translations );
106 116 }
107 117
118 +function bogo_get_post_translation( $post_id, $locale ) {
119 + $translations = bogo_get_post_translations( $post_id );
120 +
121 + if ( isset( $translations[$locale] ) ) {
122 + return $translations[$locale];
123 + }
124 +
125 + return false;
126 +}
127 +
108 128 function bogo_get_page_by_path( $page_path, $locale = null, $post_type = 'page' ) {
109 129 global $wpdb;
110 130
111 - if ( ! bogo_is_available_locale( $locale ) )
131 + if ( ! bogo_is_available_locale( $locale ) ) {
112 132 $locale = bogo_get_default_locale();
133 + }
113 134
114 135 $page_path = rawurlencode( urldecode( $page_path ) );
115 136 $page_path = str_replace( '%2F', '/', $page_path );
116 137 $page_path = str_replace( '%20', ' ', $page_path );
@@ -139,10 +160,11 @@
139 160
140 161 $foundid = 0;
141 162
142 163 foreach ( (array) $pages as $page ) {
143 - if ( $page->post_name != $revparts[0] )
164 + if ( $page->post_name != $revparts[0] ) {
144 165 continue;
166 + }
145 167
146 168 $count = 0;
147 169 $p = $page;
148 170
@@ -149,10 +171,12 @@
149 171 while ( $p->post_parent != 0 && isset( $pages[$p->post_parent] ) ) {
150 172 $count++;
151 173 $parent = $pages[$p->post_parent];
152 174
153 - if ( ! isset( $revparts[$count] ) || $parent->post_name != $revparts[$count] )
175 + if ( ! isset( $revparts[$count] )
176 + || $parent->post_name != $revparts[$count] ) {
154 177 break;
178 + }
155 179
156 180 $p = $parent;
157 181 }
158 182
@@ -163,12 +187,119 @@
163 187 break;
164 188 }
165 189 }
166 190
167 - if ( $foundid )
191 + if ( $foundid ) {
168 192 return get_page( $foundid );
193 + }
169 194
170 195 return null;
196 +}
197 +
198 +function bogo_duplicate_post( $original_post, $locale ) {
199 + $original_post = get_post( $original_post );
200 +
201 + if ( ! $original_post
202 + || ! bogo_is_localizable_post_type( get_post_type( $original_post ) )
203 + || 'auto-draft' == get_post_status( $original_post ) ) {
204 + return false;
205 + }
206 +
207 + if ( ! bogo_is_available_locale( $locale )
208 + || bogo_get_post_locale( $original_post->ID ) == $locale ) {
209 + return false;
210 + }
211 +
212 + if ( bogo_get_post_translation( $original_post->ID, $locale ) ) {
213 + return false;
214 + }
215 +
216 + $postarr = array(
217 + 'post_content' => $original_post->post_content,
218 + 'post_title' => $original_post->post_title,
219 + 'post_name' => $original_post->post_name,
220 + 'post_excerpt' => $original_post->post_excerpt,
221 + 'post_status' => 'draft',
222 + 'post_type' => $original_post->post_type,
223 + 'comment_status' => $original_post->comment_status,
224 + 'ping_status' => $original_post->ping_status,
225 + 'post_password' => $original_post->post_password,
226 + 'post_content_filtered' => $original_post->post_content_filtered,
227 + 'post_parent' => $original_post->post_parent,
228 + 'menu_order' => $original_post->menu_order,
229 + 'post_mime_type' => $original_post->post_mime_type,
230 + 'tax_input' => array(),
231 + 'meta_input' => array() );
232 +
233 + if ( ! empty( $original_post->post_parent ) ) {
234 + $parent_translation = bogo_get_post_translation(
235 + $original_post->post_parent, $locale );
236 +
237 + if ( $parent_translation ) {
238 + $postarr['post_parent'] = $parent_translation->ID;
239 + }
240 + }
241 +
242 + if ( $taxonomies = get_object_taxonomies( $original_post ) ) {
243 + foreach ( $taxonomies as $taxonomy ) {
244 + $terms = wp_get_post_terms( $original_post->ID,
245 + $taxonomy, array( 'fields' => 'ids' ) );
246 +
247 + if ( $terms && ! is_wp_error( $terms ) ) {
248 + $postarr['tax_input'][$taxonomy] = $terms;
249 + }
250 + }
251 + }
252 +
253 + if ( $post_metas = get_post_meta( $original_post->ID ) ) {
254 + $postarr['meta_input'] = $post_metas;
255 + }
256 +
257 + $postarr = apply_filters( 'bogo_duplicate_post',
258 + $postarr, $original_post, $locale );
259 +
260 + if ( $taxonomies = $postarr['tax_input'] ) {
261 + $postarr['tax_input'] = array();
262 + }
263 +
264 + if ( $post_metas = $postarr['meta_input'] ) {
265 + $postarr['meta_input'] = array();
266 + }
267 +
268 + $new_post_id = wp_insert_post( $postarr );
269 +
270 + if ( $new_post_id ) {
271 + if ( $taxonomies ) {
272 + foreach ( $taxonomies as $taxonomy => $terms ) {
273 + wp_set_post_terms( $new_post_id, $terms, $taxonomy );
274 + }
275 + }
276 +
277 + if ( $post_metas ) {
278 + foreach ( $post_metas as $meta_key => $meta_values ) {
279 + if ( in_array( $meta_key, array( '_locale', '_original_post' ) ) ) {
280 + continue;
281 + }
282 +
283 + foreach ( (array) $meta_values as $meta_value ) {
284 + add_post_meta( $new_post_id, $meta_key, $meta_value );
285 + }
286 + }
287 + }
288 +
289 + update_post_meta( $new_post_id, '_locale', $locale );
290 +
291 + $meta_original_post = get_post_meta( $original_post->ID,
292 + '_original_post', true );
293 +
294 + if ( $meta_original_post ) {
295 + update_post_meta( $new_post_id, '_original_post', $meta_original_post );
296 + } else {
297 + update_post_meta( $new_post_id, '_original_post', $original_post->ID );
298 + }
299 + }
300 +
301 + return $new_post_id;
171 302 }
172 303
173 304 add_filter( 'get_pages', 'bogo_get_pages', 10, 2 );
174 305