$user_id, 'description' => '3plnext Integration', 'permissions' => 'read_write', ); $result = \WC_API_Keys::create($data); if (empty($result) || empty($result['consumer_key']) || empty($result['consumer_secret'])) { return new WP_Error('threeplnext_key_create_failed', __('Failed to generate WooCommerce API keys.', '3plnext')); } return $result; } if (!function_exists('wc_api_hash')) { return new WP_Error('threeplnext_wc_missing', __('WooCommerce API helpers are unavailable.', '3plnext')); } $consumer_key = 'ck_' . wc_rand_hash(); $consumer_secret = 'cs_' . wc_rand_hash(); global $wpdb; $table = $wpdb->prefix . 'woocommerce_api_keys'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery -- No WP core/WooCommerce API exists to insert into the custom woocommerce_api_keys table. $inserted = $wpdb->insert( $table, array( 'user_id' => $user_id, 'description' => '3plnext Integration', 'permissions' => 'read_write', 'consumer_key' => wc_api_hash($consumer_key), 'consumer_secret' => $consumer_secret, 'truncated_key' => substr($consumer_key, -7), ), array('%d', '%s', '%s', '%s', '%s', '%s') ); if (!$inserted) { return new WP_Error('threeplnext_key_create_failed', __('Failed to insert WooCommerce API keys.', '3plnext')); } return array( 'key_id' => (int) $wpdb->insert_id, 'consumer_key' => $consumer_key, 'consumer_secret' => $consumer_secret, 'truncated_key' => substr($consumer_key, -7), ); } public static function delete_api_key(int $key_id): bool { if ($key_id <= 0) { return false; } if (class_exists('WC_API_Keys') && method_exists('WC_API_Keys', 'delete')) { \WC_API_Keys::delete($key_id); return true; } global $wpdb; $table = $wpdb->prefix . 'woocommerce_api_keys'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- No WP core/WooCommerce API exists to delete from the custom woocommerce_api_keys table; the table is not cached. $wpdb->delete($table, array('key_id' => $key_id), array('%d')); return true; } }