AbstractPriceByPostMeta.php
1 week ago
Factory.php
1 week ago
PriceFilteringByPostMeta.php
1 week ago
PriceOrderByPostMeta.php
1 week ago
PriceOrderByPostMeta.php
63 lines
| 1 | <?php |
| 2 | |
| 3 | namespace WCML\Multicurrency\WpQueryMcPrice; |
| 4 | |
| 5 | class PriceOrderByPostMeta extends AbstractPriceByPostMeta implements \IWPML_Backend_Action { |
| 6 | |
| 7 | const ORDER_BY_VALUE = [ 'price-desc', 'price' ]; |
| 8 | |
| 9 | public function add_hooks() { |
| 10 | if ( $this->detectProductOrderByPriceInMultiCurrency() ) { |
| 11 | add_filter( 'pre_get_posts', [ $this, 'pre_get_posts' ] ); |
| 12 | add_filter( 'posts_clauses', [ $this, 'posts_clauses_wcml_order_by_price_post_meta' ], 11, 2 ); |
| 13 | } |
| 14 | } |
| 15 | |
| 16 | private function detectProductOrderByPriceInMultiCurrency(): bool { |
| 17 | if ( ! isset( $_GET['orderby'] ) ) { |
| 18 | return false; |
| 19 | } |
| 20 | |
| 21 | if ( ! in_array( $_GET['orderby'], self::ORDER_BY_VALUE ) ) { |
| 22 | return false; |
| 23 | } |
| 24 | |
| 25 | return $this->default_currency !== $this->client_currency; |
| 26 | } |
| 27 | |
| 28 | public function pre_get_posts( $wp_query ) { |
| 29 | if ( isset( $wp_query->query['orderby'] ) && in_array( $wp_query->query['orderby'], self::ORDER_BY_VALUE ) && isset( $wp_query->query_vars['wc_query'] ) && $wp_query->query_vars['wc_query'] === 'product_query' ) { |
| 30 | $wp_query->wcml_orderby_price = $wp_query->query['orderby']; |
| 31 | |
| 32 | unset( $wp_query->query['orderby'] ); |
| 33 | unset( $wp_query->query_vars['orderby'] ); |
| 34 | } |
| 35 | |
| 36 | return $wp_query; |
| 37 | } |
| 38 | |
| 39 | public function posts_clauses_wcml_order_by_price_post_meta( $clauses, $wp_query ) { |
| 40 | if ( empty( $wp_query->wcml_orderby_price ) ) { |
| 41 | return $clauses; |
| 42 | } |
| 43 | |
| 44 | $exchange_rates = $this->woocommerce_wpml->multi_currency->get_exchange_rates(); |
| 45 | if ( ! isset( $exchange_rates[ $this->client_currency ] ) ) { |
| 46 | return $clauses; |
| 47 | } |
| 48 | $exchange_rate = $exchange_rates[ $this->client_currency ]; |
| 49 | |
| 50 | $clauses['join'] = $this->buildWCMLMultiCurrencyQueryJoin( $clauses['join'] ); |
| 51 | |
| 52 | $orderBy = "CASE " . self::WCML_CUSTOM_PRICES_STATUS_ALIAS . ".meta_value "; |
| 53 | $orderBy .= "WHEN '1' THEN CAST(" . self::WCML_MC_PRICE_ALIAS . ".meta_value AS decimal(19,4)) "; |
| 54 | $orderBy .= "ELSE ( CAST(" . self::WCML_PRICE_ALIAS . ".meta_value AS decimal(19,4)) * " . $exchange_rate . " ) END "; |
| 55 | $orderBy .= sprintf( ' %s ', $wp_query->wcml_orderby_price == 'price' ? 'ASC' : 'DESC' ); |
| 56 | $orderBy .= empty( $clauses['orderby'] ) ? ' ' : ', ' . $clauses['orderby']; |
| 57 | |
| 58 | $clauses['orderby'] = $orderBy; |
| 59 | |
| 60 | return $clauses; |
| 61 | } |
| 62 | } |
| 63 |