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;
 | 
						|
	}
 | 
						|
}
 |