Passed
Branch master (50908e)
by Stiofan
07:01
created

WPInv_Admin_Addons   F

Complexity

Total Complexity 64

Size/Duplication

Total Lines 279
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
dl 0
loc 279
rs 3.28
c 0
b 0
f 0
wmc 64
lcom 1
cbo 1

5 Methods

Rating   Name   Duplication   Size   Complexity  
A get_recommend_wp_plugins() 0 23 1
A get_tabs() 0 9 1
B get_section_data() 0 30 7
A output() 0 8 3
F output_button() 0 165 52

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 );
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::get_tab() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

42
		/** @scrutinizer ignore-call */ 
43
  $section      = self::get_tab( $section_id );
Loading history...
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();
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::get_reco...plugins_edd_formatted() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

47
			/** @scrutinizer ignore-call */ 
48
   $section_data->products = self::get_recommend_wp_plugins_edd_formatted();
Loading history...
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 );
0 ignored issues
show
Bug Best Practice introduced by
The expression return apply_filters('wp...$products, $section_id) also could return the type string which is incompatible with the documented return type array.
Loading history...
71
	}
72
73
	/**
74
	 * Outputs a button.
75
	 *ccc
76
	 * @param string $url
77
	 * @param string $text
78
	 * @param string $theme
79
	 * @param string $plugin
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 == 'addons' || $current_tab =='gateways') ? 'addons' : $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' || $current_tab =='gateways') && 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);
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::install_plugin_install_status() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

120
			/** @scrutinizer ignore-call */ 
121
   $status = self::install_plugin_install_status($addon);
Loading history...
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);
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::is_theme_installed() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

126
			/** @scrutinizer ignore-call */ 
127
   $button_args['installed'] = self::is_theme_installed($addon);
Loading history...
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);
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::is_theme_active() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

164
				/** @scrutinizer ignore-call */ 
165
    $button_args['active'] = self::is_theme_active($addon);
Loading history...
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);
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::get_theme_activation_url() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

183
					/** @scrutinizer ignore-call */ 
184
     $button_args['url'] = self::get_theme_activation_url($addon);
Loading history...
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
//		print_r($button_args);
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
Bug Best Practice introduced by
The method WPInv_Admin_Addons::get_tabs() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

256
		/** @scrutinizer ignore-call */ 
257
  $tabs            = self::get_tabs();
Loading history...
Unused Code introduced by
The assignment to $tabs is dead and can be removed.
Loading history...
257
		$sections        = self::get_sections();
0 ignored issues
show
Bug Best Practice introduced by
The method Ayecode_Addons::get_sections() is not static, but was called statically. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

257
		/** @scrutinizer ignore-call */ 
258
  $sections        = self::get_sections();
Loading history...
258
		$theme           = wp_get_theme();
0 ignored issues
show
Unused Code introduced by
The assignment to $theme is dead and can be removed.
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
The assignment to $current_section is dead and can be removed.
Loading history...
261
		$current_tab     = empty( $_GET['tab'] ) ? 'addons' : sanitize_title( $_GET['tab'] );
0 ignored issues
show
Unused Code introduced by
The assignment to $current_tab is dead and can be removed.
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
            ),
283
            'userswp' => array(
284
                'url'   => 'https://wordpress.org/plugins/userswp/',
285
                'slug'   => 'userswp',
286
                'name'   => 'UsersWP',
287
                'desc'   => __('Allow frontend user login and registration as well as have slick profile pages.','invoicing'),
288
            ),
289
		);
290
291
		return $plugins;
292
	}
293
}
294