truncate_paths = [ wp_normalize_path( WP_CONTENT_DIR ), wp_normalize_path( ABSPATH ), 'wp-admin/', 'themes/', 'plugins/', ]; } /** * @param array|string $backtrace Backtrace input as produced by WP. * * @return array */ public function format( $backtrace ): array { if ( \is_string( $backtrace ) ) { $backtrace = explode( ', ', $backtrace ); } else { $backtrace = array_reverse( $backtrace ); } $backtrace = array_filter( $backtrace, [ $this, 'filter' ] ); $backtrace = array_map( [ $this, 'shorten_include' ], $backtrace ); // TODO compact redunant function sequences, such as transient into option calls. return $backtrace; } /** * @param string $item Backtrace item. * * @return bool Keep or drop. */ protected function filter( string $item ): bool { foreach ( self::$skip as $match ) { if ( false !== strpos( $item, $match ) ) { return false; } } return true; } /** * * @psalm-suppress PossiblyFalseOperand * * @param string $item Backtrace item. * * @return string */ protected function shorten_include( string $item ): string { if ( 0 === strpos( $item, 'include' ) || 0 === strpos( $item, 'require' ) ) { $path = substr( $item, strpos( $item, '(\'' ) + 2, - 2 ); $path = wp_normalize_path( $path ); $path = str_replace( $this->truncate_paths, '', $path ); if ( ':' === $path[1] ) { $path = substr( $path, 2 ); } $path = ltrim( $path, '/' ); return $path; } return $item; } }