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 '' . $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; } }