PluginProbe
Bogo / 2.7
Bogo v2.7
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 / includes / query.php

query.php in Bogo 2.7, at includes/query.php

228 lines 5.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 add_action( 'parse_query', 'bogo_parse_query' );
4
5 function bogo_parse_query( $query ) {
6 $qv = &$query->query_vars;
7
8 if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) {
9 return;
10 }
11
12 if ( isset( $qv['post_type'] ) && 'any' != $qv['post_type'] ) {
13 $localizable = array_filter( (array) $qv['post_type'], 'bogo_is_localizable_post_type' );
14
15 if ( empty( $localizable ) ) {
16 $qv['bogo_suppress_locale_query'] = true;
17 return;
18 }
19 }
20
21 $lang = isset( $qv['lang'] ) ? $qv['lang'] : '';
22
23 if ( is_admin() ) {
24 $locale = $lang;
25 } else {
26 if ( $lang ) {
27 $locale = bogo_get_closest_locale( $lang );
28 } else {
29 $locale = get_locale();
30 }
31
32 if ( empty( $locale ) ) {
33 $locale = bogo_get_default_locale();
34 }
35 }
36
37 if ( empty( $locale ) || ! bogo_is_available_locale( $locale ) ) {
38 $qv['bogo_suppress_locale_query'] = true;
39 return;
40 }
41
42 $qv['lang'] = $locale;
43
44 if ( is_admin() ) {
45 return;
46 }
47
48 if ( $query->is_home && 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) {
49 $query_keys = array_keys( wp_parse_args( $query->query ) );
50 $query_keys = array_diff( $query_keys,
51 array( 'preview', 'page', 'paged', 'cpage', 'lang' ) );
52
53 if ( empty( $query_keys ) ) {
54 $query->is_page = true;
55 $query->is_singular = true;
56 $query->is_home = false;
57 $qv['page_id'] = get_option( 'page_on_front' );
58
59 if ( ! empty( $qv['paged'] ) ) {
60 $qv['page'] = $qv['paged'];
61 unset( $qv['paged'] );
62 }
63 }
64 }
65
66 if ( '' != $qv['pagename'] ) {
67 $query->queried_object = bogo_get_page_by_path( $qv['pagename'], $locale );
68
69 if ( ! empty( $query->queried_object ) ) {
70 $query->queried_object_id = (int) $query->queried_object->ID;
71 } else {
72 unset( $query->queried_object );
73 }
74
75 if ( 'page' == get_option( 'show_on_front' )
76 && isset( $query->queried_object_id )
77 && $query->queried_object_id == get_option( 'page_for_posts' ) ) {
78 $query->is_page = false;
79 $query->is_home = true;
80 $query->is_posts_page = true;
81 }
82 }
83
84 if ( isset( $qv['post_type'] )
85 && 'any' != $qv['post_type']
86 && ! is_array( $qv['post_type'] )
87 && '' != $qv['name'] ) {
88 $query->queried_object = bogo_get_page_by_path(
89 $qv['name'], $locale, $qv['post_type'] );
90
91 if ( ! empty( $query->queried_object ) ) {
92 $query->queried_object_id = (int) $query->queried_object->ID;
93 } else {
94 unset( $query->queried_object );
95 }
96 }
97 }
98
99 add_filter( 'posts_join', 'bogo_posts_join', 10, 2 );
100
101 function bogo_posts_join( $join, $query ) {
102 global $wpdb;
103
104 $qv = &$query->query_vars;
105
106 if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) {
107 return $join;
108 }
109
110 $locale = empty( $qv['lang'] ) ? '' : $qv['lang'];
111
112 if ( ! bogo_is_available_locale( $locale ) ) {
113 return $join;
114 }
115
116 if ( ! $meta_table = _get_meta_table( 'post' ) ) {
117 return $join;
118 }
119
120 $join .= " LEFT JOIN $meta_table AS postmeta_bogo ON ($wpdb->posts.ID = postmeta_bogo.post_id AND postmeta_bogo.meta_key = '_locale')";
121
122 return $join;
123 }
124
125 add_filter( 'posts_where', 'bogo_posts_where', 10, 2 );
126
127 function bogo_posts_where( $where, $query ) {
128 global $wpdb;
129
130 $qv = &$query->query_vars;
131
132 if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) {
133 return $where;
134 }
135
136 $locale = empty( $qv['lang'] ) ? '' : $qv['lang'];
137
138 if ( ! bogo_is_available_locale( $locale ) ) {
139 return $where;
140 }
141
142 if ( ! $meta_table = _get_meta_table( 'post' ) ) {
143 return $where;
144 }
145
146 $where .= " AND (1=0";
147
148 $where .= $wpdb->prepare( " OR postmeta_bogo.meta_value LIKE %s", $locale );
149
150 if ( bogo_is_default_locale( $locale ) ) {
151 $where .= " OR postmeta_bogo.meta_id IS NULL";
152 }
153
154 $where .= ")";
155
156 return $where;
157 }
158
159 add_filter( 'option_sticky_posts', 'bogo_option_sticky_posts' );
160
161 function bogo_option_sticky_posts( $posts ) {
162 if ( is_admin() ) {
163 return $posts;
164 }
165
166 $locale = get_locale();
167
168 foreach ( $posts as $key => $post_id ) {
169 if ( $locale != bogo_get_post_locale( $post_id ) )
170 unset( $posts[$key] );
171 }
172
173 return $posts;
174 }
175
176 add_filter( 'option_page_on_front', 'bogo_get_local_post' );
177 add_filter( 'option_page_for_posts', 'bogo_get_local_post' );
178
179 function bogo_get_local_post( $post_id ) {
180 global $wpdb;
181
182 if ( is_admin() || empty( $post_id ) ) {
183 return $post_id;
184 }
185
186 $post_type = get_post_type( $post_id );
187
188 if ( ! post_type_exists( $post_type )
189 || ! bogo_is_localizable_post_type( $post_type ) ) {
190 return $post_id;
191 }
192
193 $locale = get_locale();
194
195 if ( bogo_get_post_locale( $post_id ) == $locale ) {
196 return $post_id;
197 }
198
199 $original = get_post_meta( $post_id, '_original_post', true );
200
201 if ( empty( $original ) ) {
202 $original = $post_id;
203 }
204
205 $q = "SELECT ID FROM $wpdb->posts AS posts";
206 $q .= " LEFT JOIN $wpdb->postmeta AS pm1";
207 $q .= " ON posts.ID = pm1.post_id AND pm1.meta_key = '_original_post'";
208 $q .= " LEFT JOIN $wpdb->postmeta AS pm2";
209 $q .= " ON posts.ID = pm2.post_id AND pm2.meta_key = '_locale'";
210 $q .= " WHERE 1=1";
211 $q .= " AND post_status = 'publish'";
212 $q .= $wpdb->prepare( " AND post_type = %s", $post_type );
213 $q .= $wpdb->prepare( " AND (ID = %d OR pm1.meta_value = %d)",
214 $original, $original );
215 $q .= " AND (1=0";
216 $q .= $wpdb->prepare( " OR pm2.meta_value LIKE %s", $locale );
217 $q .= bogo_is_default_locale( $locale ) ? " OR pm2.meta_id IS NULL" : "";
218 $q .= ")";
219
220 $translation = absint( $wpdb->get_var( $q ) );
221
222 if ( $translation ) {
223 return $translation;
224 }
225
226 return $post_id;
227 }
228