You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
2.6 KiB
111 lines
2.6 KiB
<?php |
|
/** |
|
* WPSEO plugin file. |
|
* |
|
* @package WPSEO\Frontend\Schema |
|
*/ |
|
|
|
/** |
|
* Returns schema FAQ data. |
|
* |
|
* @since 11.3 |
|
*/ |
|
class WPSEO_Schema_FAQ implements WPSEO_Graph_Piece { |
|
|
|
/** |
|
* Determine whether this graph piece is needed or not. |
|
* |
|
* @var bool |
|
*/ |
|
private $is_needed = false; |
|
|
|
/** |
|
* The FAQ blocks on the current page. |
|
* |
|
* @var array |
|
*/ |
|
private $blocks; |
|
|
|
/** |
|
* A value object with context variables. |
|
* |
|
* @var WPSEO_Schema_Context |
|
*/ |
|
private $context; |
|
|
|
/** |
|
* WPSEO_Schema_FAQ constructor. |
|
* |
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
|
*/ |
|
public function __construct( WPSEO_Schema_Context $context ) { |
|
$this->context = $context; |
|
|
|
add_action( 'wpseo_pre_schema_block_type_yoast/faq-block', array( $this, 'prepare_schema' ), 10, 1 ); |
|
add_filter( 'wpseo_schema_block_yoast/faq-block', array( $this, 'render_schema_questions' ), 10, 3 ); |
|
} |
|
|
|
/** |
|
* If this fires, we know there's an FAQ block ont he page, so filter the page type. |
|
* |
|
* @param array $blocks The blocks of this type on the current page. |
|
*/ |
|
public function prepare_schema( $blocks ) { |
|
$this->blocks = $blocks; |
|
$this->is_needed = true; |
|
add_filter( 'wpseo_schema_webpage_type', array( $this, 'change_schema_page_type' ) ); |
|
} |
|
|
|
/** |
|
* Change the page type to an array if it isn't one, include FAQPage. |
|
* |
|
* @param array|string $page_type The page type. |
|
* |
|
* @return array $page_type The page type that's now an array. |
|
*/ |
|
public function change_schema_page_type( $page_type ) { |
|
if ( ! is_array( $page_type ) ) { |
|
$page_type = array( $page_type ); |
|
} |
|
$page_type[] = 'FAQPage'; |
|
|
|
return $page_type; |
|
} |
|
|
|
/** |
|
* Render a list of questions, referencing them by ID. |
|
* |
|
* @return array $data Our Schema graph. |
|
*/ |
|
public function generate() { |
|
$question_list = new WPSEO_Schema_FAQ_Question_List( $this->blocks, $this->context ); |
|
$graph = $question_list->generate(); |
|
|
|
return $graph; |
|
} |
|
|
|
/** |
|
* Add the Questions in our FAQ blocks as separate pieces to the graph. |
|
* |
|
* @param array $graph Schema data for the current page. |
|
* @param WP_Block_Parser_Block $block The block data array. |
|
* @param WPSEO_Schema_Context $context A value object with context variables. |
|
* |
|
* @return array $data Our Schema graph. |
|
*/ |
|
public function render_schema_questions( $graph, $block, $context ) { |
|
$questions = new WPSEO_Schema_FAQ_Questions( $graph, $block, $context ); |
|
$graph = $questions->generate(); |
|
|
|
return $graph; |
|
} |
|
|
|
/** |
|
* Determines whether or not a piece should be added to the graph. |
|
* |
|
* @return bool |
|
*/ |
|
public function is_needed() { |
|
return $this->is_needed; |
|
} |
|
}
|
|
|