function cev_find_empty_variations() { global $wpdb; // Перевірка прав доступу if (!current_user_can('manage_woocommerce')) { return array( 'success' => false, 'message' => 'Недостатньо прав доступу.' ); } // Оптимізований SQL-запит для пошуку всіх варіацій $variations = $wpdb->get_results(" SELECT ID, post_title, post_parent FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status = 'publish' LIMIT 5000 "); if (empty($variations)) { return array( 'success' => true, 'message' => 'Варіацій не знайдено.', 'variations' => array() ); } $problematic_variations = array(); // Перевірка кожної варіації на порожні атрибути foreach ($variations as $variation) { $parent_id = $variation->post_parent; $variation_id = $variation->ID; // Отримуємо батьківський товар $parent_product = wc_get_product($parent_id); if (!$parent_product || !$parent_product->is_type('variable')) { continue; } // Отримуємо варіацію $variation_product = wc_get_product($variation_id); if (!$variation_product) { continue; } // Додатковий метод пошуку порожніх варіацій через мета-дані $meta_attributes = get_post_meta($variation_id); $has_empty_attribute = false; $empty_attributes = array(); // Перевіряємо метадані атрибутів варіації foreach ($meta_attributes as $meta_key => $meta_value) { if (strpos($meta_key, 'attribute_') === 0) { $meta_value = $meta_value[0]; // Отримуємо значення з масиву // Перевіряємо, чи є атрибут порожнім, "any" або "Будь який" if (empty($meta_value) || $meta_value === 'any' || strpos($meta_value, 'Будь який') !== false) { $has_empty_attribute = true; $empty_attributes[] = $meta_key; } } } if (!$has_empty_attribute) { // Перевіряємо атрибути через API варіації $attributes = $variation_product->get_attributes(); if (empty($attributes) && !empty($parent_product->get_attributes())) { // Варіація без атрибутів, але батьківський товар має атрибути $has_empty_attribute = true; } else { // Перевіряємо кожен атрибут foreach ($attributes as $attribute_name => $attribute_value) { if (empty($attribute_value) || $attribute_value === 'any') { $has_empty_attribute = true; $empty_attributes[] = $attribute_name; } } } } if ($has_empty_attribute) { $problematic_variations[] = array( 'id' => $variation_id, 'title' => $variation->post_title, 'parent_id' => $parent_id, 'parent_title' => $parent_product->get_name(), 'issue' => 'Порожні атрибути ("Будь-який розмір")', 'empty_attributes' => $empty_attributes ); } } return array( 'success' => true, 'message' => 'Знайдено ' . count($problematic_variations) . ' варіацій з порожніми атрибутами.', 'variations' => $problematic_variations, 'total' => count($variations) ); }