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

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

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