PluginProbe ʕ •ᴥ•ʔ
Media Cleaner: Clean your WordPress! / 7.2.5
Media Cleaner: Clean your WordPress! v7.2.5
7.2.6 7.2.5 7.2.4 7.2.3 7.2.2 7.2.1 7.2.0 7.1.1 7.1.0 7.0.9 7.0.8 trunk 3.6.8 3.6.9 3.7.0 3.8.0 3.9.0 4.0.0 4.0.2 4.0.4 4.0.6 4.0.7 4.1.0 4.2.0 4.2.2 4.2.3 4.2.4 4.2.5 4.4.0 4.4.2 4.4.4 4.4.6 4.4.7 4.4.8 4.5.0 4.5.4 4.5.6 4.5.7 4.5.8 4.6.2 4.6.3 4.8.0 4.8.4 5.0.0 5.0.1 5.1.0 5.1.1 5.1.3 5.2.0 5.2.1 5.2.4 5.4.0 5.4.1 5.4.2 5.4.3 5.4.4 5.4.5 5.4.6 5.4.9 5.5.0 5.5.1 5.5.2 5.5.3 5.5.4 5.5.7 5.5.8 5.6.1 5.6.2 5.6.3 5.6.4 6.0.1 6.0.2 6.0.3 6.0.4 6.0.5 6.0.6 6.0.7 6.0.8 6.0.9 6.1.2 6.1.3 6.1.4 6.1.5 6.1.6 6.1.7 6.1.8 6.1.9 6.2.0 6.2.1 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.2.8 6.3.0 6.3.1 6.3.2 6.3.4 6.3.5 6.3.7 6.3.8 6.3.9 6.4.0 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.4.7 6.4.8 6.4.9 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 6.5.5 6.5.6 6.5.7 6.5.8 6.5.9 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.6.6 6.6.7 6.6.8 6.6.9 6.7.0 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8.0 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.8.6 6.8.7 6.8.8 6.8.9 6.9.0 6.9.1 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.0.6 7.0.7
media-cleaner / classes / parsers / blocks.php
media-cleaner / classes / parsers Last commit date
attachments.php 6 years ago blocks.php 1 month ago common.php 4 months ago maxmegamenu.php 1 month ago meow_gallery.php 3 months ago metaslider.php 1 month ago my-calendar.php 1 month ago woocommerce.php 1 month ago wpseo.php 3 years ago
blocks.php
91 lines
1 <?php
2
3 // WordPress Block Editor (core blocks).
4 //
5 // Since WordPress 6.5, blocks can carry a background image through the block
6 // supports API. The image is kept in the block attributes only, and WordPress
7 // renders the background-image rule at display time, so the URL never appears
8 // in the saved HTML. Scanning the content alone therefore misses it, and the
9 // media looks unused. The attributes are read here instead.
10
11 add_action( 'wpmc_scan_post', 'wpmc_scan_post_blocks', 10, 2 );
12
13 function wpmc_scan_post_blocks( $html, $id ) {
14 global $wpmc;
15
16 if ( empty( $html ) || !is_string( $html ) ) {
17 return;
18 }
19
20 $ids = array();
21 $urls = array();
22
23 if ( strpos( $html, '<!-- wp:' ) !== false ) {
24 $blocks = parse_blocks( $html );
25 if ( is_array( $blocks ) ) {
26 wpmc_scan_blocks_recursively( $blocks, $ids, $urls );
27 }
28 }
29 else if ( get_post_type( $id ) === 'wp_global_styles' ) {
30 // The site-wide background set in the Site Editor is kept here as plain JSON,
31 // with no block markup at all, so nothing above ever sees it. The attributes
32 // are shaped the same, so the same walk finds it.
33 $styles = json_decode( $html, true );
34 if ( is_array( $styles ) ) {
35 wpmc_scan_block_attributes( $styles, $ids, $urls );
36 }
37 }
38
39 if ( !empty( $ids ) ) {
40 $wpmc->add_reference_id( array_values( array_unique( $ids ) ), 'Block Background (ID)', $id );
41 }
42 if ( !empty( $urls ) ) {
43 $wpmc->add_reference_url( array_values( array_unique( $urls ) ), 'Block Background (URL)', $id );
44 }
45 }
46
47 function wpmc_scan_blocks_recursively( $blocks, &$ids, &$urls, $depth = 0 ) {
48 if ( $depth > 32 || !is_array( $blocks ) ) {
49 return;
50 }
51 foreach ( $blocks as $block ) {
52 if ( !is_array( $block ) ) {
53 continue;
54 }
55 if ( !empty( $block['attrs'] ) && is_array( $block['attrs'] ) ) {
56 wpmc_scan_block_attributes( $block['attrs'], $ids, $urls );
57 }
58 // Background images are commonly set on nested blocks too.
59 if ( !empty( $block['innerBlocks'] ) ) {
60 wpmc_scan_blocks_recursively( $block['innerBlocks'], $ids, $urls, $depth + 1 );
61 }
62 }
63 }
64
65 function wpmc_scan_block_attributes( $attributes, &$ids, &$urls, $depth = 0 ) {
66 global $wpmc;
67
68 if ( $depth > 32 || !is_array( $attributes ) ) {
69 return;
70 }
71 foreach ( $attributes as $key => $value ) {
72 if ( $key === 'backgroundImage' && is_array( $value ) ) {
73 if ( !empty( $value['id'] ) && is_numeric( $value['id'] ) ) {
74 $ids[] = (int) $value['id'];
75 }
76 if ( !empty( $value['url'] ) && is_string( $value['url'] ) ) {
77 $url = $wpmc->clean_url( $value['url'] );
78 if ( !empty( $url ) ) {
79 $urls[] = $url;
80 }
81 }
82 continue;
83 }
84 if ( is_array( $value ) ) {
85 wpmc_scan_block_attributes( $value, $ids, $urls, $depth + 1 );
86 }
87 }
88 }
89
90 ?>
91