Passed
Push — master ( 5d063b...c346b8 )
by Stiofan
41s queued 12s
created

WPInv_Admin_Addons   F

Complexity

Total Complexity 61

Size/Duplication

Total Lines 280
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
dl 0
loc 280
rs 3.52
c 0
b 0
f 0
wmc 61
lcom 1
cbo 1

5 Methods

Rating   Name   Duplication   Size   Complexity  
A get_tabs() 0 10 1
B get_section_data() 0 31 7
F output_button() 0 169 49
A output() 0 9 3
A get_recommend_wp_plugins() 0 25 1

How to fix   Complexity   

Complex Class

Complex classes like WPInv_Admin_Addons often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use WPInv_Admin_Addons, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Invoicing extensions screen related functions
4
 *
5
 * All Invoicing extensions screen related functions can be found here.
6
 *
7
 */
8
if ( ! defined( 'ABSPATH' ) ) {
9
	exit;
10
}
11
12
/**
13
 * WPInv_Admin_Addons Class.
14
 */
15
class WPInv_Admin_Addons extends Ayecode_Addons {
16
17
18
	/**
19
	 * Get the extensions page tabs.
20
	 *
21
	 * @return array of tabs.
22
	 */
23
	public function get_tabs(){
24
		$tabs = array(
25
			'addons' => __("Addons", "invoicing"),
26
            'gateways' => __("Payment Gateways", "invoicing"),
27
            'recommended_plugins' => __("Recommended plugins", "invoicing"),
28
            'membership' => __("Membership", "invoicing"),
29
		);
30
31
		return $tabs;
32
	}
33
34
	/**
35
	 * Get section content for the addons screen.
36
	 *
37
	 * @param  string $section_id
38
	 *
39
	 * @return array
40
	 */
41
	public function get_section_data( $section_id ) {
42
		$section      = self::get_tab( $section_id );
43
		$api_url = "https://wpinvoicing.com/edd-api/v2/products/";
44
		$section_data = new stdClass();
45
46
		if($section_id=='recommended_plugins'){
47
			$section_data->products = self::get_recommend_wp_plugins_edd_formatted();
48
		}
49
		elseif ( ! empty( $section ) ) {
50
			if ( false === ( $section_data = get_transient( 'wpi_addons_section_' . $section_id ) ) ) { //@todo restore after testing
51
			//if ( 1==1) {
52
53
				$query_args = array( 'category' => $section_id, 'number' => 100);
54
				$query_args = apply_filters('wpeu_edd_api_query_args',$query_args,$api_url,$section_id);
55
56
				$raw_section = wp_safe_remote_get( esc_url_raw( add_query_arg($query_args ,$api_url) ), array( 'user-agent' => 'Invoicing Addons Page','timeout'     => 15, ) );
57
58
				if ( ! is_wp_error( $raw_section ) ) {
59
					$section_data = json_decode( wp_remote_retrieve_body( $raw_section ) );
60
61
					if ( ! empty( $section_data->products ) ) {
62
						set_transient( 'wpi_addons_section_' . $section_id, $section_data, DAY_IN_SECONDS );
63
					}
64
				}
65
			}
66
		}
67
68
		$products = isset($section_data->products) ? $section_data->products : '';
69
70
		return apply_filters( 'wpi_addons_section_data', $products, $section_id );
71
	}
72
73
	/**
74
	 * Outputs a button.
75
	 *ccc
76
	 * @param string $url
0 ignored issues
show
Bug introduced by
There is no parameter named $url. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
77
	 * @param string $text
0 ignored issues
show
Bug introduced by
There is no parameter named $text. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
78
	 * @param string $theme
0 ignored issues
show
Bug introduced by
There is no parameter named $theme. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
79
	 * @param string $plugin
0 ignored issues
show
Bug introduced by
There is no parameter named $plugin. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
80
	 */
81
	public function output_button( $addon ) {
82
		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
83
//		$button_text = __('Free','invoicing');
84
//		$licensing = false;
85
//		$installed = false;
86
//		$price = '';
87
//		$license = '';
88
//		$slug = '';
89
//		$url = isset($addon->info->link) ? $addon->info->link : '';
90
//		$class = 'button-primary';
91
//		$install_status = 'get';
92
//		$onclick = '';
93
94
		$wp_org_themes = array('supreme-directory','directory-starter');
95
96
		$button_args = array(
97
			'type' => $current_tab,
98
			'id' => isset($addon->info->id) ? absint($addon->info->id) : '',
99
			'title' => isset($addon->info->title) ? $addon->info->title : '',
100
			'button_text' => __('Free','invoicing'),
101
			'price_text' => __('Free','invoicing'),
102
			'link' => isset($addon->info->link) ? $addon->info->link : '', // link to product
103
			'url' => isset($addon->info->link) ? $addon->info->link : '', // button url
104
			'class' => 'button-primary',
105
			'install_status' => 'get',
106
			'installed' => false,
107
			'price' => '',
108
			'licensing' => isset($addon->licensing->enabled) && $addon->licensing->enabled ? true : false,
109
			'license' => isset($addon->licensing->license) && $addon->licensing->license ? $addon->licensing->license : '',
110
			'onclick' => '',
111
			'slug' => isset($addon->info->slug) ? $addon->info->slug : '',
112
			'active' => false,
113
			'file' => '',
114
			'update_url' => '',
115
		);
116
117
		if($current_tab == 'addons' && isset($addon->info->id) && $addon->info->id){
118
			include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); //for plugins_api..
119
			if(!empty($addon->licensing->edd_slug)){$button_args['slug'] = $addon->licensing->edd_slug;}
120
			$status = self::install_plugin_install_status($addon);
121
			$button_args['file'] = isset($status['file']) ? $status['file'] : '';
122
			if(isset($status['status'])){$button_args['install_status'] = $status['status'];}
123
			$button_args['update_url'] = "https://wpinvoicing.com";
124
		}elseif($current_tab == 'themes' && isset($addon->info->id) && $addon->info->id) {
125
			if(!empty($addon->licensing->edd_slug)){$button_args['slug'] = $addon->licensing->edd_slug;}
126
			$button_args['installed'] = self::is_theme_installed($addon);
127
			if(!in_array($button_args['slug'],$wp_org_themes)){
128
				$button_args['update_url'] = "https://wpinvoicing.com";
129
			}
130
		}elseif($current_tab == 'recommended_plugins' && isset($addon->info->slug) && $addon->info->slug){
131
			include_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); //for plugins_api..
132
			$status = install_plugin_install_status(array("slug"=>$button_args['slug'],"version"=>""));
133
			$button_args['install_status'] = isset($status['status']) ? $status['status'] : 'install';
134
			$button_args['file'] = isset($status['file']) ? $status['file'] : '';
135
		}
136
137
		// set price
138
		if(isset($addon->pricing) && !empty($addon->pricing)){
139
			if(is_object($addon->pricing)){
140
				$prices = (Array)$addon->pricing;
141
				$button_args['price'] = reset($prices);
142
			}elseif(isset($addon->pricing)){
143
				$button_args['price'] = $addon->pricing;
144
			}
145
		}
146
147
		// set price text
148
		if( $button_args['price'] && $button_args['price'] != '0.00' ){
149
			$button_args['price_text'] = sprintf( __('From: $%d', 'invoicing'), $button_args['price']);
150
		}
151
152
153
		// set if installed
154
		if(in_array($button_args['install_status'], array('installed','latest_installed','update_available','newer_installed'))){
155
			$button_args['installed'] = true;
156
		}
157
158
//		print_r($button_args);
159
		// set if active
160
		if($button_args['installed'] && ($button_args['file'] || $button_args['type'] == 'themes')){
161
			if($button_args['type'] != 'themes'){
162
				$button_args['active'] = is_plugin_active($button_args['file']);
163
			}else{
164
				$button_args['active'] = self::is_theme_active($addon);
165
			}
166
		}
167
168
		// set button text and class
169
		if($button_args['active']){
170
			$button_args['button_text'] = __('Active','invoicing');
171
			$button_args['class'] = ' button-secondary disabled ';
172
		}elseif($button_args['installed']){
173
			$button_args['button_text'] = __('Activate','invoicing');
174
175
			if($button_args['type'] != 'themes'){
176
				if ( current_user_can( 'manage_options' ) ) {
177
					$button_args['url'] = wp_nonce_url(admin_url('plugins.php?action=activate&plugin='.$button_args['file']), 'activate-plugin_' . $button_args['file']);
178
				}else{
179
					$button_args['url'] = '#';
180
				}
181
			}else{
182
				if ( current_user_can( 'switch_themes' ) ) {
183
					$button_args['url'] = self::get_theme_activation_url($addon);
184
				}else{
185
					$button_args['url'] = '#';
186
				}
187
			}
188
189
		}else{
190
			if($button_args['type'] == 'recommended_plugins'){
191
				$button_args['button_text'] = __('Install','invoicing');
192
			}else{
193
				$button_args['button_text'] = __('Get it','invoicing');
194
195
				/*if($button_args['type'] == 'themes' && in_array($button_args['slug'],$wp_org_themes) ){
196
					$button_args['button_text'] = __('Install','invoicing');
197
					$button_args['url'] = self::get_theme_install_url($button_args['slug']);
198
					$button_args['onclick'] = 'gd_set_button_installing(this);';
199
				}*/
200
201
			}
202
		}
203
204
		
205
		// filter the button arguments
206
		$button_args = apply_filters('edd_api_button_args',$button_args);
207
208
		// set price text
209
		if(isset($button_args['price_text'])){
210
			?>
211
			<a
212
				target="_blank"
213
				class="addons-price-text"
214
				href="<?php echo esc_url( $button_args['link'] ); ?>">
215
				<?php echo esc_html( $button_args['price_text'] ); ?>
216
			</a>
217
			<?php
218
		}
219
220
221
		$target = '';
222
		if ( ! empty( $button_args['url'] ) ) {
223
			$target = strpos($button_args['url'], get_site_url()) !== false ? '' : ' target="_blank" ';
224
		}
225
226
		?>
227
		<a
228
			data-licence="<?php echo esc_attr($button_args['license']);?>"
229
			data-licensing="<?php echo $button_args['licensing'] ? 1 : 0;?>"
230
			data-title="<?php echo esc_attr($button_args['title']);?>"
231
			data-type="<?php echo esc_attr($button_args['type']);?>"
232
			data-text-error-message="<?php _e('Something went wrong!','invoicing');?>"
233
			data-text-activate="<?php _e('Activate','invoicing');?>"
234
			data-text-activating="<?php _e('Activating','invoicing');?>"
235
			data-text-deactivate="<?php _e('Deactivate','invoicing');?>"
236
			data-text-installed="<?php _e('Installed','invoicing');?>"
237
			data-text-install="<?php _e('Install','invoicing');?>"
238
			data-text-installing="<?php _e('Installing','invoicing');?>"
239
			data-text-error="<?php _e('Error','invoicing');?>"
240
			<?php if(!empty($button_args['onclick'])){echo " onclick='".$button_args['onclick']."' ";}?>
241
			<?php echo $target;?>
242
			class="addons-button  <?php echo esc_attr( $button_args['class'] ); ?>"
243
			href="<?php echo esc_url( $button_args['url'] ); ?>">
244
			<?php echo esc_html( $button_args['button_text'] ); ?>
245
		</a>
246
		<?php
247
248
249
	}
250
251
252
	/**
253
	 * Handles output of the addons page in admin.
254
	 */
255
	public function output() {
256
		$tabs            = self::get_tabs();
0 ignored issues
show
Unused Code introduced by
$tabs is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
257
		$sections        = self::get_sections();
258
		$theme           = wp_get_theme();
0 ignored issues
show
Unused Code introduced by
$theme is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
259
		$section_keys    = array_keys( $sections );
260
		$current_section = isset( $_GET['section'] ) ? sanitize_text_field( $_GET['section'] ) : current( $section_keys );
0 ignored issues
show
Unused Code introduced by
$current_section is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
261
		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
0 ignored issues
show
Unused Code introduced by
$current_tab is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
262
		include_once( WPINV_PLUGIN_DIR . '/includes/admin/html-admin-page-addons.php' );
263
	}
264
265
	/**
266
	 * A list of recommended wp.org plugins.
267
	 * @return array
268
	 */
269
	public function get_recommend_wp_plugins(){
270
		$plugins = array(
271
            'invoicing-quotes' => array(
272
                'url'   => 'https://wordpress.org/plugins/invoicing-quotes/',
273
                'slug'   => 'invoicing-quotes',
274
                'name'   => 'Quotes',
275
                'desc'   => __('Allows you to create quotes, send them to clients and convert them to Invoices when accepted by the customer.','invoicing'),
276
            ),
277
            'geodirectory' => array(
278
                'url'   => 'https://wordpress.org/plugins/geodirectory/',
279
                'slug'   => 'geodirectory',
280
                'name'   => 'GeoDirectory',
281
                'desc'   => __('Turn any WordPress theme into a global business directory portal.','invoicing'),
282
                'thumbnail' => "https://ps.w.org/geodirectory/assets/banner-772x250.jpg"
283
            ),
284
            'userswp' => array(
285
                'url'   => 'https://wordpress.org/plugins/userswp/',
286
                'slug'   => 'userswp',
287
                'name'   => 'UsersWP',
288
                'desc'   => __('Allow frontend user login and registration as well as have slick profile pages.','invoicing'),
289
            ),
290
		);
291
292
		return $plugins;
293
	}
294
}
295