| @@ -1,26 +1,17 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | -add_action( 'parse_query', 'bogo_parse_query', 10, 1 ); | |
| 3 | +add_action( 'parse_query', 'bogo_parse_query' ); | |
| 4 | 4 | |
| 5 | 5 | function bogo_parse_query( $query ) { |
| 6 | 6 | $qv = &$query->query_vars; |
| 7 | 7 | |
| 8 | - if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) { | |
| 8 | + if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) | |
| 9 | 9 | return; |
| 10 | - } | |
| 11 | 10 | |
| 12 | - if ( $query->is_preview() and ( $qv['page_id'] or $qv['p'] ) ) { | |
| 13 | - $qv['bogo_suppress_locale_query'] = true; | |
| 14 | - return; | |
| 15 | - } | |
| 11 | + if ( isset( $qv['post_type'] ) && 'any' != $qv['post_type'] ) { | |
| 12 | + $localizable = array_filter( (array) $qv['post_type'], 'bogo_is_localizable_post_type' ); | |
| 16 | 13 | |
| 17 | - if ( isset( $qv['post_type'] ) and 'any' !== $qv['post_type'] ) { | |
| 18 | - $localizable = array_filter( | |
| 19 | - (array) $qv['post_type'], | |
| 20 | - 'bogo_is_localizable_post_type' | |
| 21 | - ); | |
| 22 | - | |
| 23 | 14 | if ( empty( $localizable ) ) { |
| 24 | 15 | $qv['bogo_suppress_locale_query'] = true; |
| 25 | 16 | return; |
| 26 | 17 | } |
| @@ -25,25 +16,23 @@ | ||
| 25 | 16 | return; |
| 26 | 17 | } |
| 27 | 18 | } |
| 28 | 19 | |
| 29 | - $lang = $qv['lang'] ?? ''; | |
| 20 | + $lang = isset( $qv['lang'] ) ? $qv['lang'] : ''; | |
| 30 | 21 | |
| 31 | 22 | if ( is_admin() ) { |
| 32 | 23 | $locale = $lang; |
| 33 | 24 | } else { |
| 34 | - if ( $lang ) { | |
| 25 | + if ( $lang ) | |
| 35 | 26 | $locale = bogo_get_closest_locale( $lang ); |
| 36 | - } else { | |
| 27 | + else | |
| 37 | 28 | $locale = get_locale(); |
| 38 | - } | |
| 39 | 29 | |
| 40 | - if ( empty( $locale ) ) { | |
| 30 | + if ( empty( $locale ) ) | |
| 41 | 31 | $locale = bogo_get_default_locale(); |
| 42 | - } | |
| 43 | 32 | } |
| 44 | 33 | |
| 45 | - if ( empty( $locale ) or ! bogo_is_available_locale( $locale ) ) { | |
| 34 | + if ( empty( $locale ) || ! bogo_is_available_locale( $locale ) ) { | |
| 46 | 35 | $qv['bogo_suppress_locale_query'] = true; |
| 47 | 36 | return; |
| 48 | 37 | } |
| 49 | 38 | |
| @@ -48,25 +37,19 @@ | ||
| 48 | 37 | } |
| 49 | 38 | |
| 50 | 39 | $qv['lang'] = $locale; |
| 51 | 40 | |
| 52 | - if ( is_admin() ) { | |
| 41 | + if ( is_admin() ) | |
| 53 | 42 | return; |
| 54 | - } | |
| 55 | 43 | |
| 56 | - if ( | |
| 57 | - $query->is_home and | |
| 58 | - 'page' === get_option( 'show_on_front' ) and | |
| 59 | - get_option( 'page_on_front' ) | |
| 60 | - ) { | |
| 44 | + if ( $query->is_home && 'page' == get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) { | |
| 61 | 45 | $query_keys = array_keys( wp_parse_args( $query->query ) ); |
| 62 | - $query_keys = array_diff( | |
| 63 | - $query_keys, | |
| 64 | - array( 'preview', 'page', 'paged', 'cpage', 'lang' ) | |
| 65 | - ); | |
| 46 | + $query_keys = array_diff( $query_keys, | |
| 47 | + array( 'preview', 'page', 'paged', 'cpage', 'lang' ) ); | |
| 66 | 48 | |
| 67 | 49 | if ( empty( $query_keys ) ) { |
| 68 | 50 | $query->is_page = true; |
| 51 | + $query->is_singular = true; | |
| 69 | 52 | $query->is_home = false; |
| 70 | 53 | $qv['page_id'] = get_option( 'page_on_front' ); |
| 71 | 54 | |
| 72 | 55 | if ( ! empty( $qv['paged'] ) ) { |
| @@ -78,59 +61,23 @@ | ||
| 78 | 61 | |
| 79 | 62 | if ( '' != $qv['pagename'] ) { |
| 80 | 63 | $query->queried_object = bogo_get_page_by_path( $qv['pagename'], $locale ); |
| 81 | 64 | |
| 82 | - if ( ! empty( $query->queried_object ) ) { | |
| 65 | + if ( ! empty( $query->queried_object ) ) | |
| 83 | 66 | $query->queried_object_id = (int) $query->queried_object->ID; |
| 84 | - } else { | |
| 67 | + else | |
| 85 | 68 | unset( $query->queried_object ); |
| 86 | - unset( $query->queried_object_id ); | |
| 87 | - } | |
| 88 | 69 | |
| 89 | - if ( | |
| 90 | - 'page' === get_option( 'show_on_front' ) and | |
| 91 | - isset( $query->queried_object_id ) and | |
| 92 | - $query->queried_object_id == get_option( 'page_for_posts' ) | |
| 93 | - ) { | |
| 70 | + if ( 'page' == get_option( 'show_on_front' ) | |
| 71 | + && isset( $query->queried_object_id ) | |
| 72 | + && $query->queried_object_id == get_option( 'page_for_posts' ) ) { | |
| 94 | 73 | $query->is_page = false; |
| 95 | 74 | $query->is_home = true; |
| 96 | 75 | $query->is_posts_page = true; |
| 97 | 76 | } |
| 98 | 77 | } |
| 99 | - | |
| 100 | - if ( | |
| 101 | - isset( $qv['post_type'] ) and | |
| 102 | - 'any' !== $qv['post_type'] and | |
| 103 | - ! is_array( $qv['post_type'] ) and | |
| 104 | - ! empty( $qv['name'] ) | |
| 105 | - ) { | |
| 106 | - $query->queried_object = bogo_get_page_by_path( | |
| 107 | - $qv['name'], $locale, $qv['post_type'] | |
| 108 | - ); | |
| 109 | - | |
| 110 | - if ( ! empty( $query->queried_object ) ) { | |
| 111 | - $query->queried_object_id = (int) $query->queried_object->ID; | |
| 112 | - } else { | |
| 113 | - unset( $query->queried_object ); | |
| 114 | - unset( $query->queried_object_id ); | |
| 115 | - } | |
| 116 | - } | |
| 117 | - | |
| 118 | - if ( | |
| 119 | - $query->is_posts_page and | |
| 120 | - ( ! isset( $qv['withcomments'] ) or ! $qv['withcomments'] ) | |
| 121 | - ) { | |
| 122 | - $query->is_comment_feed = false; | |
| 123 | - } | |
| 124 | - | |
| 125 | - $query->is_singular = | |
| 126 | - ( $query->is_single || $query->is_page || $query->is_attachment ); | |
| 127 | - | |
| 128 | - $query->is_embed = | |
| 129 | - $query->is_embed && ( $query->is_singular || $query->is_404 ); | |
| 130 | 78 | } |
| 131 | 79 | |
| 132 | - | |
| 133 | 80 | add_filter( 'posts_join', 'bogo_posts_join', 10, 2 ); |
| 134 | 81 | |
| 135 | 82 | function bogo_posts_join( $join, $query ) { |
| 136 | 83 | global $wpdb; |
| @@ -136,21 +83,18 @@ | ||
| 136 | 83 | global $wpdb; |
| 137 | 84 | |
| 138 | 85 | $qv = &$query->query_vars; |
| 139 | 86 | |
| 140 | - if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) { | |
| 87 | + if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) | |
| 141 | 88 | return $join; |
| 142 | - } | |
| 143 | 89 | |
| 144 | - $locale = $qv['lang'] ?? ''; | |
| 90 | + $locale = empty( $qv['lang'] ) ? '' : $qv['lang']; | |
| 145 | 91 | |
| 146 | - if ( ! bogo_is_available_locale( $locale ) ) { | |
| 92 | + if ( ! bogo_is_available_locale( $locale ) ) | |
| 147 | 93 | return $join; |
| 148 | - } | |
| 149 | 94 | |
| 150 | - if ( ! $meta_table = _get_meta_table( 'post' ) ) { | |
| 95 | + if ( ! $meta_table = _get_meta_table( 'post' ) ) | |
| 151 | 96 | return $join; |
| 152 | - } | |
| 153 | 97 | |
| 154 | 98 | $join .= " LEFT JOIN $meta_table AS postmeta_bogo ON ($wpdb->posts.ID = postmeta_bogo.post_id AND postmeta_bogo.meta_key = '_locale')"; |
| 155 | 99 | |
| 156 | 100 | return $join; |
| @@ -155,9 +99,8 @@ | ||
| 155 | 99 | |
| 156 | 100 | return $join; |
| 157 | 101 | } |
| 158 | 102 | |
| 159 | - | |
| 160 | 103 | add_filter( 'posts_where', 'bogo_posts_where', 10, 2 ); |
| 161 | 104 | |
| 162 | 105 | function bogo_posts_where( $where, $query ) { |
| 163 | 106 | global $wpdb; |
| @@ -163,29 +106,25 @@ | ||
| 163 | 106 | global $wpdb; |
| 164 | 107 | |
| 165 | 108 | $qv = &$query->query_vars; |
| 166 | 109 | |
| 167 | - if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) { | |
| 110 | + if ( ! empty( $qv['bogo_suppress_locale_query'] ) ) | |
| 168 | 111 | return $where; |
| 169 | - } | |
| 170 | 112 | |
| 171 | - $locale = $qv['lang'] ?? ''; | |
| 113 | + $locale = empty( $qv['lang'] ) ? '' : $qv['lang']; | |
| 172 | 114 | |
| 173 | - if ( ! bogo_is_available_locale( $locale ) ) { | |
| 115 | + if ( ! bogo_is_available_locale( $locale ) ) | |
| 174 | 116 | return $where; |
| 175 | - } | |
| 176 | 117 | |
| 177 | - if ( ! $meta_table = _get_meta_table( 'post' ) ) { | |
| 118 | + if ( ! $meta_table = _get_meta_table( 'post' ) ) | |
| 178 | 119 | return $where; |
| 179 | - } | |
| 180 | 120 | |
| 181 | 121 | $where .= " AND (1=0"; |
| 182 | 122 | |
| 183 | 123 | $where .= $wpdb->prepare( " OR postmeta_bogo.meta_value LIKE %s", $locale ); |
| 184 | 124 | |
| 185 | - if ( bogo_is_default_locale( $locale ) ) { | |
| 125 | + if ( bogo_is_default_locale( $locale ) ) | |
| 186 | 126 | $where .= " OR postmeta_bogo.meta_id IS NULL"; |
| 187 | - } | |
| 188 | 127 | |
| 189 | 128 | $where .= ")"; |
| 190 | 129 | |
| 191 | 130 | return $where; |
| @@ -190,96 +129,72 @@ | ||
| 190 | 129 | |
| 191 | 130 | return $where; |
| 192 | 131 | } |
| 193 | 132 | |
| 133 | +add_filter( 'option_sticky_posts', 'bogo_option_sticky_posts' ); | |
| 194 | 134 | |
| 195 | -add_filter( 'option_sticky_posts', 'bogo_option_sticky_posts', 10, 1 ); | |
| 135 | +function bogo_option_sticky_posts( $posts ) { | |
| 136 | + if ( is_admin() ) | |
| 137 | + return $posts; | |
| 196 | 138 | |
| 197 | -function bogo_option_sticky_posts( $posts ) { | |
| 198 | - if ( is_home() ) { | |
| 199 | - $locale = get_locale(); | |
| 139 | + $locale = get_locale(); | |
| 200 | 140 | |
| 201 | - $posts = array_filter( $posts, | |
| 202 | - static function ( $post_id ) use ( $locale ) { | |
| 203 | - return bogo_get_post_locale( $post_id ) === $locale; | |
| 204 | - } | |
| 205 | - ); | |
| 141 | + foreach ( $posts as $key => $post_id ) { | |
| 142 | + if ( $locale != bogo_get_post_locale( $post_id ) ) | |
| 143 | + unset( $posts[$key] ); | |
| 206 | 144 | } |
| 207 | 145 | |
| 208 | 146 | return $posts; |
| 209 | 147 | } |
| 210 | 148 | |
| 149 | +add_filter( 'option_page_on_front', 'bogo_get_local_post' ); | |
| 150 | +add_filter( 'option_page_for_posts', 'bogo_get_local_post' ); | |
| 211 | 151 | |
| 212 | -add_filter( 'option_page_on_front', 'bogo_get_local_post', 10, 1 ); | |
| 213 | -add_filter( 'option_page_for_posts', 'bogo_get_local_post', 10, 1 ); | |
| 214 | - | |
| 215 | 152 | function bogo_get_local_post( $post_id ) { |
| 216 | 153 | global $wpdb; |
| 217 | 154 | |
| 218 | - if ( is_admin() or empty( $post_id ) ) { | |
| 155 | + if ( is_admin() || empty( $post_id ) ) { | |
| 219 | 156 | return $post_id; |
| 220 | 157 | } |
| 221 | 158 | |
| 222 | 159 | $post_type = get_post_type( $post_id ); |
| 223 | 160 | |
| 224 | - if ( | |
| 225 | - ! post_type_exists( $post_type ) or | |
| 226 | - ! bogo_is_localizable_post_type( $post_type ) | |
| 227 | - ) { | |
| 161 | + if ( ! post_type_exists( $post_type ) | |
| 162 | + || ! bogo_is_localizable_post_type( $post_type ) ) { | |
| 228 | 163 | return $post_id; |
| 229 | 164 | } |
| 230 | 165 | |
| 231 | 166 | $locale = get_locale(); |
| 232 | 167 | |
| 233 | - if ( bogo_get_post_locale( $post_id ) === $locale ) { | |
| 168 | + if ( bogo_get_post_locale( $post_id ) == $locale ) { | |
| 234 | 169 | return $post_id; |
| 235 | 170 | } |
| 236 | 171 | |
| 237 | - $locale_query = $wpdb->prepare( | |
| 238 | - "pm2.meta_value LIKE %s", | |
| 239 | - $locale | |
| 240 | - ); | |
| 172 | + $original = get_post_meta( $post_id, '_original_post', true ); | |
| 241 | 173 | |
| 242 | - if ( bogo_is_default_locale( $locale ) ) { | |
| 243 | - $locale_query = $wpdb->prepare( | |
| 244 | - "(pm2.meta_value LIKE %s OR pm2.meta_id IS NULL)", | |
| 245 | - $locale | |
| 246 | - ); | |
| 174 | + if ( empty( $original ) ) { | |
| 175 | + $original = $post_id; | |
| 247 | 176 | } |
| 248 | 177 | |
| 249 | - $original_post = get_post_meta( $post_id, '_original_post', true ); | |
| 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 .= ")"; | |
| 250 | 191 | |
| 251 | - // For back-compat | |
| 252 | - if ( empty( $original_post ) ) { | |
| 253 | - $original_post = $post_id; | |
| 254 | - } | |
| 192 | + $translation = absint( $wpdb->get_var( $q ) ); | |
| 255 | 193 | |
| 256 | - $original_post_query = $wpdb->prepare( | |
| 257 | - "pm1.meta_value = %s", | |
| 258 | - $original_post | |
| 259 | - ); | |
| 260 | - | |
| 261 | - // For back-compat | |
| 262 | - if ( is_int( $original_post ) ) { | |
| 263 | - $original_post_query = $wpdb->prepare( | |
| 264 | - "(ID = %d OR pm1.meta_value = %d)", | |
| 265 | - $original_post, | |
| 266 | - $original_post | |
| 267 | - ); | |
| 268 | - } | |
| 269 | - | |
| 270 | - $translation = $wpdb->get_var( $wpdb->prepare( | |
| 271 | - "SELECT ID FROM %i AS posts LEFT JOIN %i AS pm1 ON posts.ID = pm1.post_id AND pm1.meta_key = '_original_post' LEFT JOIN %i AS pm2 ON posts.ID = pm2.post_id AND pm2.meta_key = '_locale' WHERE post_status = 'publish' AND post_type = %s AND $locale_query AND $original_post_query", | |
| 272 | - $wpdb->posts, | |
| 273 | - $wpdb->postmeta, | |
| 274 | - $wpdb->postmeta, | |
| 275 | - $post_type, | |
| 276 | - ) ); | |
| 277 | - | |
| 278 | - $translation = absint( $translation ); | |
| 279 | - | |
| 280 | - if ( $translation ) { | |
| 194 | + if ( $translation ) | |
| 281 | 195 | return $translation; |
| 282 | - } | |
| 283 | 196 | |
| 284 | 197 | return $post_id; |
| 285 | 198 | } |
| 199 | + | |
| 200 | +?> | |