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.
160 lines
3.7 KiB
PHP
160 lines
3.7 KiB
PHP
<?php
|
|
/**
|
|
* The TOC Block
|
|
*
|
|
* @since 1.0.104
|
|
* @package RankMath
|
|
* @subpackage RankMath\Schema
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\Schema;
|
|
|
|
use WP_Block_Type_Registry;
|
|
use RankMath\Helper;
|
|
use RankMath\Traits\Hooker;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* HowTo Block class.
|
|
*/
|
|
class Block_TOC extends Block {
|
|
|
|
use Hooker;
|
|
|
|
/**
|
|
* Block type name.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $block_type = 'rank-math/toc-block';
|
|
|
|
/**
|
|
* The single instance of the class.
|
|
*
|
|
* @var Block_TOC
|
|
*/
|
|
protected static $instance = null;
|
|
|
|
/**
|
|
* Retrieve main Block_TOC instance.
|
|
*
|
|
* Ensure only one instance is loaded or can be loaded.
|
|
*
|
|
* @return Block_TOC
|
|
*/
|
|
public static function get() {
|
|
if ( is_null( self::$instance ) && ! ( self::$instance instanceof Block_TOC ) ) {
|
|
self::$instance = new Block_TOC();
|
|
}
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* The Constructor.
|
|
*/
|
|
public function __construct() {
|
|
if ( WP_Block_Type_Registry::get_instance()->is_registered( $this->block_type ) ) {
|
|
return;
|
|
}
|
|
|
|
$this->filter( 'rank_math/schema/block/toc-block', 'add_graph', 10, 2 );
|
|
$this->filter( 'render_block_rank-math/toc-block', 'render_toc_block_content', 10, 2 );
|
|
$this->filter( 'rank_math/metabox/post/values', 'block_settings_metadata' );
|
|
register_block_type( RANK_MATH_PATH . 'includes/modules/schema/blocks/toc/block.json' );
|
|
}
|
|
|
|
/**
|
|
* Add meta data to use in the TOC block.
|
|
*
|
|
* @param array $values Aray of tabs.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function block_settings_metadata( $values ) {
|
|
$values['tocTitle'] = Helper::get_settings( 'general.toc_block_title' );
|
|
$values['tocExcludeHeadings'] = Helper::get_settings( 'general.toc_block_exclude_headings', [] );
|
|
$values['listStyle'] = Helper::get_settings( 'general.toc_block_list_style', 'ul' );
|
|
|
|
return $values;
|
|
}
|
|
|
|
/**
|
|
* Add default TOC title.
|
|
*
|
|
* @param string $block_content Block content.
|
|
* @param array $parsed_block The full block, including name and attributes.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function render_toc_block_content( $block_content, $parsed_block ) {
|
|
if ( isset( $parsed_block['attrs']['title'] ) ) {
|
|
return $block_content;
|
|
}
|
|
|
|
$title = Helper::get_settings( 'general.toc_block_title' );
|
|
if ( ! $title ) {
|
|
return $block_content;
|
|
}
|
|
|
|
$title_wrapper = $parsed_block['attrs']['titleWrapper'] ?? 'h2';
|
|
|
|
$block_content = preg_replace_callback(
|
|
'/(<div class=".*?wp-block-rank-math-toc-block.*?"\>)/i',
|
|
function( $value ) use ( $title, $block_content, $title_wrapper ) {
|
|
if ( ! isset( $value[0] ) ) {
|
|
return $block_content;
|
|
}
|
|
|
|
$value[0] = str_replace( '>', ' id="rank-math-toc">', $value[0] );
|
|
return $value[0] . '<' . tag_escape( $title_wrapper ) . '>' . esc_html( $title ) . '</' . tag_escape( $title_wrapper ) . '>';
|
|
},
|
|
$block_content
|
|
);
|
|
|
|
return str_replace( 'class=""', '', $block_content );
|
|
}
|
|
|
|
/**
|
|
* Add TOC schema data in JSON-LD array.
|
|
*
|
|
* @param array $data Array of JSON-LD data.
|
|
* @param array $block JsonLD Instance.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function add_graph( $data, $block ) {
|
|
$attributes = $block['attrs'];
|
|
// Early bail.
|
|
if ( empty( $attributes['headings'] ) ) {
|
|
return $data;
|
|
}
|
|
|
|
if ( ! isset( $data['toc'] ) ) {
|
|
$data['toc'] = [];
|
|
}
|
|
|
|
foreach ( $attributes['headings'] as $heading ) {
|
|
if ( ! empty( $heading['disable'] ) ) {
|
|
continue;
|
|
}
|
|
|
|
$data['toc'][] = [
|
|
'@context' => 'https://schema.org',
|
|
'@type' => 'SiteNavigationElement',
|
|
'@id' => '#rank-math-toc',
|
|
'name' => $heading['content'],
|
|
'url' => get_permalink() . $heading['link'],
|
|
];
|
|
}
|
|
|
|
if ( empty( $data['toc'] ) ) {
|
|
unset( $data['toc'] );
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|