balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

usage-reporter.php (2955B)


      1 <?php
      2 namespace Elementor\Modules\Usage;
      3 
      4 use Elementor\Modules\System_Info\Reporters\Base;
      5 
      6 if ( ! defined( 'ABSPATH' ) ) {
      7 	exit; // Exit if accessed directly.
      8 }
      9 
     10 /**
     11  * Elementor usage report.
     12  *
     13  * Elementor system report handler class responsible for generating a report for
     14  * the user.
     15  */
     16 class Usage_Reporter extends Base {
     17 
     18 	const RECALC_ACTION = 'elementor_usage_recalc';
     19 
     20 	public function get_title() {
     21 		$title = 'Elements Usage';
     22 
     23 		if ( 'html' === $this->_properties['format'] ) {
     24 			if ( empty( $_GET[ self::RECALC_ACTION ] ) ) { // phpcs:ignore -- nonce validation is not required here.
     25 				$nonce = wp_create_nonce( self::RECALC_ACTION );
     26 				$url = add_query_arg( [
     27 					self::RECALC_ACTION => 1,
     28 					'_wpnonce' => $nonce,
     29 				] );
     30 
     31 				$title .= '<a id="elementor-usage-recalc" href="' . esc_url( $url ) . '#elementor-usage-recalc" class="box-title-tool">Recalculate</a>';
     32 			} else {
     33 				$title .= $this->get_remove_recalc_query_string_script();
     34 			}
     35 		}
     36 
     37 		return $title;
     38 	}
     39 
     40 	public function get_fields() {
     41 		return [
     42 			'usage' => '',
     43 		];
     44 	}
     45 
     46 	public function get_usage() {
     47 		/** @var Module $module */
     48 		$module = Module::instance();
     49 
     50 		if ( ! empty( $_GET[ self::RECALC_ACTION ] ) ) {
     51 			if ( empty( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], self::RECALC_ACTION ) ) {
     52 				wp_die( 'Invalid Nonce', 'Invalid Nonce', [
     53 					'back_link' => true,
     54 				] );
     55 			}
     56 
     57 			$module->recalc_usage();
     58 		}
     59 
     60 		$usage = '';
     61 
     62 		foreach ( $module->get_formatted_usage() as $doc_type => $data ) {
     63 			$usage .= '<tr><td>' . $data['title'] . ' ( ' . $data['count'] . ' )</td><td>';
     64 
     65 			foreach ( $data['elements'] as $element => $count ) {
     66 				$usage .= $element . ': ' . $count . PHP_EOL;
     67 			}
     68 
     69 			$usage .= '</td></tr>';
     70 		}
     71 
     72 		return [
     73 			'value' => $usage,
     74 		];
     75 	}
     76 
     77 	public function get_raw_usage() {
     78 		/** @var Module $module */
     79 		$module = Module::instance();
     80 		$usage = PHP_EOL;
     81 
     82 		foreach ( $module->get_formatted_usage( 'raw' ) as $doc_type => $data ) {
     83 			$usage .= "\t{$data['title']} : " . $data['count'] . PHP_EOL;
     84 
     85 			foreach ( $data['elements'] as $element => $count ) {
     86 				$usage .= "\t\t{$element} : {$count}" . PHP_EOL;
     87 			}
     88 		}
     89 
     90 		return [
     91 			'value' => $usage,
     92 		];
     93 	}
     94 
     95 	/**
     96 	 * Removes the "elementor_usage_recalc" param from the query string to avoid recalc every refresh.
     97 	 * When using a redirect header in place of this approach it throws an error because some components have already output some content.
     98 	 *
     99 	 * @return string
    100 	 */
    101 	private function get_remove_recalc_query_string_script() {
    102 		ob_start();
    103 		?>
    104 		<script>
    105 			// Origin file: modules/usage/usage-reporter.php - get_remove_recalc_query_string_script()
    106 			{
    107 				const url = new URL( window.location );
    108 
    109 				url.hash = '';
    110 				url.searchParams.delete( 'elementor_usage_recalc' );
    111 				url.searchParams.delete( '_wpnonce' );
    112 
    113 				history.replaceState( '', window.title, url.toString() );
    114 			}
    115 		</script>
    116 		<?php
    117 
    118 		return ob_get_clean();
    119 	}
    120 }