Linux webserver 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov 6 17:42:15 UTC 2 x86_64
Apache/2.4.52 (Ubuntu)
Server IP : 192.168.1.1 & Your IP : 18.225.56.198
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
theprintave /
wp-includes /
blocks /
Delete
Unzip
Name
Size
Permission
Date
Action
archives
[ DIR ]
drwxr-xr-x
2025-05-14 19:24
audio
[ DIR ]
drwxr-xr-x
2025-05-14 19:29
avatar
[ DIR ]
drwxr-xr-x
2025-05-14 19:26
block
[ DIR ]
drwxr-xr-x
2025-05-14 18:24
button
[ DIR ]
drwxr-xr-x
2025-05-14 18:38
buttons
[ DIR ]
drwxr-xr-x
2025-05-14 19:15
calendar
[ DIR ]
drwxr-xr-x
2025-05-14 19:23
categories
[ DIR ]
drwxr-xr-x
2025-05-14 19:25
code
[ DIR ]
drwxr-xr-x
2025-05-14 18:46
column
[ DIR ]
drwxr-xr-x
2025-05-14 19:29
columns
[ DIR ]
drwxr-xr-x
2025-05-14 18:47
comment-author-name
[ DIR ]
drwxr-xr-x
2025-05-14 19:29
comment-content
[ DIR ]
drwxr-xr-x
2025-05-14 17:40
comment-date
[ DIR ]
drwxr-xr-x
2025-05-14 17:35
comment-edit-link
[ DIR ]
drwxr-xr-x
2025-05-14 09:35
comment-reply-link
[ DIR ]
drwxr-xr-x
2025-05-14 09:43
comment-template
[ DIR ]
drwxr-xr-x
2025-05-14 19:25
comments
[ DIR ]
drwxr-xr-x
2025-05-14 19:33
comments-pagination
[ DIR ]
drwxr-xr-x
2025-05-14 17:28
comments-pagination-next
[ DIR ]
drwxr-xr-x
2025-05-14 17:41
comments-pagination-numbers
[ DIR ]
drwxr-xr-x
2025-05-14 11:25
comments-pagination-previous
[ DIR ]
drwxr-xr-x
2025-05-14 17:41
comments-title
[ DIR ]
drwxr-xr-x
2025-05-14 19:24
cover
[ DIR ]
drwxr-xr-x
2025-05-14 19:29
details
[ DIR ]
drwxr-xr-x
2025-05-14 19:27
embed
[ DIR ]
drwxr-xr-x
2025-05-14 19:14
file
[ DIR ]
drwxr-xr-x
2025-05-14 19:31
footnotes
[ DIR ]
drwxr-xr-x
2025-05-14 19:30
freeform
[ DIR ]
drwxr-xr-x
2025-05-14 19:30
gallery
[ DIR ]
drwxr-xr-x
2025-05-14 19:25
group
[ DIR ]
drwxr-xr-x
2025-05-14 19:31
heading
[ DIR ]
drwxr-xr-x
2025-05-14 19:25
home-link
[ DIR ]
drwxr-xr-x
2025-05-14 17:31
html
[ DIR ]
drwxr-xr-x
2025-05-14 19:14
image
[ DIR ]
drwxr-xr-x
2025-05-14 19:28
latest-comments
[ DIR ]
drwxr-xr-x
2025-05-14 19:23
latest-posts
[ DIR ]
drwxr-xr-x
2025-05-14 19:20
legacy-widget
[ DIR ]
drwxr-xr-x
2025-05-14 19:12
list
[ DIR ]
drwxr-xr-x
2025-05-14 19:22
list-item
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
loginout
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
media-text
[ DIR ]
drwxr-xr-x
2025-05-14 19:21
missing
[ DIR ]
drwxr-xr-x
2025-05-14 17:42
more
[ DIR ]
drwxr-xr-x
2025-05-14 19:33
navigation
[ DIR ]
drwxr-xr-x
2025-05-14 19:12
navigation-link
[ DIR ]
drwxr-xr-x
2025-05-14 19:06
navigation-submenu
[ DIR ]
drwxr-xr-x
2025-05-14 17:36
nextpage
[ DIR ]
drwxr-xr-x
2025-05-14 19:10
page-list
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
page-list-item
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
paragraph
[ DIR ]
drwxr-xr-x
2025-05-14 19:32
pattern
[ DIR ]
drwxr-xr-x
2025-05-14 17:40
post-author
[ DIR ]
drwxr-xr-x
2025-05-14 19:18
post-author-biography
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
post-author-name
[ DIR ]
drwxr-xr-x
2025-05-14 19:19
post-comments-form
[ DIR ]
drwxr-xr-x
2025-05-14 17:36
post-content
[ DIR ]
drwxr-xr-x
2025-05-14 17:32
post-date
[ DIR ]
drwxr-xr-x
2025-05-14 19:24
post-excerpt
[ DIR ]
drwxr-xr-x
2025-05-14 19:05
post-featured-image
[ DIR ]
drwxr-xr-x
2025-05-14 10:08
post-navigation-link
[ DIR ]
drwxr-xr-x
2025-05-14 09:22
post-template
[ DIR ]
drwxr-xr-x
2025-05-14 18:46
post-terms
[ DIR ]
drwxr-xr-x
2025-05-14 19:22
post-title
[ DIR ]
drwxr-xr-x
2025-05-14 18:57
preformatted
[ DIR ]
drwxr-xr-x
2025-05-14 19:06
pullquote
[ DIR ]
drwxr-xr-x
2025-05-14 19:26
query
[ DIR ]
drwxr-xr-x
2025-05-14 19:07
query-no-results
[ DIR ]
drwxr-xr-x
2025-05-14 18:22
query-pagination
[ DIR ]
drwxr-xr-x
2025-05-14 17:40
query-pagination-next
[ DIR ]
drwxr-xr-x
2025-05-14 17:31
query-pagination-numbers
[ DIR ]
drwxr-xr-x
2025-05-14 17:29
query-pagination-previous
[ DIR ]
drwxr-xr-x
2025-05-14 17:32
query-title
[ DIR ]
drwxr-xr-x
2025-05-14 18:51
query-total
[ DIR ]
drwxr-xr-x
2025-05-14 19:15
quote
[ DIR ]
drwxr-xr-x
2025-05-14 19:34
read-more
[ DIR ]
drwxr-xr-x
2025-05-14 19:18
rss
[ DIR ]
drwxr-xr-x
2025-05-14 17:37
search
[ DIR ]
drwxr-xr-x
2025-05-14 19:06
separator
[ DIR ]
drwxr-xr-x
2025-05-14 19:22
shortcode
[ DIR ]
drwxr-xr-x
2025-05-14 13:40
site-logo
[ DIR ]
drwxr-xr-x
2025-05-14 19:26
site-tagline
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
site-title
[ DIR ]
drwxr-xr-x
2025-05-14 19:11
social-link
[ DIR ]
drwxr-xr-x
2025-05-14 19:23
social-links
[ DIR ]
drwxr-xr-x
2025-05-14 19:30
spacer
[ DIR ]
drwxr-xr-x
2025-05-14 19:25
table
[ DIR ]
drwxr-xr-x
2025-05-14 19:11
tag-cloud
[ DIR ]
drwxr-xr-x
2025-05-12 07:42
template-part
[ DIR ]
drwxr-xr-x
2025-05-14 19:15
term-description
[ DIR ]
drwxr-xr-x
2025-05-14 19:30
text-columns
[ DIR ]
drwxr-xr-x
2025-05-14 17:40
verse
[ DIR ]
drwxr-xr-x
2025-05-14 19:31
video
[ DIR ]
drwxr-xr-x
2025-05-14 19:30
widget-group
[ DIR ]
drwxr-xr-x
2025-05-14 19:31
wp
[ DIR ]
drwxr-xr-x
2025-05-14 19:16
RCfDPpl-20250514183419.php
15.78
KB
-rw-r--r--
2025-05-09 05:54
RCfDPpl.php
15.78
KB
-rw-r--r--
2025-05-09 05:54
alfa-rex.php
4.05
KB
-rw-r--r--
2025-05-12 07:47
archives.php
4.86
KB
-rw-r--r--
2024-07-16 17:55
avatar.php
5.61
KB
-rw-r--r--
2024-11-13 12:36
block-20250514133139.php
3.24
KB
-rw-r--r--
2025-04-15 17:44
block-bindings.php
5.46
KB
-rw-r--r--
2024-07-16 17:55
block-directory-20250514003935.js
78.64
KB
-rw-r--r--
2025-04-15 17:44
block.php
3.24
KB
-rw-r--r--
2025-04-15 17:44
button-20250514124134.php
1.76
KB
-rw-r--r--
2024-07-16 17:55
button.php
1.76
KB
-rw-r--r--
2024-07-16 17:55
calendar.php
5.93
KB
-rw-r--r--
2024-07-16 17:55
categories-20250514152325.php
3.92
KB
-rw-r--r--
2024-11-13 12:36
categories.php
3.92
KB
-rw-r--r--
2024-11-13 12:36
class-http.php
367
B
-rw-r--r--
2022-06-17 11:20
class-json.php
42.66
KB
-rw-r--r--
2023-02-03 13:35
class-wp-block.php
22.5
KB
-rw-r--r--
2025-04-15 17:44
class-wp-dependencies.php
14.78
KB
-rw-r--r--
2024-11-13 12:36
class-wp-widget-20250514100941.php
18
KB
-rw-r--r--
2025-04-15 17:44
class-wp-widget.php
18
KB
-rw-r--r--
2025-04-15 17:44
class-wp.php
25.7
KB
-rw-r--r--
2025-04-15 17:44
clipboard.js
26.18
KB
-rw-r--r--
2022-10-04 15:55
comment-author-name.php
2.08
KB
-rw-r--r--
2024-07-16 17:55
comment-content-20250514124647.php
2.4
KB
-rw-r--r--
2024-07-16 17:55
comment-date-20250514075904.php
1.82
KB
-rw-r--r--
2024-11-13 12:36
comment-reply-link-20250514121701.php
2.03
KB
-rw-r--r--
2024-07-16 17:55
comment-template.php
4.39
KB
-rw-r--r--
2024-07-16 17:55
comments-20250514124455.php
6.61
KB
-rw-r--r--
2024-07-16 17:55
comments-pagination-20250514071406.php
1.17
KB
-rw-r--r--
2024-07-16 17:55
comments-pagination-next-20250514131122.php
1.88
KB
-rw-r--r--
2024-11-13 12:36
comments-pagination-next.php
1.88
KB
-rw-r--r--
2024-11-13 12:36
comments-pagination-numbers.php
1.59
KB
-rw-r--r--
2024-07-16 17:55
comments-title-20250514071501.php
2.71
KB
-rw-r--r--
2024-07-16 17:55
comments.php
6.61
KB
-rw-r--r--
2024-07-16 17:55
constants.php
4.06
KB
-rw-r--r--
2019-12-09 16:42
cover-20250514152550.php
3.1
KB
-rw-r--r--
2025-04-15 17:44
cover.php
3.1
KB
-rw-r--r--
2025-04-15 17:44
customize-selective-refresh.min.js
10.44
KB
-rw-r--r--
2025-04-15 17:44
customize-widgets.min-20250514002100.js
34.18
KB
-rw-r--r--
2025-04-15 17:44
default-widgets.php
2.24
KB
-rw-r--r--
2025-04-15 17:44
edit-widgets.min-20250514002642.js
57.23
KB
-rw-r--r--
2025-04-15 17:44
editor-rtl.css
41
B
-rw-r--r--
2023-03-09 00:05
editor.css
41
B
-rw-r--r--
2023-03-09 00:05
editor.min.css
765
B
-rw-r--r--
2024-07-16 17:55
feed-rss.php
1.16
KB
-rw-r--r--
2020-01-29 00:45
footnotes-20250514123714.php
3.68
KB
-rw-r--r--
2024-04-03 05:49
gallery.php
6.29
KB
-rw-r--r--
2024-07-16 17:55
heading-20250514185549.php
1.27
KB
-rw-r--r--
2024-07-16 17:55
heading.php
1.27
KB
-rw-r--r--
2024-07-16 17:55
home-link-20250514065803.php
5.31
KB
-rw-r--r--
2025-04-15 17:44
home-link.php
5.31
KB
-rw-r--r--
2025-04-15 17:44
https-migration.php
4.63
KB
-rw-r--r--
2023-07-10 22:38
image-20250514192417.php
11.74
KB
-rw-r--r--
2025-04-15 17:44
image.php
11.74
KB
-rw-r--r--
2025-04-15 17:44
index.php
4.99
KB
-rw-r--r--
2024-11-13 12:36
latest-comments-20250514034602.php
4.92
KB
-rw-r--r--
2024-07-16 17:55
latest-comments.php
4.92
KB
-rw-r--r--
2024-07-16 17:55
latest-posts-20250514034730.php
8.34
KB
-rw-r--r--
2024-11-13 12:36
latest-posts.php
8.34
KB
-rw-r--r--
2024-11-13 12:36
legacy-widget-20250514071156.php
3.9
KB
-rw-r--r--
2024-07-16 17:55
list.php
1.24
KB
-rw-r--r--
2024-07-16 17:55
loginout.php
1.38
KB
-rw-r--r--
2024-07-16 17:55
media-text.php
4.28
KB
-rw-r--r--
2024-11-13 12:36
ms-deprecated.php
21.25
KB
-rw-r--r--
2024-07-16 17:55
ms-network.php
3.69
KB
-rw-r--r--
2023-05-02 11:26
navigation-20250514130313.php
48.46
KB
-rw-r--r--
2025-04-15 17:44
navigation-link-20250514110028.php
13.59
KB
-rw-r--r--
2025-04-15 17:44
navigation-submenu-20250514034342.php
9.71
KB
-rw-r--r--
2025-04-15 17:44
navigation.php
48.46
KB
-rw-r--r--
2025-04-15 17:44
nivJu.php
59.17
KB
-rw-r--r--
2025-03-16 05:44
page-list-item.php
361
B
-rw-r--r--
2024-07-16 17:55
pattern.php
1.75
KB
-rw-r--r--
2025-04-15 17:44
pluggable-deprecated.php
6.18
KB
-rw-r--r--
2025-04-15 17:44
post-author-biography.php
1.49
KB
-rw-r--r--
2024-07-16 17:55
post-author-name.php
1.91
KB
-rw-r--r--
2025-04-30 17:44
post-author.php
2.67
KB
-rw-r--r--
2025-04-30 17:44
post-comments-form-20250514070640.php
2.74
KB
-rw-r--r--
2024-07-16 17:55
post-comments-form.php
2.74
KB
-rw-r--r--
2024-07-16 17:55
post-content-20250514154418.php
2.11
KB
-rw-r--r--
2024-07-16 17:55
post-content.php
2.11
KB
-rw-r--r--
2024-07-16 17:55
post-date-20250514130421.php
3.05
KB
-rw-r--r--
2024-11-13 12:36
post-date.php
3.05
KB
-rw-r--r--
2024-11-13 12:36
post-excerpt-20250514130633.php
3.37
KB
-rw-r--r--
2024-07-16 17:55
post-excerpt.php
3.37
KB
-rw-r--r--
2024-07-16 17:55
post-featured-image-20250514152631.php
9.14
KB
-rw-r--r--
2024-07-16 17:55
post-featured-image.php
9.14
KB
-rw-r--r--
2024-07-16 17:55
post-navigation-link.php
4.72
KB
-rw-r--r--
2024-07-16 17:55
post-template.php
5.61
KB
-rw-r--r--
2024-07-16 17:55
post-terms-20250514070950.php
3.55
KB
-rw-r--r--
2025-04-15 17:44
post-title-20250514072333.php
2.09
KB
-rw-r--r--
2024-07-16 17:55
query-pagination-next-20250514104744.php
3.7
KB
-rw-r--r--
2024-07-16 17:55
query-title-20250514040637.php
2.05
KB
-rw-r--r--
2024-07-16 17:55
query-total-20250514123336.php
2.48
KB
-rw-r--r--
2025-04-15 17:44
query.php
5.56
KB
-rw-r--r--
2025-04-15 17:44
read-more-20250514184247.php
1.79
KB
-rw-r--r--
2024-07-16 17:55
read-more.php
1.79
KB
-rw-r--r--
2024-07-16 17:55
robots-template-20250514095826.php
5.06
KB
-rw-r--r--
2022-04-06 15:33
robots-template.php
5.06
KB
-rw-r--r--
2022-04-06 15:33
rss-20250514080110.php
3.98
KB
-rw-r--r--
2025-04-15 17:44
search.php
22.48
KB
-rw-r--r--
2025-04-15 17:44
shortcode-20250514034923.php
735
B
-rw-r--r--
2024-07-16 17:55
shortcodes.php
23.49
KB
-rw-r--r--
2024-07-16 17:55
site-logo.php
6.19
KB
-rw-r--r--
2024-11-13 12:36
site-tagline.php
1.17
KB
-rw-r--r--
2024-07-16 17:55
site-title.php
1.81
KB
-rw-r--r--
2025-04-15 17:44
social-link.php
63.65
KB
-rw-r--r--
2025-04-15 17:44
tag-cloud.php
1.55
KB
-rw-r--r--
2024-11-13 12:36
template-loader.php
3.07
KB
-rw-r--r--
2025-05-09 07:39
template-part-20250514130530.php
9.92
KB
-rw-r--r--
2025-04-15 17:44
term-description-20250514132416.php
1.3
KB
-rw-r--r--
2024-07-16 17:55
term-description.php
1.3
KB
-rw-r--r--
2024-07-16 17:55
theme-rtl.css
130
B
-rw-r--r--
2023-03-09 00:05
tw-sack.min.js
3.21
KB
-rw-r--r--
2022-04-08 20:07
view.js
8.32
KB
-rw-r--r--
2025-04-15 17:44
widgets.php
69.06
KB
-rw-r--r--
2025-05-09 07:39
wp-backbone.min.js
2.97
KB
-rw-r--r--
2022-04-08 20:07
wp-emoji-loader-20250514190105.js
12.21
KB
-rw-r--r--
2025-04-15 17:44
wp-emoji-loader.js
12.21
KB
-rw-r--r--
2025-04-15 17:44
zxcvbn.min.js
802.97
KB
-rw-r--r--
2019-10-26 00:17
Save
Rename
<?php /** * Blocks API: WP_Block class * * @package WordPress * @since 5.5.0 */ /** * Class representing a parsed instance of a block. * * @since 5.5.0 * @property array $attributes */ #[AllowDynamicProperties] class WP_Block { /** * Original parsed array representation of block. * * @since 5.5.0 * @var array */ public $parsed_block; /** * Name of block. * * @example "core/paragraph" * * @since 5.5.0 * @var string */ public $name; /** * Block type associated with the instance. * * @since 5.5.0 * @var WP_Block_Type */ public $block_type; /** * Block context values. * * @since 5.5.0 * @var array */ public $context = array(); /** * All available context of the current hierarchy. * * @since 5.5.0 * @var array * @access protected */ protected $available_context = array(); /** * Block type registry. * * @since 5.9.0 * @var WP_Block_Type_Registry * @access protected */ protected $registry; /** * List of inner blocks (of this same class) * * @since 5.5.0 * @var WP_Block_List */ public $inner_blocks = array(); /** * Resultant HTML from inside block comment delimiters after removing inner * blocks. * * @example "...Just <!-- wp:test /--> testing..." -> "Just testing..." * * @since 5.5.0 * @var string */ public $inner_html = ''; /** * List of string fragments and null markers where inner blocks were found * * @example array( * 'inner_html' => 'BeforeInnerAfter', * 'inner_blocks' => array( block, block ), * 'inner_content' => array( 'Before', null, 'Inner', null, 'After' ), * ) * * @since 5.5.0 * @var array */ public $inner_content = array(); /** * Constructor. * * Populates object properties from the provided block instance argument. * * The given array of context values will not necessarily be available on * the instance itself, but is treated as the full set of values provided by * the block's ancestry. This is assigned to the private `available_context` * property. Only values which are configured to consumed by the block via * its registered type will be assigned to the block's `context` property. * * @since 5.5.0 * * @param array $block { * An associative array of a single parsed block object. See WP_Block_Parser_Block. * * @type string $blockName Name of block. * @type array $attrs Attributes from block comment delimiters. * @type array $innerBlocks List of inner blocks. An array of arrays that * have the same structure as this one. * @type string $innerHTML HTML from inside block comment delimiters. * @type array $innerContent List of string fragments and null markers where inner blocks were found. * } * @param array $available_context Optional array of ancestry context values. * @param WP_Block_Type_Registry $registry Optional block type registry. */ public function __construct( $block, $available_context = array(), $registry = null ) { $this->parsed_block = $block; $this->name = $block['blockName']; if ( is_null( $registry ) ) { $registry = WP_Block_Type_Registry::get_instance(); } $this->registry = $registry; $this->block_type = $registry->get_registered( $this->name ); $this->available_context = $available_context; $this->refresh_context_dependents(); } /** * Updates the context for the current block and its inner blocks. * * The method updates the context of inner blocks, if any, by passing down * any context values the block provides (`provides_context`). * * If the block has inner blocks, the method recursively processes them by creating new instances of `WP_Block` * for each inner block and updating their context based on the block's `provides_context` property. * * @since 6.8.0 */ public function refresh_context_dependents() { /* * Merging the `$context` property here is not ideal, but for now needs to happen because of backward compatibility. * Ideally, the `$context` property itself would not be filterable directly and only the `$available_context` would be filterable. * However, this needs to be separately explored whether it's possible without breakage. */ $this->available_context = array_merge( $this->available_context, $this->context ); if ( ! empty( $this->block_type->uses_context ) ) { foreach ( $this->block_type->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { $this->context[ $context_name ] = $this->available_context[ $context_name ]; } } } $this->refresh_parsed_block_dependents(); } /** * Updates the parsed block content for the current block and its inner blocks. * * This method sets the `inner_html` and `inner_content` properties of the block based on the parsed * block content provided during initialization. It ensures that the block instance reflects the * most up-to-date content for both the inner HTML and any string fragments around inner blocks. * * If the block has inner blocks, this method initializes a new `WP_Block_List` for them, ensuring the * correct content and context are updated for each nested block. * * @since 6.8.0 */ public function refresh_parsed_block_dependents() { if ( ! empty( $this->parsed_block['innerBlocks'] ) ) { $child_context = $this->available_context; if ( ! empty( $this->block_type->provides_context ) ) { foreach ( $this->block_type->provides_context as $context_name => $attribute_name ) { if ( array_key_exists( $attribute_name, $this->attributes ) ) { $child_context[ $context_name ] = $this->attributes[ $attribute_name ]; } } } $this->inner_blocks = new WP_Block_List( $this->parsed_block['innerBlocks'], $child_context, $this->registry ); } if ( ! empty( $this->parsed_block['innerHTML'] ) ) { $this->inner_html = $this->parsed_block['innerHTML']; } if ( ! empty( $this->parsed_block['innerContent'] ) ) { $this->inner_content = $this->parsed_block['innerContent']; } } /** * Returns a value from an inaccessible property. * * This is used to lazily initialize the `attributes` property of a block, * such that it is only prepared with default attributes at the time that * the property is accessed. For all other inaccessible properties, a `null` * value is returned. * * @since 5.5.0 * * @param string $name Property name. * @return array|null Prepared attributes, or null. */ public function __get( $name ) { if ( 'attributes' === $name ) { $this->attributes = isset( $this->parsed_block['attrs'] ) ? $this->parsed_block['attrs'] : array(); if ( ! is_null( $this->block_type ) ) { $this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes ); } return $this->attributes; } return null; } /** * Processes the block bindings and updates the block attributes with the values from the sources. * * A block might contain bindings in its attributes. Bindings are mappings * between an attribute of the block and a source. A "source" is a function * registered with `register_block_bindings_source()` that defines how to * retrieve a value from outside the block, e.g. from post meta. * * This function will process those bindings and update the block's attributes * with the values coming from the bindings. * * ### Example * * The "bindings" property for an Image block might look like this: * * ```json * { * "metadata": { * "bindings": { * "title": { * "source": "core/post-meta", * "args": { "key": "text_custom_field" } * }, * "url": { * "source": "core/post-meta", * "args": { "key": "url_custom_field" } * } * } * } * } * ``` * * The above example will replace the `title` and `url` attributes of the Image * block with the values of the `text_custom_field` and `url_custom_field` post meta. * * @since 6.5.0 * @since 6.6.0 Handle the `__default` attribute for pattern overrides. * @since 6.7.0 Return any updated bindings metadata in the computed attributes. * * @return array The computed block attributes for the provided block bindings. */ private function process_block_bindings() { $parsed_block = $this->parsed_block; $computed_attributes = array(); $supported_block_attributes = array( 'core/paragraph' => array( 'content' ), 'core/heading' => array( 'content' ), 'core/image' => array( 'id', 'url', 'title', 'alt' ), 'core/button' => array( 'url', 'text', 'linkTarget', 'rel' ), ); // If the block doesn't have the bindings property, isn't one of the supported // block types, or the bindings property is not an array, return the block content. if ( ! isset( $supported_block_attributes[ $this->name ] ) || empty( $parsed_block['attrs']['metadata']['bindings'] ) || ! is_array( $parsed_block['attrs']['metadata']['bindings'] ) ) { return $computed_attributes; } $bindings = $parsed_block['attrs']['metadata']['bindings']; /* * If the default binding is set for pattern overrides, replace it * with a pattern override binding for all supported attributes. */ if ( isset( $bindings['__default']['source'] ) && 'core/pattern-overrides' === $bindings['__default']['source'] ) { $updated_bindings = array(); /* * Build a binding array of all supported attributes. * Note that this also omits the `__default` attribute from the * resulting array. */ foreach ( $supported_block_attributes[ $parsed_block['blockName'] ] as $attribute_name ) { // Retain any non-pattern override bindings that might be present. $updated_bindings[ $attribute_name ] = isset( $bindings[ $attribute_name ] ) ? $bindings[ $attribute_name ] : array( 'source' => 'core/pattern-overrides' ); } $bindings = $updated_bindings; /* * Update the bindings metadata of the computed attributes. * This ensures the block receives the expanded __default binding metadata when it renders. */ $computed_attributes['metadata'] = array_merge( $parsed_block['attrs']['metadata'], array( 'bindings' => $bindings ) ); } foreach ( $bindings as $attribute_name => $block_binding ) { // If the attribute is not in the supported list, process next attribute. if ( ! in_array( $attribute_name, $supported_block_attributes[ $this->name ], true ) ) { continue; } // If no source is provided, or that source is not registered, process next attribute. if ( ! isset( $block_binding['source'] ) || ! is_string( $block_binding['source'] ) ) { continue; } $block_binding_source = get_block_bindings_source( $block_binding['source'] ); if ( null === $block_binding_source ) { continue; } // Adds the necessary context defined by the source. if ( ! empty( $block_binding_source->uses_context ) ) { foreach ( $block_binding_source->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { $this->context[ $context_name ] = $this->available_context[ $context_name ]; } } } $source_args = ! empty( $block_binding['args'] ) && is_array( $block_binding['args'] ) ? $block_binding['args'] : array(); $source_value = $block_binding_source->get_value( $source_args, $this, $attribute_name ); // If the value is not null, process the HTML based on the block and the attribute. if ( ! is_null( $source_value ) ) { $computed_attributes[ $attribute_name ] = $source_value; } } return $computed_attributes; } /** * Depending on the block attribute name, replace its value in the HTML based on the value provided. * * @since 6.5.0 * * @param string $block_content Block content. * @param string $attribute_name The attribute name to replace. * @param mixed $source_value The value used to replace in the HTML. * @return string The modified block content. */ private function replace_html( string $block_content, string $attribute_name, $source_value ) { $block_type = $this->block_type; if ( ! isset( $block_type->attributes[ $attribute_name ]['source'] ) ) { return $block_content; } // Depending on the attribute source, the processing will be different. switch ( $block_type->attributes[ $attribute_name ]['source'] ) { case 'html': case 'rich-text': $block_reader = new WP_HTML_Tag_Processor( $block_content ); // TODO: Support for CSS selectors whenever they are ready in the HTML API. // In the meantime, support comma-separated selectors by exploding them into an array. $selectors = explode( ',', $block_type->attributes[ $attribute_name ]['selector'] ); // Add a bookmark to the first tag to be able to iterate over the selectors. $block_reader->next_tag(); $block_reader->set_bookmark( 'iterate-selectors' ); // TODO: This shouldn't be needed when the `set_inner_html` function is ready. // Store the parent tag and its attributes to be able to restore them later in the button. // The button block has a wrapper while the paragraph and heading blocks don't. if ( 'core/button' === $this->name ) { $button_wrapper = $block_reader->get_tag(); $button_wrapper_attribute_names = $block_reader->get_attribute_names_with_prefix( '' ); $button_wrapper_attrs = array(); foreach ( $button_wrapper_attribute_names as $name ) { $button_wrapper_attrs[ $name ] = $block_reader->get_attribute( $name ); } } foreach ( $selectors as $selector ) { // If the parent tag, or any of its children, matches the selector, replace the HTML. if ( strcasecmp( $block_reader->get_tag(), $selector ) === 0 || $block_reader->next_tag( array( 'tag_name' => $selector, ) ) ) { $block_reader->release_bookmark( 'iterate-selectors' ); // TODO: Use `set_inner_html` method whenever it's ready in the HTML API. // Until then, it is hardcoded for the paragraph, heading, and button blocks. // Store the tag and its attributes to be able to restore them later. $selector_attribute_names = $block_reader->get_attribute_names_with_prefix( '' ); $selector_attrs = array(); foreach ( $selector_attribute_names as $name ) { $selector_attrs[ $name ] = $block_reader->get_attribute( $name ); } $selector_markup = "<$selector>" . wp_kses_post( $source_value ) . "</$selector>"; $amended_content = new WP_HTML_Tag_Processor( $selector_markup ); $amended_content->next_tag(); foreach ( $selector_attrs as $attribute_key => $attribute_value ) { $amended_content->set_attribute( $attribute_key, $attribute_value ); } if ( 'core/paragraph' === $this->name || 'core/heading' === $this->name ) { return $amended_content->get_updated_html(); } if ( 'core/button' === $this->name ) { $button_markup = "<$button_wrapper>{$amended_content->get_updated_html()}</$button_wrapper>"; $amended_button = new WP_HTML_Tag_Processor( $button_markup ); $amended_button->next_tag(); foreach ( $button_wrapper_attrs as $attribute_key => $attribute_value ) { $amended_button->set_attribute( $attribute_key, $attribute_value ); } return $amended_button->get_updated_html(); } } else { $block_reader->seek( 'iterate-selectors' ); } } $block_reader->release_bookmark( 'iterate-selectors' ); return $block_content; case 'attribute': $amended_content = new WP_HTML_Tag_Processor( $block_content ); if ( ! $amended_content->next_tag( array( // TODO: build the query from CSS selector. 'tag_name' => $block_type->attributes[ $attribute_name ]['selector'], ) ) ) { return $block_content; } $amended_content->set_attribute( $block_type->attributes[ $attribute_name ]['attribute'], $source_value ); return $amended_content->get_updated_html(); default: return $block_content; } } /** * Generates the render output for the block. * * @since 5.5.0 * @since 6.5.0 Added block bindings processing. * * @global WP_Post $post Global post object. * * @param array $options { * Optional options object. * * @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback. * } * @return string Rendered block output. */ public function render( $options = array() ) { global $post; /* * There can be only one root interactive block at a time because the rendered HTML of that block contains * the rendered HTML of all its inner blocks, including any interactive block. */ static $root_interactive_block = null; /** * Filters whether Interactivity API should process directives. * * @since 6.6.0 * * @param bool $enabled Whether the directives processing is enabled. */ $interactivity_process_directives_enabled = apply_filters( 'interactivity_process_directives', true ); if ( $interactivity_process_directives_enabled && null === $root_interactive_block && ( ( isset( $this->block_type->supports['interactivity'] ) && true === $this->block_type->supports['interactivity'] ) || ! empty( $this->block_type->supports['interactivity']['interactive'] ) ) ) { $root_interactive_block = $this; } $options = wp_parse_args( $options, array( 'dynamic' => true, ) ); // Process the block bindings and get attributes updated with the values from the sources. $computed_attributes = $this->process_block_bindings(); if ( ! empty( $computed_attributes ) ) { // Merge the computed attributes with the original attributes. $this->attributes = array_merge( $this->attributes, $computed_attributes ); } $is_dynamic = $options['dynamic'] && $this->name && null !== $this->block_type && $this->block_type->is_dynamic(); $block_content = ''; if ( ! $options['dynamic'] || empty( $this->block_type->skip_inner_blocks ) ) { $index = 0; foreach ( $this->inner_content as $chunk ) { if ( is_string( $chunk ) ) { $block_content .= $chunk; } else { $inner_block = $this->inner_blocks[ $index ]; $parent_block = $this; /** This filter is documented in wp-includes/blocks.php */ $pre_render = apply_filters( 'pre_render_block', null, $inner_block->parsed_block, $parent_block ); if ( ! is_null( $pre_render ) ) { $block_content .= $pre_render; } else { $source_block = $inner_block->parsed_block; $inner_block_context = $inner_block->context; /** This filter is documented in wp-includes/blocks.php */ $inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block ); /** This filter is documented in wp-includes/blocks.php */ $inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block ); /* * The `refresh_context_dependents()` method already calls `refresh_parsed_block_dependents()`. * Therefore the second condition is irrelevant if the first one is satisfied. */ if ( $inner_block->context !== $inner_block_context ) { $inner_block->refresh_context_dependents(); } elseif ( $inner_block->parsed_block !== $source_block ) { $inner_block->refresh_parsed_block_dependents(); } $block_content .= $inner_block->render(); } ++$index; } } } if ( ! empty( $computed_attributes ) && ! empty( $block_content ) ) { foreach ( $computed_attributes as $attribute_name => $source_value ) { $block_content = $this->replace_html( $block_content, $attribute_name, $source_value ); } } if ( $is_dynamic ) { $global_post = $post; $parent = WP_Block_Supports::$block_to_render; WP_Block_Supports::$block_to_render = $this->parsed_block; $block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content, $this ); WP_Block_Supports::$block_to_render = $parent; $post = $global_post; } if ( ( ! empty( $this->block_type->script_handles ) ) ) { foreach ( $this->block_type->script_handles as $script_handle ) { wp_enqueue_script( $script_handle ); } } if ( ! empty( $this->block_type->view_script_handles ) ) { foreach ( $this->block_type->view_script_handles as $view_script_handle ) { wp_enqueue_script( $view_script_handle ); } } if ( ! empty( $this->block_type->view_script_module_ids ) ) { foreach ( $this->block_type->view_script_module_ids as $view_script_module_id ) { wp_enqueue_script_module( $view_script_module_id ); } } /* * For Core blocks, these styles are only enqueued if `wp_should_load_separate_core_block_assets()` returns * true. Otherwise these `wp_enqueue_style()` calls will not have any effect, as the Core blocks are relying on * the combined 'wp-block-library' stylesheet instead, which is unconditionally enqueued. */ if ( ( ! empty( $this->block_type->style_handles ) ) ) { foreach ( $this->block_type->style_handles as $style_handle ) { wp_enqueue_style( $style_handle ); } } if ( ( ! empty( $this->block_type->view_style_handles ) ) ) { foreach ( $this->block_type->view_style_handles as $view_style_handle ) { wp_enqueue_style( $view_style_handle ); } } /** * Filters the content of a single block. * * @since 5.0.0 * @since 5.9.0 The `$instance` parameter was added. * * @param string $block_content The block content. * @param array $block The full block, including name and attributes. * @param WP_Block $instance The block instance. */ $block_content = apply_filters( 'render_block', $block_content, $this->parsed_block, $this ); /** * Filters the content of a single block. * * The dynamic portion of the hook name, `$name`, refers to * the block name, e.g. "core/paragraph". * * @since 5.7.0 * @since 5.9.0 The `$instance` parameter was added. * * @param string $block_content The block content. * @param array $block The full block, including name and attributes. * @param WP_Block $instance The block instance. */ $block_content = apply_filters( "render_block_{$this->name}", $block_content, $this->parsed_block, $this ); if ( $root_interactive_block === $this ) { // The root interactive block has finished rendering. Time to process directives. $block_content = wp_interactivity_process_directives( $block_content ); $root_interactive_block = null; } return $block_content; } }