return $api->log_to_meta( $context ); } } } catch ( Throwable $e ) { unset( $e ); // Fall back to direct API client below. } } $access_token = self::get_reporting_access_token(); if ( '' === $access_token ) { return null; } try { $api = new Facebook_API( $access_token ); return $api->log_to_meta( $context ); } catch ( Throwable $e ) { unset( $e ); return null; } } /** * Extracts Meta API status code from a response object. * * @since 3.6.4 * * @param mixed $response API response object. * @return int */ private static function extract_meta_error_status_code( $response ) { if ( is_object( $response ) && method_exists( $response, 'get_api_error_code' ) ) { return (int) $response->get_api_error_code(); } return 0; } /** * Logs local diagnostics without relying on a fully initialized plugin instance. * * @since 3.6.4 * * @param string $message message to log. */ private static function log_local_error( $message ) { if ( function_exists( 'facebook_for_woocommerce' ) ) { try { Logger::log( (string) $message, [], array( 'should_send_log_to_meta' => false, 'should_save_log_in_woocommerce' => true, 'woocommerce_log_level' => \WC_Log_Levels::ERROR, ) ); return; } catch ( Throwable $e ) { unset( $e ); // Fall back to PHP error_log. } } error_log( 'Meta for WooCommerce crash reporting: ' . (string) $message ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log } /** * Gets access token for crash/reporting calls in disabled mode. * * @since 3.6.4 * * @return string */ private static function get_reporting_access_token() { $option_keys = [ 'wc_facebook_access_token', 'wc_facebook_merchant_access_token', ]; foreach ( $option_keys as $option_key ) { $token = get_option( $option_key, '' ); if ( is_string( $token ) && '' !== trim( $token ) ) { return trim( $token ); } } return ''; } /** * Checks whether Meta diagnosis reporting is enabled. * * Uses integration opt-in when available, with option fallback for disabled mode. * * @since 3.6.4 * * @return bool */ private static function is_meta_diagnosis_enabled_for_reporting() { $option_enabled = 'yes' === get_option( Logger::SETTING_ENABLE_META_DIAGNOSIS, 'no' ); if ( ! function_exists( 'facebook_for_woocommerce' ) ) { return $option_enabled; } try { $plugin = facebook_for_woocommerce(); if ( $plugin && method_exists( $plugin, 'get_integration' ) ) { $integration = $plugin->get_integration(); if ( $integration && method_exists( $integration, 'is_meta_diagnosis_enabled' ) ) { return (bool) $integration->is_meta_diagnosis_enabled(); } } } catch ( Throwable $e ) { unset( $e ); // Use option fallback below. } return $option_enabled; } /** * Utility method for sending exception logs to Meta. * * @since 3.5.0 * * @param Throwable $error error object. * @param array $context optional error message attributes. */ public static function log_exception_to_meta( Throwable $error, array $context = [] ) { $extra_data = WC_Facebookcommerce_Utils::get_context_data( $context, 'extra_data', [] ); $extra_data['php_version'] = phpversion(); $request_data = [ 'event' => WC_Facebookcommerce_Utils::get_context_data( $context, 'event', 'error_log' ), 'event_type' => WC_Facebookcommerce_Utils::get_context_data( $context, 'event_type' ), 'exception_message' => $error->getMessage(), 'exception_trace' => $error->getTraceAsString(), 'exception_code' => $error->getCode(), 'exception_class' => get_class( $error ), 'order_id' => WC_Facebookcommerce_Utils::get_context_data( $context, 'order_id' ), 'promotion_id' => WC_Facebookcommerce_Utils::get_context_data( $context, 'promotion_id' ), 'incoming_params' => WC_Facebookcommerce_Utils::get_context_data( $context, 'incoming_params' ), 'extra_data' => $extra_data, ]; if ( ! self::enqueue_meta_log_request( $request_data, true ) ) { Logger::log( 'Action Scheduler is not available or enqueue failed.', [], array( 'should_send_log_to_meta' => false, 'should_save_log_in_woocommerce' => true, 'woocommerce_log_level' => \WC_Log_Levels::DEBUG, ) ); } } }