Linux server322.web-hosting.com 4.18.0-553.45.1.lve.el8.x86_64 #1 SMP Wed Mar 26 12:08:09 UTC 2025 x86_64
LiteSpeed
Server IP : 198.54.115.172 & Your IP : 216.73.216.179
Domains :
Cant Read [ /etc/named.conf ]
User : fourgwnl
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
home /
fourgwnl /
public_html /
backup /
wp-includes /
Delete
Unzip
Name
Size
Permission
Date
Action
ID3
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
IXR
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
Requests
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
SimplePie
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
Text
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
blocks
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
certificates
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
css
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
customize
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
fonts
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
images
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
js
[ DIR ]
dr-xr-xr-x
2019-12-13 11:03
pomo
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
random_compat
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
rest-api
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
sodium_compat
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
theme-compat
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
widgets
[ DIR ]
drwxr-xr-x
2024-01-15 10:46
.htaccess
148
B
-r--r--r--
2024-01-15 10:46
admin-bar.php
30.23
KB
-rw-r--r--
2019-09-19 00:20
atomlib.php
11.56
KB
-rw-r--r--
2019-09-03 10:11
author-template.php
16.6
KB
-rw-r--r--
2019-09-25 23:17
blocks.php
18.29
KB
-rw-r--r--
2019-12-13 11:03
bookmark-template.php
12.2
KB
-rw-r--r--
2019-09-03 10:11
bookmark.php
14.65
KB
-rw-r--r--
2019-09-17 05:25
cache.php
21.36
KB
-rw-r--r--
2020-04-29 23:18
canonical.php
28.23
KB
-rw-r--r--
2019-08-04 11:29
capabilities.php
33.29
KB
-rw-r--r--
2019-10-09 13:58
category-template.php
51.4
KB
-rw-r--r--
2019-10-09 13:58
category.php
12.09
KB
-rw-r--r--
2019-09-02 02:44
class-IXR.php
2.51
KB
-rw-r--r--
2016-09-01 02:01
class-feed.php
544
B
-rw-r--r--
2019-10-09 02:49
class-http.php
37.85
KB
-rw-r--r--
2019-10-13 03:35
class-json.php
42.37
KB
-rw-r--r--
2019-10-04 00:18
class-oembed.php
410
B
-rw-r--r--
2019-07-19 14:02
class-phpass.php
7.15
KB
-rw-r--r--
2015-10-07 09:15
class-phpmailer.php
145.11
KB
-rw-r--r--
2021-05-13 02:50
class-pop3.php
20.43
KB
-rw-r--r--
2019-08-04 05:51
class-requests.php
29.1
KB
-rw-r--r--
2019-09-24 03:42
class-simplepie.php
87.17
KB
-rw-r--r--
2016-06-06 12:54
class-smtp.php
39.96
KB
-rw-r--r--
2019-09-13 00:07
class-snoopy.php
36.9
KB
-rw-r--r--
2016-07-06 22:10
class-walker-category-dropdown.php
2.08
KB
-rw-r--r--
2017-12-01 09:41
class-walker-category.php
7.69
KB
-rw-r--r--
2019-10-07 00:36
class-walker-comment.php
13.36
KB
-rw-r--r--
2020-06-10 22:48
class-walker-nav-menu.php
8.47
KB
-rw-r--r--
2019-10-07 00:36
class-walker-page-dropdown.php
2.25
KB
-rw-r--r--
2019-09-03 10:11
class-walker-page.php
6.87
KB
-rw-r--r--
2019-10-07 00:36
class-wp-admin-bar.php
16.55
KB
-rw-r--r--
2019-09-15 21:16
class-wp-ajax-response.php
5.11
KB
-rw-r--r--
2019-07-25 10:18
class-wp-block-parser.php
14.86
KB
-rw-r--r--
2019-02-07 19:32
class-wp-block-styles-registry.php
4.55
KB
-rw-r--r--
2019-10-01 01:15
class-wp-block-type-registry.php
4.63
KB
-rw-r--r--
2019-09-03 10:11
class-wp-block-type.php
4.7
KB
-rw-r--r--
2018-12-18 04:30
class-wp-comment-query.php
43.47
KB
-rw-r--r--
2020-06-10 22:48
class-wp-comment.php
8.75
KB
-rw-r--r--
2018-02-26 06:52
class-wp-customize-control.php
24.47
KB
-rw-r--r--
2019-09-03 10:11
class-wp-customize-manager.php
198.49
KB
-rw-r--r--
2020-04-29 23:18
class-wp-customize-nav-menus.php
53.25
KB
-rw-r--r--
2019-09-27 06:02
class-wp-customize-panel.php
9.37
KB
-rw-r--r--
2019-09-15 20:57
class-wp-customize-section.php
9.93
KB
-rw-r--r--
2019-09-15 20:57
class-wp-customize-setting.php
27.53
KB
-rw-r--r--
2019-09-15 20:57
class-wp-customize-widgets.php
65.41
KB
-rw-r--r--
2019-09-15 20:57
class-wp-date-query.php
34.01
KB
-rw-r--r--
2019-09-03 10:11
class-wp-dependency.php
2.44
KB
-rw-r--r--
2019-10-09 13:58
class-wp-editor.php
66.62
KB
-rw-r--r--
2019-10-05 05:42
class-wp-embed.php
14.4
KB
-rw-r--r--
2019-07-03 09:12
class-wp-error.php
4.81
KB
-rw-r--r--
2019-01-10 09:12
class-wp-fatal-error-handler.php
7.25
KB
-rw-r--r--
2019-09-17 02:53
class-wp-feed-cache-transient.php
2.5
KB
-rw-r--r--
2017-12-01 09:41
class-wp-feed-cache.php
749
B
-rw-r--r--
2017-12-01 09:41
class-wp-hook.php
13.96
KB
-rw-r--r--
2019-09-15 21:15
class-wp-http-cookie.php
6.98
KB
-rw-r--r--
2019-08-05 17:26
class-wp-http-curl.php
12.04
KB
-rw-r--r--
2019-09-21 07:53
class-wp-http-encoding.php
6.39
KB
-rw-r--r--
2019-07-03 09:12
class-wp-http-ixr-client.php
3.25
KB
-rw-r--r--
2018-03-26 05:03
class-wp-http-proxy.php
5.93
KB
-rw-r--r--
2019-09-22 03:11
class-wp-http-requests-hooks.php
1.9
KB
-rw-r--r--
2019-07-05 11:15
class-wp-http-requests-response.php
4.24
KB
-rw-r--r--
2019-10-13 03:35
class-wp-http-response.php
2.88
KB
-rw-r--r--
2019-07-01 17:31
class-wp-http-streams.php
15.69
KB
-rw-r--r--
2019-09-03 10:11
class-wp-image-editor-gd.php
13.56
KB
-rw-r--r--
2019-08-26 07:51
class-wp-image-editor-imagick.php
23.09
KB
-rw-r--r--
2019-09-23 20:06
class-wp-image-editor.php
13.58
KB
-rw-r--r--
2019-09-21 03:51
class-wp-list-util.php
6.26
KB
-rw-r--r--
2019-07-03 09:12
class-wp-locale-switcher.php
4.9
KB
-rw-r--r--
2019-08-04 11:16
class-wp-locale.php
13.57
KB
-rw-r--r--
2019-09-21 07:32
class-wp-matchesmapregex.php
1.76
KB
-rw-r--r--
2018-02-26 06:52
class-wp-meta-query.php
27.19
KB
-rw-r--r--
2022-01-07 08:32
class-wp-metadata-lazyloader.php
5.26
KB
-rw-r--r--
2018-03-26 05:05
class-wp-network-query.php
17.94
KB
-rw-r--r--
2019-09-13 07:47
class-wp-network.php
12
KB
-rw-r--r--
2019-08-29 22:12
class-wp-oembed-controller.php
5.89
KB
-rw-r--r--
2019-07-19 14:02
class-wp-oembed.php
29.47
KB
-rw-r--r--
2019-12-13 11:03
class-wp-paused-extensions-storage.php
4.82
KB
-rw-r--r--
2019-03-22 07:23
class-wp-post-type.php
19.07
KB
-rw-r--r--
2019-10-08 23:13
class-wp-post.php
6.29
KB
-rw-r--r--
2019-03-16 07:25
class-wp-query.php
126.89
KB
-rw-r--r--
2020-04-29 23:18
class-wp-recovery-mode-cookie-service.php
6.31
KB
-rw-r--r--
2019-06-18 04:47
class-wp-recovery-mode-email-service.php
9.88
KB
-rw-r--r--
2019-09-24 05:57
class-wp-recovery-mode-key-service.php
4.18
KB
-rw-r--r--
2019-04-16 14:39
class-wp-recovery-mode-link-service.php
3.29
KB
-rw-r--r--
2019-04-16 14:39
class-wp-recovery-mode.php
11.09
KB
-rw-r--r--
2019-06-18 04:07
class-wp-rewrite.php
58.49
KB
-rw-r--r--
2019-09-15 21:17
class-wp-role.php
2.6
KB
-rw-r--r--
2018-03-26 05:03
class-wp-roles.php
8.11
KB
-rw-r--r--
2019-09-15 21:23
class-wp-session-tokens.php
7.26
KB
-rw-r--r--
2018-09-14 23:15
class-wp-simplepie-file.php
2.27
KB
-rw-r--r--
2017-12-01 09:41
class-wp-simplepie-sanitize-kses.php
1.73
KB
-rw-r--r--
2017-12-01 09:41
class-wp-site-query.php
27.86
KB
-rw-r--r--
2019-09-13 07:47
class-wp-site.php
7.19
KB
-rw-r--r--
2019-08-29 22:12
class-wp-tax-query.php
18.98
KB
-rw-r--r--
2022-01-07 08:32
class-wp-taxonomy.php
10.44
KB
-rw-r--r--
2019-08-04 10:58
class-wp-term-query.php
34.59
KB
-rw-r--r--
2019-08-24 01:35
class-wp-term.php
5.14
KB
-rw-r--r--
2018-02-26 06:52
class-wp-text-diff-renderer-inline.php
716
B
-rw-r--r--
2017-12-01 09:41
class-wp-text-diff-renderer-table.php
16.4
KB
-rw-r--r--
2019-08-04 01:16
class-wp-theme.php
48.96
KB
-rw-r--r--
2019-09-24 06:30
class-wp-user-meta-session-tokens.php
2.92
KB
-rw-r--r--
2019-01-09 15:34
class-wp-user-query.php
30.56
KB
-rw-r--r--
2019-09-18 01:13
class-wp-user-request.php
1.95
KB
-rw-r--r--
2019-06-11 09:24
class-wp-user.php
21.26
KB
-rw-r--r--
2019-10-09 13:58
class-wp-walker.php
12.42
KB
-rw-r--r--
2019-10-09 14:05
class-wp-widget-factory.php
2.79
KB
-rw-r--r--
2019-09-21 08:04
class-wp-widget.php
17.42
KB
-rw-r--r--
2019-07-03 09:12
class-wp-xmlrpc-server.php
205.15
KB
-rw-r--r--
2020-10-30 00:30
class-wp.php
23.98
KB
-rw-r--r--
2020-06-10 22:48
class.wp-dependencies.php
11.25
KB
-rw-r--r--
2019-07-03 09:12
class.wp-scripts.php
17.34
KB
-rw-r--r--
2019-09-24 12:26
class.wp-styles.php
10.29
KB
-rw-r--r--
2019-09-24 12:26
comment-template.php
89.49
KB
-rw-r--r--
2020-06-10 22:48
comment.php
114.11
KB
-rw-r--r--
2020-06-10 22:48
compat.php
11.48
KB
-rw-r--r--
2019-09-21 05:46
cron.php
31.69
KB
-rw-r--r--
2019-09-22 03:11
date.php
409
B
-rw-r--r--
2019-07-26 09:01
default-constants.php
9.88
KB
-rw-r--r--
2019-09-24 06:30
default-filters.php
25.29
KB
-rw-r--r--
2020-06-10 22:48
default-widgets.php
2.13
KB
-rw-r--r--
2017-09-25 15:58
deprecated.php
111.39
KB
-rw-r--r--
2019-09-25 23:17
embed-template.php
344
B
-rw-r--r--
2016-07-06 22:10
embed.php
46.21
KB
-rw-r--r--
2021-04-15 22:05
error-protection.php
3.31
KB
-rw-r--r--
2019-09-03 10:11
feed-atom-comments.php
5.28
KB
-rw-r--r--
2019-09-03 10:11
feed-atom.php
3.01
KB
-rw-r--r--
2019-04-19 02:38
feed-rdf.php
2.6
KB
-rw-r--r--
2019-04-19 02:38
feed-rss.php
1.16
KB
-rw-r--r--
2019-04-19 02:38
feed-rss2-comments.php
4.05
KB
-rw-r--r--
2019-09-03 10:11
feed-rss2.php
3.69
KB
-rw-r--r--
2019-04-19 02:38
feed.php
21.51
KB
-rw-r--r--
2019-12-19 00:30
formatting.php
290.82
KB
-rw-r--r--
2022-01-07 08:32
functions.php
222.6
KB
-rw-r--r--
2021-09-11 11:03
functions.wp-scripts.php
12.52
KB
-rw-r--r--
2019-09-26 07:53
functions.wp-styles.php
8.03
KB
-rw-r--r--
2018-12-20 13:12
general-template.php
148.89
KB
-rw-r--r--
2019-10-25 22:38
http.php
22.02
KB
-rw-r--r--
2019-10-15 00:57
kses.php
57.39
KB
-rw-r--r--
2019-12-13 11:03
l10n.php
51.84
KB
-rw-r--r--
2019-09-22 03:11
link-template.php
140.16
KB
-rw-r--r--
2019-12-13 11:03
load.php
42.28
KB
-rw-r--r--
2019-09-19 21:32
locale.php
162
B
-rw-r--r--
2019-10-09 02:49
media-template.php
56.34
KB
-rw-r--r--
2019-12-13 11:03
media.php
145.43
KB
-rw-r--r--
2020-04-29 23:18
meta.php
46.63
KB
-rw-r--r--
2020-10-30 00:30
ms-blogs.php
23.84
KB
-rw-r--r--
2019-09-24 03:06
ms-default-constants.php
4.67
KB
-rw-r--r--
2017-12-01 09:41
ms-default-filters.php
6.26
KB
-rw-r--r--
2019-01-08 19:18
ms-deprecated.php
20.84
KB
-rw-r--r--
2019-10-08 00:48
ms-files.php
2.59
KB
-rw-r--r--
2017-12-01 09:41
ms-functions.php
85.58
KB
-rw-r--r--
2019-10-01 10:16
ms-load.php
19.16
KB
-rw-r--r--
2019-09-22 03:11
ms-network.php
3.57
KB
-rw-r--r--
2019-01-08 19:45
ms-settings.php
4.04
KB
-rw-r--r--
2017-12-01 09:41
ms-site.php
42.06
KB
-rw-r--r--
2019-09-03 10:11
nav-menu-template.php
21.54
KB
-rw-r--r--
2019-09-15 21:01
nav-menu.php
40.33
KB
-rw-r--r--
2019-09-14 04:25
option.php
68.5
KB
-rw-r--r--
2019-12-13 11:03
pluggable-deprecated.php
6.12
KB
-rw-r--r--
2016-07-06 22:10
pluggable.php
97.44
KB
-rw-r--r--
2020-06-10 22:48
plugin.php
31.56
KB
-rw-r--r--
2019-10-22 09:41
post-formats.php
6.89
KB
-rw-r--r--
2019-08-04 10:49
post-template.php
61.32
KB
-rw-r--r--
2019-10-09 13:58
post-thumbnail-template.php
8.78
KB
-rw-r--r--
2019-08-04 11:29
post.php
236.87
KB
-rw-r--r--
2022-01-07 08:32
query.php
32.16
KB
-rw-r--r--
2019-09-03 10:11
registration-functions.php
202
B
-rw-r--r--
2019-10-09 02:49
registration.php
202
B
-rw-r--r--
2019-10-09 02:49
rest-api.php
45.47
KB
-rw-r--r--
2019-10-16 01:17
revision.php
21.18
KB
-rw-r--r--
2019-07-05 12:44
rewrite.php
17.61
KB
-rw-r--r--
2019-08-04 10:58
rss-functions.php
214
B
-rw-r--r--
2019-10-09 02:49
rss.php
22.66
KB
-rw-r--r--
2016-10-31 15:58
script-loader.php
110.89
KB
-rw-r--r--
2021-11-10 23:33
session.php
264
B
-rw-r--r--
2019-10-09 02:49
shortcodes.php
20.26
KB
-rw-r--r--
2019-10-16 05:06
spl-autoload-compat.php
443
B
-rw-r--r--
2019-07-15 14:41
taxonomy.php
154.26
KB
-rw-r--r--
2019-10-08 04:38
template-loader.php
2.79
KB
-rw-r--r--
2019-07-03 09:12
template.php
20.55
KB
-rw-r--r--
2019-10-05 07:49
theme.php
102.42
KB
-rw-r--r--
2019-10-11 04:37
update.php
24.97
KB
-rw-r--r--
2019-09-03 10:11
user.php
121
KB
-rw-r--r--
2020-04-29 23:18
vars.php
6.03
KB
-rw-r--r--
2019-07-26 08:15
version.php
762
B
-rw-r--r--
2022-01-07 08:32
widgets.php
57.35
KB
-rw-r--r--
2019-10-09 13:58
wlwmanifest.xml
1.02
KB
-rw-r--r--
2013-12-12 06:19
wp-db.php
101.4
KB
-rw-r--r--
2019-10-09 13:58
wp-diff.php
662
B
-rw-r--r--
2017-12-01 09:41
Save
Rename
<?php /** * Functions related to registering and parsing blocks. * * @package WordPress * @subpackage Blocks * @since 5.0.0 */ /** * Registers a block type. * * @since 5.0.0 * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a * complete WP_Block_Type instance. In case a WP_Block_Type * is provided, the $args parameter will be ignored. * @param array $args { * Optional. Array of block type arguments. Any arguments may be defined, however the * ones described below are supported by default. Default empty array. * * @type callable $render_callback Callback used to render blocks of this block type. * } * @return WP_Block_Type|false The registered block type on success, or false on failure. */ function register_block_type( $name, $args = array() ) { return WP_Block_Type_Registry::get_instance()->register( $name, $args ); } /** * Unregisters a block type. * * @since 5.0.0 * * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a * complete WP_Block_Type instance. * @return WP_Block_Type|false The unregistered block type on success, or false on failure. */ function unregister_block_type( $name ) { return WP_Block_Type_Registry::get_instance()->unregister( $name ); } /** * Determine whether a post or content string has blocks. * * This test optimizes for performance rather than strict accuracy, detecting * the pattern of a block but not validating its structure. For strict accuracy, * you should use the block parser on post content. * * @since 5.0.0 * @see parse_blocks() * * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post. * @return bool Whether the post has blocks. */ function has_blocks( $post = null ) { if ( ! is_string( $post ) ) { $wp_post = get_post( $post ); if ( $wp_post instanceof WP_Post ) { $post = $wp_post->post_content; } } return false !== strpos( (string) $post, '<!-- wp:' ); } /** * Determine whether a $post or a string contains a specific block type. * * This test optimizes for performance rather than strict accuracy, detecting * the block type exists but not validating its structure. For strict accuracy, * you should use the block parser on post content. * * @since 5.0.0 * @see parse_blocks() * * @param string $block_name Full Block type to look for. * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post. * @return bool Whether the post content contains the specified block. */ function has_block( $block_name, $post = null ) { if ( ! has_blocks( $post ) ) { return false; } if ( ! is_string( $post ) ) { $wp_post = get_post( $post ); if ( $wp_post instanceof WP_Post ) { $post = $wp_post->post_content; } } /* * Normalize block name to include namespace, if provided as non-namespaced. * This matches behavior for WordPress 5.0.0 - 5.3.0 in matching blocks by * their serialized names. */ if ( false === strpos( $block_name, '/' ) ) { $block_name = 'core/' . $block_name; } // Test for existence of block by its fully qualified name. $has_block = false !== strpos( $post, '<!-- wp:' . $block_name . ' ' ); if ( ! $has_block ) { /* * If the given block name would serialize to a different name, test for * existence by the serialized form. */ $serialized_block_name = strip_core_block_namespace( $block_name ); if ( $serialized_block_name !== $block_name ) { $has_block = false !== strpos( $post, '<!-- wp:' . $serialized_block_name . ' ' ); } } return $has_block; } /** * Returns an array of the names of all registered dynamic block types. * * @since 5.0.0 * * @return array Array of dynamic block names. */ function get_dynamic_block_names() { $dynamic_block_names = array(); $block_types = WP_Block_Type_Registry::get_instance()->get_all_registered(); foreach ( $block_types as $block_type ) { if ( $block_type->is_dynamic() ) { $dynamic_block_names[] = $block_type->name; } } return $dynamic_block_names; } /** * Given an array of attributes, returns a string in the serialized attributes * format prepared for post content. * * The serialized result is a JSON-encoded string, with unicode escape sequence * substitution for characters which might otherwise interfere with embedding * the result in an HTML comment. * * @since 5.3.1 * * @param array $attributes Attributes object. * @return string Serialized attributes. */ function serialize_block_attributes( $block_attributes ) { $encoded_attributes = json_encode( $block_attributes ); $encoded_attributes = preg_replace( '/--/', '\\u002d\\u002d', $encoded_attributes ); $encoded_attributes = preg_replace( '/</', '\\u003c', $encoded_attributes ); $encoded_attributes = preg_replace( '/>/', '\\u003e', $encoded_attributes ); $encoded_attributes = preg_replace( '/&/', '\\u0026', $encoded_attributes ); // Regex: /\\"/ $encoded_attributes = preg_replace( '/\\\\"/', '\\u0022', $encoded_attributes ); return $encoded_attributes; } /** * Returns the block name to use for serialization. This will remove the default * "core/" namespace from a block name. * * @since 5.3.1 * * @param string $block_name Original block name. * @return string Block name to use for serialization. */ function strip_core_block_namespace( $block_name = null ) { if ( is_string( $block_name ) && 0 === strpos( $block_name, 'core/' ) ) { return substr( $block_name, 5 ); } return $block_name; } /** * Returns the content of a block, including comment delimiters. * * @since 5.3.1 * * @param string $block_name Block name. * @param array $attributes Block attributes. * @param string $content Block save content. * @return string Comment-delimited block content. */ function get_comment_delimited_block_content( $block_name = null, $block_attributes, $block_content ) { if ( is_null( $block_name ) ) { return $block_content; } $serialized_block_name = strip_core_block_namespace( $block_name ); $serialized_attributes = empty( $block_attributes ) ? '' : serialize_block_attributes( $block_attributes ) . ' '; if ( empty( $block_content ) ) { return sprintf( '<!-- wp:%s %s/-->', $serialized_block_name, $serialized_attributes ); } return sprintf( '<!-- wp:%s %s-->%s<!-- /wp:%s -->', $serialized_block_name, $serialized_attributes, $block_content, $serialized_block_name ); } /** * Returns the content of a block, including comment delimiters, serializing all * attributes from the given parsed block. * * This should be used when preparing a block to be saved to post content. * Prefer `render_block` when preparing a block for display. Unlike * `render_block`, this does not evaluate a block's `render_callback`, and will * instead preserve the markup as parsed. * * @since 5.3.1 * * @param WP_Block_Parser_Block $block A single parsed block object. * @return string String of rendered HTML. */ function serialize_block( $block ) { $block_content = ''; $index = 0; foreach ( $block['innerContent'] as $chunk ) { $block_content .= is_string( $chunk ) ? $chunk : serialize_block( $block['innerBlocks'][ $index++ ] ); } if ( ! is_array( $block['attrs'] ) ) { $block['attrs'] = array(); } return get_comment_delimited_block_content( $block['blockName'], $block['attrs'], $block_content ); } /** * Returns a joined string of the aggregate serialization of the given parsed * blocks. * * @since 5.3.1 * * @param WP_Block_Parser_Block[] $blocks Parsed block objects. * @return string String of rendered HTML. */ function serialize_blocks( $blocks ) { return implode( '', array_map( 'serialize_block', $blocks ) ); } /** * Filters and sanitizes block content to remove non-allowable HTML from * parsed block attribute values. * * @since 5.3.1 * * @param string $text Text that may contain block content. * @param array[]|string $allowed_html An array of allowed HTML elements * and attributes, or a context name * such as 'post'. * @param string[] $allowed_protocols Array of allowed URL protocols. * @return string The filtered and sanitized content result. */ function filter_block_content( $text, $allowed_html = 'post', $allowed_protocols = array() ) { $result = ''; $blocks = parse_blocks( $text ); foreach ( $blocks as $block ) { $block = filter_block_kses( $block, $allowed_html, $allowed_protocols ); $result .= serialize_block( $block ); } return $result; } /** * Filters and sanitizes a parsed block to remove non-allowable HTML from block * attribute values. * * @since 5.3.1 * * @param WP_Block_Parser_Block $block The parsed block object. * @param array[]|string $allowed_html An array of allowed HTML * elements and attributes, or a * context name such as 'post'. * @param string[] $allowed_protocols Allowed URL protocols. * @return array The filtered and sanitized block object result. */ function filter_block_kses( $block, $allowed_html, $allowed_protocols = array() ) { $block['attrs'] = filter_block_kses_value( $block['attrs'], $allowed_html, $allowed_protocols ); if ( is_array( $block['innerBlocks'] ) ) { foreach ( $block['innerBlocks'] as $i => $inner_block ) { $block['innerBlocks'][ $i ] = filter_block_kses( $inner_block, $allowed_html, $allowed_protocols ); } } return $block; } /** * Filters and sanitizes a parsed block attribute value to remove non-allowable * HTML. * * @since 5.3.1 * * @param mixed $value The attribute value to filter. * @param array[]|string $allowed_html An array of allowed HTML elements * and attributes, or a context name * such as 'post'. * @param string[] $allowed_protocols Array of allowed URL protocols. * @return array The filtered and sanitized result. */ function filter_block_kses_value( $value, $allowed_html, $allowed_protocols = array() ) { if ( is_array( $value ) ) { foreach ( $value as $key => $inner_value ) { $filtered_key = filter_block_kses_value( $key, $allowed_html, $allowed_protocols ); $filtered_value = filter_block_kses_value( $inner_value, $allowed_html, $allowed_protocols ); if ( $filtered_key !== $key ) { unset( $value[ $key ] ); } $value[ $filtered_key ] = $filtered_value; } } elseif ( is_string( $value ) ) { return wp_kses( $value, $allowed_html, $allowed_protocols ); } return $value; } /** * Parses blocks out of a content string, and renders those appropriate for the excerpt. * * As the excerpt should be a small string of text relevant to the full post content, * this function renders the blocks that are most likely to contain such text. * * @since 5.0.0 * * @param string $content The content to parse. * @return string The parsed and filtered content. */ function excerpt_remove_blocks( $content ) { $allowed_inner_blocks = array( // Classic blocks have their blockName set to null. null, 'core/freeform', 'core/heading', 'core/html', 'core/list', 'core/media-text', 'core/paragraph', 'core/preformatted', 'core/pullquote', 'core/quote', 'core/table', 'core/verse', ); $allowed_blocks = array_merge( $allowed_inner_blocks, array( 'core/columns' ) ); /** * Filters the list of blocks that can contribute to the excerpt. * * If a dynamic block is added to this list, it must not generate another * excerpt, as this will cause an infinite loop to occur. * * @since 5.0.0 * * @param array $allowed_blocks The list of allowed blocks. */ $allowed_blocks = apply_filters( 'excerpt_allowed_blocks', $allowed_blocks ); $blocks = parse_blocks( $content ); $output = ''; foreach ( $blocks as $block ) { if ( in_array( $block['blockName'], $allowed_blocks, true ) ) { if ( ! empty( $block['innerBlocks'] ) ) { if ( 'core/columns' === $block['blockName'] ) { $output .= _excerpt_render_inner_columns_blocks( $block, $allowed_inner_blocks ); continue; } // Skip the block if it has disallowed or nested inner blocks. foreach ( $block['innerBlocks'] as $inner_block ) { if ( ! in_array( $inner_block['blockName'], $allowed_inner_blocks, true ) || ! empty( $inner_block['innerBlocks'] ) ) { continue 2; } } } $output .= render_block( $block ); } } return $output; } /** * Render inner blocks from the `core/columns` block for generating an excerpt. * * @since 5.2.0 * @access private * * @param array $columns The parsed columns block. * @param array $allowed_blocks The list of allowed inner blocks. * @return string The rendered inner blocks. */ function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) { $output = ''; foreach ( $columns['innerBlocks'] as $column ) { foreach ( $column['innerBlocks'] as $inner_block ) { if ( in_array( $inner_block['blockName'], $allowed_blocks, true ) && empty( $inner_block['innerBlocks'] ) ) { $output .= render_block( $inner_block ); } } } return $output; } /** * Renders a single block into a HTML string. * * @since 5.0.0 * * @global WP_Post $post The post to edit. * * @param array $block A single parsed block object. * @return string String of rendered HTML. */ function render_block( $block ) { global $post; /** * Allows render_block() to be shortcircuited, by returning a non-null value. * * @since 5.1.0 * * @param string|null $pre_render The pre-rendered content. Default null. * @param array $block The block being rendered. */ $pre_render = apply_filters( 'pre_render_block', null, $block ); if ( ! is_null( $pre_render ) ) { return $pre_render; } $source_block = $block; /** * Filters the block being rendered in render_block(), before it's processed. * * @since 5.1.0 * * @param array $block The block being rendered. * @param array $source_block An un-modified copy of $block, as it appeared in the source content. */ $block = apply_filters( 'render_block_data', $block, $source_block ); $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $is_dynamic = $block['blockName'] && null !== $block_type && $block_type->is_dynamic(); $block_content = ''; $index = 0; foreach ( $block['innerContent'] as $chunk ) { $block_content .= is_string( $chunk ) ? $chunk : render_block( $block['innerBlocks'][ $index++ ] ); } if ( ! is_array( $block['attrs'] ) ) { $block['attrs'] = array(); } if ( $is_dynamic ) { $global_post = $post; $block_content = $block_type->render( $block['attrs'], $block_content ); $post = $global_post; } /** * Filters the content of a single block. * * @since 5.0.0 * * @param string $block_content The block content about to be appended. * @param array $block The full block, including name and attributes. */ return apply_filters( 'render_block', $block_content, $block ); } /** * Parses blocks out of a content string. * * @since 5.0.0 * * @param string $content Post content. * @return array Array of parsed block objects. */ function parse_blocks( $content ) { /** * Filter to allow plugins to replace the server-side block parser * * @since 5.0.0 * * @param string $parser_class Name of block parser class. */ $parser_class = apply_filters( 'block_parser_class', 'WP_Block_Parser' ); $parser = new $parser_class(); return $parser->parse( $content ); } /** * Parses dynamic blocks out of `post_content` and re-renders them. * * @since 5.0.0 * * @param string $content Post content. * @return string Updated post content. */ function do_blocks( $content ) { $blocks = parse_blocks( $content ); $output = ''; foreach ( $blocks as $block ) { $output .= render_block( $block ); } // If there are blocks in this content, we shouldn't run wpautop() on it later. $priority = has_filter( 'the_content', 'wpautop' ); if ( false !== $priority && doing_filter( 'the_content' ) && has_blocks( $content ) ) { remove_filter( 'the_content', 'wpautop', $priority ); add_filter( 'the_content', '_restore_wpautop_hook', $priority + 1 ); } return $output; } /** * If do_blocks() needs to remove wpautop() from the `the_content` filter, this re-adds it afterwards, * for subsequent `the_content` usage. * * @access private * * @since 5.0.0 * * @param string $content The post content running through this filter. * @return string The unmodified content. */ function _restore_wpautop_hook( $content ) { $current_priority = has_filter( 'the_content', '_restore_wpautop_hook' ); add_filter( 'the_content', 'wpautop', $current_priority - 1 ); remove_filter( 'the_content', '_restore_wpautop_hook', $current_priority ); return $content; } /** * Returns the current version of the block format that the content string is using. * * If the string doesn't contain blocks, it returns 0. * * @since 5.0.0 * * @param string $content Content to test. * @return int The block format version is 1 if the content contains one or more blocks, 0 otherwise. */ function block_version( $content ) { return has_blocks( $content ) ? 1 : 0; } /** * Registers a new block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param array $style_properties Array containing the properties of the style name, label, style (name of the stylesheet to be enqueued), inline_style (string containing the CSS to be added). * * @return boolean True if the block style was registered with success and false otherwise. */ function register_block_style( $block_name, $style_properties ) { return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties ); } /** * Unregisters a block style. * * @since 5.3.0 * * @param string $block_name Block type name including namespace. * @param array $block_style_name Block style name. * * @return boolean True if the block style was unregistered with success and false otherwise. */ function unregister_block_style( $block_name, $block_style_name ) { return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name ); }