You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.0 KiB
PHP
153 lines
3.0 KiB
PHP
<?php
|
|
/**
|
|
* The Block Parser
|
|
*
|
|
* @since 0.9.0
|
|
* @package RankMath
|
|
* @subpackage RankMath\Schema
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Schema;
|
|
|
|
use RankMath\Helper;
|
|
use RankMath\Helpers\Str;
|
|
use RankMath\Traits\Hooker;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Block_Parser class.
|
|
*/
|
|
class Block_Parser {
|
|
|
|
use Hooker;
|
|
|
|
/**
|
|
* Holds the parsed blocks.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $blocks = [];
|
|
|
|
/**
|
|
* The Constructor.
|
|
*/
|
|
public function __construct() {
|
|
$this->action( 'rank_math/json_ld', 'parse', 8 );
|
|
}
|
|
|
|
/**
|
|
* Filter function to add Blocks data in schema.
|
|
*
|
|
* @param array $data Array of JSON-LD data.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function parse( $data ) {
|
|
if ( ! function_exists( 'parse_blocks' ) || ! is_singular() ) {
|
|
return $data;
|
|
}
|
|
|
|
$this->get_parsed_blocks();
|
|
foreach ( $this->blocks as $block_type => $blocks ) {
|
|
foreach ( $blocks as $block ) {
|
|
/**
|
|
* Filter: 'rank_math/schema/block/<block-type>' - Allows filtering graph output per block.
|
|
*
|
|
* @param array $data Array of JSON-LD data.
|
|
* @param array $block The block.
|
|
*/
|
|
$data = $this->do_filter( 'schema/block/' . $block_type, $data, $block );
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Parse the blocks and loop through them.
|
|
*/
|
|
private function get_parsed_blocks() {
|
|
$post = get_post();
|
|
$parsed_blocks = parse_blocks( $post->post_content );
|
|
|
|
/**
|
|
* Filter: 'rank_math/schema/block/before_filter'
|
|
*
|
|
* @param array $parsed_blocks Array of parsed blocks.
|
|
*/
|
|
$parsed_blocks = $this->do_filter( 'schema/block/before_filter', $parsed_blocks );
|
|
|
|
$this->filter_blocks( $parsed_blocks );
|
|
}
|
|
|
|
/**
|
|
* Filter blocks.
|
|
*
|
|
* @param array $blocks Blocks to filter.
|
|
*/
|
|
private function filter_blocks( $blocks ) {
|
|
foreach ( $blocks as $block ) {
|
|
if ( $this->is_nested_block( $block ) || ! $this->is_valid_block( $block ) ) {
|
|
continue;
|
|
}
|
|
|
|
$name = \str_replace( 'rank-math/', '', $block['blockName'] );
|
|
$name = strtolower( $name );
|
|
if ( ! isset( $this->blocks[ $name ] ) || ! is_array( $this->blocks[ $name ] ) ) {
|
|
$this->blocks[ $name ] = [];
|
|
}
|
|
|
|
$this->blocks[ $name ][] = $block;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Is nested block.
|
|
*
|
|
* @param array $block Block.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
private function is_nested_block( $block ) {
|
|
if ( empty( $block['blockName'] ) ) {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Filter: 'rank_math/schema/nested_blocks' - Allows filtering for nested blocks.
|
|
*
|
|
* @param array $data Array of JSON-LD data.
|
|
* @param array $block The block.
|
|
*/
|
|
$nested = $this->do_filter(
|
|
'schema/nested_blocks',
|
|
[
|
|
'core/group',
|
|
'core/columns',
|
|
'core/column',
|
|
]
|
|
);
|
|
|
|
if ( ! in_array( $block['blockName'], $nested, true ) ) {
|
|
return false;
|
|
}
|
|
|
|
$this->filter_blocks( $block['innerBlocks'] );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Is block valid.
|
|
*
|
|
* @param array $block Block.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
private function is_valid_block( $block ) {
|
|
return ! empty( $block['blockName'] ) && Str::starts_with( 'rank-math', $block['blockName'] );
|
|
}
|
|
}
|