woocommerce-multilingual
/
compatibility
/
WcOrderStatusManager
/
class-wcml-order-status-manager.php
class-wcml-order-status-manager.php
56 lines
| 1 | <?php |
| 2 | class WCML_Order_Status_Manager implements \IWPML_Action { |
| 3 | private $wp_query; |
| 4 | |
| 5 | public function __construct( WP_Query $wp_query ) { |
| 6 | $this->wp_query = $wp_query; |
| 7 | } |
| 8 | |
| 9 | public function add_hooks() { |
| 10 | add_action( 'pre_get_posts', [ $this, 'pre_get_posts' ], 10, 1 ); |
| 11 | } |
| 12 | |
| 13 | public function pre_get_posts( $q = null ) { |
| 14 | if ( isset( $q->query['post_type'] ) |
| 15 | && 'wc_order_status' === $q->query['post_type'] |
| 16 | && doing_filter( 'woocommerce_register_shop_order_post_statuses' ) |
| 17 | ) { |
| 18 | $q->set( 'post__not_in', $this->prepare_post_not_in( $q, $this->get_statuses() ) ); |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | private function get_statuses() { |
| 23 | remove_action( 'pre_get_posts', [ $this, 'pre_get_posts' ], 10 ); |
| 24 | $this->wp_query->query( |
| 25 | [ |
| 26 | 'post_type' => 'wc_order_status', |
| 27 | 'posts_per_page' => 100, |
| 28 | 'suppress_filters' => false, |
| 29 | |
| 30 | ] |
| 31 | ); |
| 32 | add_action( 'pre_get_posts', [ $this, 'pre_get_posts' ], 10, 1 ); |
| 33 | return $this->wp_query->posts; |
| 34 | } |
| 35 | |
| 36 | private function prepare_post_not_in( $q, $statuses ) { |
| 37 | $post__not_in = []; |
| 38 | |
| 39 | if ( $statuses ) { |
| 40 | $current_language = apply_filters( 'wpml_current_language', null ); |
| 41 | |
| 42 | foreach ( $statuses as $status ) { |
| 43 | $post_language_details = apply_filters( 'wpml_post_language_details', '', $status->ID ); |
| 44 | if ( isset( $post_language_details['language_code'] ) ) { |
| 45 | if ( $post_language_details['language_code'] !== $current_language ) { |
| 46 | $post__not_in[] = $status->ID; |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | $post__not_in_query = isset( $q->query_vars['post__not_in'] ) ? $q->query_vars['post__not_in'] : []; |
| 53 | return array_merge( $post__not_in_query, $post__not_in ); |
| 54 | } |
| 55 | } |
| 56 |