compatibility_tag_service = $this->_properties['fields']['compatibility_tag_service']; $this->plugin_label = $this->_properties['fields']['plugin_label']; $this->plugin_version = $this->_properties['fields']['plugin_version']; $this->plugins_to_check = $this->_properties['fields']['plugins_to_check']; } /** * The title of the report * * @return string */ public function get_title() { return $this->plugin_label . ' - Compatibility Tag'; } /** * Report fields * * @return string[] */ public function get_fields() { return [ 'report_data' => '', ]; } /** * Report data. * * @return string[] * @throws \Exception */ public function get_report_data() { $compatibility_status = $this->compatibility_tag_service->check( $this->plugin_version, $this->plugins_to_check ); if ( 'html' === $this->_properties['format'] ) { $compatibility_status = $this->get_html_from_compatibility_status( $compatibility_status ); } elseif ( 'raw' === $this->_properties['format'] ) { $compatibility_status = $this->get_raw_from_compatibility_status( $compatibility_status ); } return [ 'value' => $compatibility_status, ]; } /** * Merge compatibility status with the plugins data. * * @param array $compatibility_status * * @return Collection */ private function merge_compatibility_status_with_plugins( array $compatibility_status ) { $labels = $this->get_report_labels(); $compatibility_status = ( new Collection( $compatibility_status ) ) ->map( function ( $value ) use ( $labels ) { $status = isset( $labels[ $value ] ) ? $labels[ $value ] : __( 'Unknown', 'elementor' ); return [ 'compatibility_status' => $status ]; } ); return Plugin::$instance->wp ->get_plugins() ->only( $compatibility_status->keys() ) ->merge_recursive( $compatibility_status ); } /** * Format compatibility status into HTML. * * @param array $compatibility_status * * @return string */ private function get_html_from_compatibility_status( array $compatibility_status ) { return $this->merge_compatibility_status_with_plugins( $compatibility_status ) ->map( function ( array $plugin ) { return " {$plugin['Name']} {$plugin['compatibility_status']} "; } ) ->implode( '' ); } /** * Format compatibility status into raw string. * * @param array $compatibility_status * * @return string */ private function get_raw_from_compatibility_status( array $compatibility_status ) { return PHP_EOL . $this->merge_compatibility_status_with_plugins( $compatibility_status ) ->map( function ( array $plugin ) { return "\t{$plugin['Name']}: {$plugin['compatibility_status']}"; } ) ->implode( PHP_EOL ); } /** * @return array */ private function get_report_labels() { return [ Compatibility_Tag::COMPATIBLE => __( 'Compatible', 'elementor' ), Compatibility_Tag::INCOMPATIBLE => __( 'Incompatible', 'elementor' ), Compatibility_Tag::HEADER_NOT_EXISTS => __( 'Compatibility not specified', 'elementor' ), Compatibility_Tag::INVALID_VERSION => __( 'Compatibility unknown', 'elementor' ), Compatibility_Tag::PLUGIN_NOT_EXISTS => __( 'Error', 'elementor' ), ]; } }