MslsCustomFilter   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
dl 0
loc 93
rs 10
c 0
b 0
f 0
wmc 11
lcom 1
cbo 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 15 3
A add_filter() 0 22 4
A execute_filter() 0 32 4
1
<?php
2
/**
3
 * MslsCustomFilter
4
 * @author Maciej Czerpiński <[email protected]>
5
 * @contributor Dennis Ploetner <[email protected]>
6
 * @since 0.9.9
7
 */
8
9
namespace lloc\Msls;
10
11
/**
12
 * Adding custom filter to posts/pages table.
13
 * @package Msls
14
 */
15
class MslsCustomFilter extends MslsMain {
16
17
	/**
18
	 * Init
19
	 *
20
	 * @codeCoverageIgnore
21
	 *
22
	 * @return MslsCustomFilter
23
	 */
24
	public static function init() {
25
		$options    = MslsOptions::instance();
26
		$collection = MslsBlogCollection::instance();
27
		$obj        = new static( $options, $collection );
28
29
		if ( ! $options->is_excluded() ) {
30
			$post_type = MslsPostType::instance()->get_request();
31
			if ( ! empty( $post_type ) ) {
32
				add_action( 'restrict_manage_posts', [ $obj, 'add_filter' ] );
33
				add_filter( 'parse_query', [ $obj, 'execute_filter' ] );
34
			}
35
		}
36
37
		return $obj;
38
	}
39
40
	/**
41
	 * Echo's select tag with list of blogs
42
	 * @uses selected
43
	 */
44
	public function add_filter() {
45
		$id = (
46
		filter_has_var( INPUT_GET, 'msls_filter' ) ?
47
			filter_input( INPUT_GET, 'msls_filter', FILTER_SANITIZE_NUMBER_INT ) :
48
			''
49
		);
50
51
		$blogs = $this->collection->get();
52
		if ( $blogs ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $blogs of type lloc\Msls\MslsBlog[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
53
			echo '<select name="msls_filter" id="msls_filter">';
54
			echo '<option value="">' . esc_html( __( 'Show all blogs', 'multisite-language-switcher' ) ) . '</option>';
55
			foreach ( $blogs as $blog ) {
56
				printf(
57
					'<option value="%d" %s>%s</option>',
58
					$blog->userblog_id,
59
					selected( $id, $blog->userblog_id, false ),
60
					sprintf( __( 'Not translated in the %s-blog', 'multisite-language-switcher' ), $blog->get_description() )
61
				);
62
			}
63
			echo '</select>';
64
		}
65
	}
66
67
	/**
68
	 * Executes filter, excludes translated posts from WP_Query
69
	 *
70
	 * @param \WP_Query $query
71
	 *
72
	 * @return bool|\WP_Query
73
	 */
74
	public function execute_filter( \WP_Query $query ) {
75
		$blogs = $this->collection->get();
76
77
		if ( ! filter_has_var( INPUT_GET, 'msls_filter' ) ) {
78
			return false;
79
		}
80
81
		$id = filter_input( INPUT_GET, 'msls_filter', FILTER_SANITIZE_NUMBER_INT );
82
83
		if ( isset( $blogs[ $id ] ) ) {
84
			$cache = MslsSqlCacher::init( __CLASS__ )->set_params( __METHOD__ );
85
86
			// load post we need to exclude (already have translation) from search query
87
			$posts = $cache->get_results(
88
				$cache->prepare(
89
					"SELECT option_id, option_name FROM {$cache->options} WHERE option_name LIKE %s AND option_value LIKE %s",
90
					'msls_%',
91
					'%"' . $blogs[ $id ]->get_language() . '"%'
92
				)
93
			);
94
95
			$exclude_ids = [];
96
			foreach ( $posts as $post ) {
97
				$exclude_ids[] = substr( $post->option_name, 5 );
98
			}
99
			$query->query_vars['post__not_in'] = $exclude_ids;
100
101
			return $query;
102
		}
103
104
		return false;
105
	}
106
107
}
108