| Total Complexity | 49 |
| Total Lines | 405 |
| Duplicated Lines | 0 % |
| Changes | 20 | ||
| Bugs | 0 | Features | 8 |
Complex classes like Algolia_Send_Products 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.
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 Algolia_Send_Products, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 91 | class Algolia_Send_Products |
||
| 92 | { |
||
| 93 | const PLUGIN_NAME = 'Algolia Woo Indexer'; |
||
| 94 | const PLUGIN_TRANSIENT = 'algowoo-plugin-notice'; |
||
| 95 | |||
| 96 | /** |
||
| 97 | * The Algolia instance |
||
| 98 | * |
||
| 99 | * @var \Algolia\AlgoliaSearch\SearchClient |
||
| 100 | */ |
||
| 101 | private static $algolia = null; |
||
| 102 | |||
| 103 | /** |
||
| 104 | * Check if we can connect to Algolia, if not, handle the exception, display an error and then return |
||
| 105 | */ |
||
| 106 | public static function can_connect_to_algolia() |
||
| 107 | { |
||
| 108 | try { |
||
| 109 | self::$algolia->listApiKeys(); |
||
| 110 | } catch (\Algolia\AlgoliaSearch\Exceptions\UnreachableException $error) { |
||
| 111 | add_action( |
||
| 112 | 'admin_notices', |
||
| 113 | function () { |
||
| 114 | echo '<div class="error notice"> |
||
| 115 | <p>' . esc_html__('An error has been encountered. Please check your application ID and API key. ', 'algolia-woo-indexer') . '</p> |
||
| 116 | </div>'; |
||
| 117 | } |
||
| 118 | ); |
||
| 119 | return; |
||
| 120 | } |
||
| 121 | } |
||
| 122 | |||
| 123 | /** |
||
| 124 | * check if the field is enabled and shall be sent |
||
| 125 | * |
||
| 126 | * @param mixed $field name of field to be checked according to BASIC_FIELDS |
||
| 127 | * @return boolean true if enable, false is not enabled |
||
| 128 | */ |
||
| 129 | public static function is_basic_field_enabled($field) |
||
| 130 | { |
||
| 131 | $fieldValue = get_option(ALGOWOO_DB_OPTION . BASIC_FIELD_PREFIX . $field); |
||
| 132 | return $fieldValue; |
||
| 133 | } |
||
| 134 | |||
| 135 | /** |
||
| 136 | * helper function to add a field to a record while checking their state |
||
| 137 | * |
||
| 138 | * @param array $record existing record where the field and value shall be added to |
||
| 139 | * @param string $field name of field to be checked according to BASIC_FIELDS |
||
| 140 | * @param mixed $value data to be added to the record array named to $field |
||
| 141 | * @param boolean $skip_basic_field_validation set to true if it is not a basic field to skip validation |
||
| 142 | * @return array $record previous passed $record with added field data |
||
| 143 | */ |
||
| 144 | public static function add_to_record($record, $field, $value, $skip_basic_field_validation = false) |
||
| 145 | { |
||
| 146 | /** |
||
| 147 | * only if enabled or validation skipped and not empty |
||
| 148 | */ |
||
| 149 | if ((!self::is_basic_field_enabled($field) && !$skip_basic_field_validation) || empty($value)) { |
||
| 150 | return $record; |
||
| 151 | } |
||
| 152 | |||
| 153 | $record[$field] = $value; |
||
| 154 | return $record; |
||
| 155 | } |
||
| 156 | |||
| 157 | /** |
||
| 158 | * Get sale price or regular price based on product type |
||
| 159 | * |
||
| 160 | * @param mixed $product Product to check |
||
| 161 | * @return array ['sale_price' => $sale_price,'regular_price' => $regular_price] Array with regular price and sale price |
||
| 162 | */ |
||
| 163 | public static function get_product_type_price($product) |
||
| 164 | { |
||
| 165 | $sale_price = 0; |
||
| 166 | $regular_price = 0; |
||
| 167 | if ($product->is_type('simple')) { |
||
| 168 | $sale_price = $product->get_sale_price(); |
||
| 169 | $regular_price = $product->get_regular_price(); |
||
| 170 | } elseif ($product->is_type('variable')) { |
||
| 171 | $sale_price = $product->get_variation_sale_price('min', true); |
||
| 172 | $regular_price = $product->get_variation_regular_price('max', true); |
||
| 173 | } |
||
| 174 | return array( |
||
| 175 | 'sale_price' => $sale_price, |
||
| 176 | 'regular_price' => $regular_price |
||
| 177 | ); |
||
| 178 | } |
||
| 179 | |||
| 180 | |||
| 181 | /** |
||
| 182 | * Checks if stock management is enabled and if so, returns quantity and status |
||
| 183 | * |
||
| 184 | * @param mixed $product Product to check |
||
| 185 | * @return array ['stock_quantity' => $stock_quantity,'stock_status' => $stock_status] Array with quantity and status. if stock management is disabled, false will be returned, |
||
| 186 | */ |
||
| 187 | public static function get_product_stock_data($product) |
||
| 188 | { |
||
| 189 | if ($product->get_manage_stock()) { |
||
| 190 | return array( |
||
| 191 | 'stock_quantity' => $product->get_stock_quantity(), |
||
| 192 | 'stock_status' => $product->get_stock_status() |
||
| 193 | ); |
||
| 194 | } |
||
| 195 | return false; |
||
| 196 | } |
||
| 197 | |||
| 198 | /** |
||
| 199 | * Get product tags |
||
| 200 | * |
||
| 201 | * @param mixed $product Product to check |
||
| 202 | * @return array ['tag1', 'tag2', ...] simple array with associated tags |
||
| 203 | */ |
||
| 204 | public static function get_product_tags($product) |
||
| 205 | { |
||
| 206 | $tags = get_the_terms($product->get_id(), 'product_tag'); |
||
| 207 | $term_array = array(); |
||
| 208 | if (is_array($tags)) { |
||
| 209 | foreach ($tags as $tag) { |
||
| 210 | $name = get_term($tag)->name; |
||
| 211 | array_push($term_array, $name); |
||
| 212 | } |
||
| 213 | } |
||
| 214 | return $term_array; |
||
| 215 | } |
||
| 216 | |||
| 217 | /** |
||
| 218 | * Get product categories |
||
| 219 | * |
||
| 220 | * @param mixed $product Product to check |
||
| 221 | * @return array ['tag1', 'tag2', ...] simple array with associated categories |
||
| 222 | */ |
||
| 223 | public static function get_product_categories($product) |
||
| 224 | { |
||
| 225 | $categories = get_the_terms($product->get_id(), 'product_cat'); |
||
| 226 | $term_array = array(); |
||
| 227 | foreach ($categories as $category) { |
||
| 228 | $name = get_term($category)->name; |
||
| 229 | $slug = get_term($category)->slug; |
||
| 230 | array_push($term_array, array( |
||
| 231 | "name" => $name, |
||
| 232 | "slug" => $slug |
||
| 233 | )); |
||
| 234 | } |
||
| 235 | return $term_array; |
||
| 236 | } |
||
| 237 | |||
| 238 | /** |
||
| 239 | * Get attributes from product |
||
| 240 | * |
||
| 241 | * @param mixed $product Product to check |
||
| 242 | * @return array ['pa_name' => ['value1', 'value2']] Array with key set to the product attribute internal name and values as array. returns false if not attributes found. |
||
| 243 | */ |
||
| 244 | public static function get_product_attributes($product) |
||
| 341 | } |
||
| 342 | |||
| 343 | /** |
||
| 344 | * Send WooCommerce products to Algolia |
||
| 345 | * |
||
| 346 | * @param Int $id Product to send to Algolia if we send only a single product |
||
| 347 | * @return void |
||
| 348 | */ |
||
| 349 | public static function send_products_to_algolia($id = '') |
||
| 496 | </div>'; |
||
| 497 | } |
||
| 498 | } |
||
| 499 | } |
||
| 500 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths