| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <?php
- /**
- * WPSEO plugin file.
- *
- * @package WPSEO\Structured_Data_Blocks
- */
- /**
- * Class WPSEO_FAQ_Block
- */
- class WPSEO_FAQ_Block implements WPSEO_WordPress_Integration {
- /**
- * Registers the how-to block as a server-side rendered block.
- *
- * @return void
- */
- public function register_hooks() {
- if ( ! function_exists( 'register_block_type' ) ) {
- return;
- }
- register_block_type( 'yoast/faq-block', array(
- 'render_callback' => array( $this, 'render' ),
- ) );
- }
- /**
- * Renders the block.
- *
- * Because we can't save script tags in Gutenberg without sufficient user permissions, we render these server-side.
- *
- * @param array $attributes The attributes of the block.
- * @param string $content The HTML content of the block.
- *
- * @return string The block preceded by its JSON-LD script.
- */
- public function render( $attributes, $content ) {
- if ( ! is_array( $attributes ) || ! is_singular() ) {
- return $content;
- }
- $json_ld = $this->get_json_ld( $attributes );
- return '<script type="application/ld+json">' . wp_json_encode( $json_ld ) . '</script>' . $content;
- }
- /**
- * Returns the JSON-LD for a FAQ block in array form.
- *
- * @param array $attributes The attributes of the FAQ block.
- *
- * @return array The JSON-LD representation of the FAQ block in array form.
- */
- protected function get_json_ld( array $attributes ) {
- $json_ld = array(
- '@context' => 'https://schema.org',
- '@type' => 'FAQPage',
- );
- $post_title = get_the_title();
- if ( ! empty( $post_title ) ) {
- $json_ld['name'] = $post_title;
- }
- if ( ! array_key_exists( 'questions', $attributes ) || ! is_array( $attributes['questions'] ) ) {
- return $json_ld;
- }
- $main_entity = array();
- $questions = array_filter( $attributes['questions'], 'is_array' );
- foreach ( $questions as $question ) {
- $main_entity[] = $this->get_question_json_ld( $question );
- }
- $json_ld['mainEntity'] = $main_entity;
- return $json_ld;
- }
- /**
- * Returns the JSON-LD for a question in a FAQ block in array form.
- *
- * @param array $question The attributes of a question in the FAQ block.
- *
- * @return array The JSON-LD representation of the question in a FAQ block in array form.
- */
- protected function get_question_json_ld( array $question ) {
- $json_ld = array(
- '@type' => 'Question',
- );
- if ( ! empty( $question['jsonQuestion'] ) ) {
- $json_ld['name'] = $question['jsonQuestion'];
- }
- if ( ! empty( $question['jsonAnswer'] ) ) {
- $json_ld['answerCount'] = 1;
- $json_ld['acceptedAnswer'] = array(
- '@type' => 'Answer',
- 'text' => $question['jsonAnswer'],
- );
- if ( ! empty( $question['jsonImageSrc'] ) ) {
- $json_ld['acceptedAnswer']['image'] = array(
- '@type' => 'ImageObject',
- 'contentUrl' => $question['jsonImageSrc'],
- );
- }
- }
- return $json_ld;
- }
- }
|